1、排序后q节点指向p节点,在调解指向之前,我们要生涯原p的指向节点地点,即:p2=p1->next->next;
2、顺着这一步一步往下推,排序后图16中p1->next->next要指的是p2->next,以是p1->next->next=p2->next;
3、在图15中p2->next原是q发出来的指向,排序后图16中q的指向要变为指向p的,而原本p1->next是指向p的,以是p2->next=p1->next;
4、在图15中p1->next原是指向p的,排序后图16中p1->next要指向q,原本p1->next->next(即p2)是指向q的,以是p1->next=p2;
5、至此,我们完成了相邻两节点的次序互换。
6、下面的措施描写改造了一点就是记录了每次最后一次节点下沉的位置,这样我们不必每次都从新到尾的扫描,只必要扫描到记录点为止。 由于后头的都已经是排好序的了。
对链表举办冒泡排序的函数为:
/*
==========================
成果:冒泡排序(由小到大)
返回:指向链表表头的指针
==========================
*/
struct student *BubbleSort (struct student *head)
{
struct student *endpt; //节制轮回较量
struct student *p; //姑且指针变量
struct student *p1,*p2;
p1 = (struct student *) malloc (LEN);
p1->next = head; //留意领略:我们增进一个节点,放在第一个节点的前面,首要是为了便于较量。由于第一个节点没有前驱,我们不能互换地点
head = p1; //让head指向p1节点,排序完成后,我们再把p1节点开释掉
for (endpt = NULL; endpt != head; endpt = p) //团结第6点领略
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->num > p1->next->next->num) //假如前面的节点键值比后头节点的键值大,则互换
{
p2 = p1->next->next; //团结第1点领略
p1->next->next = p2->next; //团结第2点领略
p2->next = p1->next; //团结第3点领略
p1->next = p2; //团结第4点领略
p = p1->next->next; //团结第6点领略
}
}
}
p1 = head; //把p1的信息去掉
head = head->next; //让head指向排序后的第一个节点
free (p1); //开释p1
p1 = NULL; //p1置为NULL,担保不发生“野指针”,即地点不确定的指针变量
return head;
}
有序链表插入节点表示图:
---->[NULL](空有序链表)
head
图18:空有序链表(空有序链表好办理,直接让head指向它就是了。)
以下接头不为空的有序链表。
---->[1]---->[2]---->[3]...---->[n]---->[NULL](有序链表)
head 1->next 2->next 3->next n->next
图18:有N个节点的有序链表
插入node节点的位置有两种环境:一是第一个节点前,二是其余节点前或后。
---->[node]---->[1]---->[2]---->[3]...---->[n]---->[NULL]
head node->next 1->next 2->next 3->next n->next
图19:node节点插在第一个节点前
---->[1]---->[2]---->[3]...---->[node]...---->[n]---->[NULL]
head 1->next 2->next 3->next node->next n->next
插入有序链表的函数为:
/*
==========================
成果:插入有序链表的某个节点的后头(从小到大)
返回:指向链表表头的指针
==========================
*/ (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|