链表中p->next=head->next;语句解析

来源:互联网 发布:网络写手平台 编辑:程序博客网 时间:2024/05/21 13:55

在看到一些书上或者网上写的不管是单链表还是双向循环链表等,都会有p->next=q->next;或者p-next=head->next;

这里q是尾指针,head是头指针,p是指向新建结点的指针

该语句作用

这条语句的作用其实就是给新建结点找到它该有的位置

该语句在单链表下的头插法是必须存在的,而在双向循环下可有可无

1.单链表的头插法下p-next=head->next;
LinkList InsertList_head(LinkList head)//头插{    LinkList p;    int i;    head=(LinkList)malloc(sizeof(LNode));    head->next=NULL;    scanf("%d",&i);    while(i!=0)    {        p=(LinkList)malloc(sizeof(LNode));        //scanf("%d",&p->data);        p->data=i;        p->next=head->next;        head->next=p;        scanf("%d",&i);    }    return head;}

比如以上是单链表的头插法代码,假如将p->next=head->next;注释了,此时没有一条语句来确定p指向的新建结点是在前一结点之后的


2.双向循环链表p-next=head->next;
LinkList MCreatlist_last(LinkList head,Elemtype n)//尾插法    {        LinkList p;        LinkList q;//尾指针        int i;        head=(LinkList)malloc(sizeof(LNode));        head->next=head;        head->prior=head;        q=head;        for(i=0;i<n;i++)        {            p=(LinkList)malloc(sizeof(LNode));            scanf("%d",&p->data);            p->next=q->next;            p->prior=q;            q->next=p;            q=p;        }        head->prior=q;        return head;    }

可通过以下图来理解这条语句,任何链表都适用
这里写图片描述

当新建了新的结点后,该结点的位置是无法找到的,当p->next指向q->next时,即该新建结点指向q的下一个结点使得p实现了插入到该结点(也算是p找到了它的位置)

为什么说p->next=q->next;是可有可无的呢,因为其实是因为p->prior=q;这条语句也可有使得新建结点找到它的家,只是加了p->next=q->next;会更加完整,安全

原创粉丝点击