已有140人关注
《C语言程序开发范例宝典》实例081双链表逆置
发表在C语言答疑区 2017-07-07
是否精华
版块置顶:

范例宝典中关于链表这块讲的真心不敢恭维,先说链表逆置这段:

stud *reverse(stud *head)

{

    stud *p,  *r,  *h;

    h = head->next;

    if (h && h->next)

    {

        p = h;

        r = p->next;

        p->next = NULL;

        while (r)

        {

            p = r;

            r = r->next;

            p->next = h;

            h->prior = p;

            h = p;

        }

        head->next = h;

        h->prior = head;

        return head;

    }

}

比较让人费解,虽然结果也对,但感觉不简洁啊,不如这样实现:

//单链表逆序改双链表逆置

stud *reverse1(stud *head)

 {

     stud *pf,*pb,*r;

     pf=head;

     pb=pf->next;


     while(pb!=NULL)

     {

            r=pb->next;//暂存pb的下一个节点

            pb->next=pf;//改变pf、pb之间的链接

pf->prior=pb;

            pf=pb;//pf、pb重新赋值,指向下一个需要改变节点位置对

            pb=r;

      }

     head->next=NULL;

     head=pf;

     return head;

}

另外:链表这块,关于链表插入、删除等操作,在子函数中都是这样传参的:(实例080链表删除)

void del (stud *p)   //删除链表的一个结点 {    p->next->prior=p->prior;//指针p的前驱    p->prior->next=p->next;//指针p的后继    free(p); }

要是删除的是尾结点怎么办?不报错吗?另外删除参数是stud *p,这样好吗?规范的写法应该是传指针的指针:

是这样吧?


分享到:
精彩评论 1
大米粥
学分:1330 LV8
TA的每日心情
伤心
2017-05-02 10:51:31
2017-07-10
沙发

void Delete(struct Student* pHead,int iIndex)             /*pHead表示头节点,iIndex表示要删除的节点下标*/

{

         int i;                                                                            /*控制循环变量*/

         struct Student* pTemp;                                           /*临时指针*/

         struct Student* pPre;                                                        /*表示要删除节点前的节点*/

         pTemp=pHead;                                                                 /*得到头节点*/

         pPre=pTemp;

 

         printf("----delete NO%d member----\n",iIndex); /*提示信息*/

         for(i=1;i<iIndex;i++)                                                 /*for循环使得pTemp指向要删除的节点*/

         {

                   pPre=pTemp;

                   pTemp=pTemp->pNext;

         }

         pPre->pNext=pTemp->pNext;                              /*连接删除节点两边的节点*/

         free(pTemp);                                                            /*释放掉要删除节点的内存空间*/

         iCount--;                                                                    /*减少链表中的元素个数*/

}

这是删除节点的代码

首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照