插入链表节点
我们现在的链表是学号递增的,要插入一个学生的操作抽象为函数insertList,实现如下:
student \*insertList(student \*head, student \*ps)
{
if(head==NULL)
{
head=ps;
return head;
}
if(head->id>ps->id)
{
ps->next=head;
head=ps;
return head;
}
student \*p,\*q;
p=q=head;
while(p!=NULL&&p->id<ps->id)
{
q=p;
p=p->next;
}
q->next=ps;
ps->next=p;
return head;
}
情况1对应代码3到7行,情况2对应8到13行。这两个应该不难吧,情况1中,链表本来是空的,那么让head指向要插入的节点就可以了。情况2中,先让新插入节点的指针指向头节点,再让head指向新节点。注意顺序不能反,如果先让head指向新节点,那么怎么把新节点和其他的节点串起来呢?
情况3对应14到22行,比较麻烦啊。首先你要找到该插入那里,对应14到20行。找到之后就好办了,对应21到22行。这里看怎么找到,当然是用循环去找啊,要找到第一个学号比自己大的节点,应该插在这个节点前面。
代码里面用指针p不断的去循环链表的节点,并跟要插入的节点的学号对比,直到p指向节点的学号大于要插入节点的学号或者p指向最后一个节点,跳出循环。所以循环的条件一个是p!=NULL&&p->id
而指针q总是指向p的前一个节点。所以跳出循环之后,p指向第一个比插入节点学号大的节点,而q指向p的前一个节点。所以要将q的next指针指向插入节点,然后插入节点的next指针指向p,整个链表就串起来了。