在看到一些书上或者网上写的不管是单链表还是双向循环链表等,都会有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;会更加完整,安全