算法分析:
插入节点包括两个步骤:找到插入位置;插入节点
①找到新节点应该插在那个节点之前,还要找到该节点的前一个节点,以备插入之用。循环使得p1指向插入节点之后的节点,并使得指针变量p2指向p1的前一个结点。
②通过修改相关指针完成插入。修改p2所指节点next指针,使其指向新节点,p2->next=p0.
使得新节点的next指针指向p1所指节点,p0->next=p1。
还存在以下几种特殊情况。
①新节点插入第一个节点之前。令头指针head指向新节点,即head=p0。令新指针的next指针指向p1所指节点,即p0->next=p1.新节点成为第一个节点,原来的第一个节点成为第二个节点。
②新节点插入表尾节点之后。将最后一个节点的next指针指向新节点,即p1->next=p0。将新节点的next指针置为NULL,即p0->next=NULL。
③原链表为空。将新节点作为唯一节点插入链表,即head=p0,p0->next=NULL.
struct student* insert(struct student* head, struct student* stud)
{
struct student* p0, * p1, * p2;
p1 = head; //p1指向第一个节点
p0 = stud; //p0指向新节点
if (head == NULL) { //原链表为空
head = p0;
p0->next = NULL; //新节点作为第一个节点
}
else
{
while ((p0->num > p1->num) && p1->next != NULL) //新节点数据大于当前节点数据并且当前节点不是尾节点
{
p2 = p1; //p2后移一个节点
p1 = p1->next; //p1后移一个节点
}
if (p0->num <= p1->num) //新节点数据小于当前节点数据
//新节点插入到原来的第一个节点之前
{
if (head == p1)
head = p0;
else
p2->next = p0; //新节点插到p2所指节点之后
p0->next = p1; //新节点next指针指向当前节点
}
else
{
p1->next = p0;
p0->next = NULL; //新节点插到表尾节点之后
}
}
n = n + 1; //节点数加一
return(head);
}