C++编程入门(二) 互动版

插入链表节点

我们现在的链表是学号递增的,要插入一个学生的操作抽象为函数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->idid

而指针q总是指向p的前一个节点。所以跳出循环之后,p指向第一个比插入节点学号大的节点,而q指向p的前一个节点。所以要将q的next指针指向插入节点,然后插入节点的next指针指向p,整个链表就串起来了。