单向链表的反序图示:
---->[1]---->[2]---->[3]...---->[n]---->[NULL](原链表)
head 1->next 2->next 3->next n->next
[NULL]<----[1]<----[2]<----[3]<----...[n]<----(反序后的链表)
1->next 2->next 3->next n->next head
图9:有N个节点的链表反序
团结原链表和插入后的链表,就很轻易写出响应的代码。操纵要领如下:
1、我们必要一个读原链表的指针p2,存反序链表的p1=NULL(恰恰最后一个节点的next为NULL),尚有一个姑且存储变量p;
2、p2在原链表中读出一个节点,我们就把它放到p1中,p就是用来处理赏罚节点安排次序的题目;
3、好比,此刻我们取得一个2,为了我们继承往下取节点,我们必需生涯它的next值,由原链表可知p=2->next;
4、然后由反序后的链表可知,反序后2->next要指向1,则2->next=1;
5、好了,此刻已经反序一个节点,接着处理赏罚下一个节点就必要生涯此时的信息:
p1酿成方才插手的2,即p1=2;p2要酿成它的下一节点,就是上面我们生涯的p,即p2=p。
反序链表的函数为:
/*
==========================
成果:反序节点
(链表的头酿成链表的尾,链表的尾酿成头)
返回:指向链表表头的指针
==========================
*/
struct student *Reverse (struct student *head)
{
struct student *p; //姑且存储
struct student *p1; //存储返回功效
struct student *p2; //源功效节点一个一个取
p1 = NULL; //开始颠倒时,已颠倒的部门为空
p2 = head; //p2指向链表的头节点
while(p2 != NULL)
{
p = p2->next;
p2->next = p1;
p1 = p2;
p2 = p;
}
head = p1;
return head;
}
对链表举办选择排序的根基头脑就是重复从还未排好序的那些节点中,选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,依次从头组合成一个链表。
我以为写链表这类措施,要害是领略:head存储的是第一个节点的地点,head->next存储的是第二个节点的地点;恣意一个节点p的地点,只能通过它前一个节点的next来求得。
单向链表的选择排序图示:
---->[1]---->[3]---->[2]...---->[n]---->[NULL](原链表)
head 1->next 3->next 2->next n->next
---->[NULL](空链表)
first
tail
---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表)
first 1->next 2->next 3->next tail->next
图10:有N个节点的链表选择排序
1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中;
2、空链表中安顿第一个进来的节点,发生一个有序链表,而且让它在原链表中疏散出来(此时要留意原链表中出来的是第一个节点照旧中间其余节点);
3、继承在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的next,然后它酿成其尾指针;
对链表举办选择排序的函数为:
/*
==========================
成果:选择排序(由小到大)
返回:指向链表表头的指针
==========================
*/
struct student *SelectSort (struct student *head)
{
struct student *first; //分列后有序链的表头指针
struct student *tail; //分列后有序链的表尾指针
struct student *p_min; //保存键值更小的节点的前驱节点的指针
struct student *min; //存储最末节点
struct student *p; //当前较量的节点 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|