【ACM】【链表】关于在链表中实现…

原创 2013年12月03日 11:12:42

设计思想:

相对于数据结构为数组的插入排序方法,现在要解决的是如何实现链表中的插入排序。数组的存储方式是顺序存储,而链表的存储方式是链式存储。所以,要实现针对链表的插入排序法,其关键是解决如何能够保证链表不发生断链的情况。

首先,我们先考虑在链表中只有两个结点——也就是只有头结点和尾结点的情况:

令 p1 指向头结点, p2 指向尾结点

【ACM】【链表】关于在链表中实现插入法排序

如果 p1 指向的结点与 p2 指向的结点已经是有序(此处指的是按设计人员的设计升序或者降序排列)的,那么,则不作任何操作,排序完成。否则,则应对相对的指针进行操作,令链表变成有序的。

此时:

令 head 等于 p2

令 p2->next 等于 p1

令 p1->next 等于 NULL

【ACM】【链表】关于在链表中实现插入法排序

下面来考虑多于两个结点的实现方式

假设现在有一个六个结点的链表,其中 p1 、 p2 所指向的节点分别为头结点以及第二个结点,而且已经是有序排列。此时,定义两个指针 p3 、 p4 用于查找结点,其中 p4 为查找用指针, p3 为 p4 的前驱,用于插入结点时连接链表用。再设置两个指针 p5 、 p6 指向 p2 的下一个结点。

现分析一下其中的作用:

p1 与 p2 用于确定头结点与尾结点的位置

p3 与 p4 用于查找有序链表中应该插入的位置

p5 用于指向所要插入结点的地址,确定 p5 插入后 p6 用于指向下一个结点以保证链表仍然能够正确的连接上。

【ACM】【链表】关于在链表中实现插入法排序

这时候有三种情况:

如果 p5 所指向的结点应该作为头结点

令 p6 指向下一个结点

【ACM】【链表】关于在链表中实现插入法排序

p5 指向 p1 , head 指向 p5

【ACM】【链表】关于在链表中实现插入法排序

再令 p1 等于 p5 , p2->next=p6

【ACM】【链表】关于在链表中实现插入法排序

此时,可以发现,在链表中其中一个结点已经进行了插入法排序,此时链表中有序的结点增加到 3 个。此时,再令 p1 等于头结点, p5 等于 p6 , p3 等于 p1 , p4 等于 p1->next 。

【ACM】【链表】关于在链表中实现插入法排序

如果 p5 应该插入到链表中间。

那么,应该确定 p5 所指向结点要插入的位置,再令 p6 指向下一个结点

【ACM】【链表】关于在链表中实现插入法排序

接着令 p5->next=p4 , p3-next=p5 实现插入。

【ACM】【链表】关于在链表中实现插入法排序

最后,令 p2->next=p6 ,重新实现链表的连接。

【ACM】【链表】关于在链表中实现插入法排序

再令 p5=p6 ,进行下一个结点的排序。

最后,当结点要作为已排序的链表的最后一个结点时,直接令 p2=p5 即可。

依次将各个结点利用插入法加入到链表中,直到 p2->next=p6=NULL 为止。

相关文章推荐

ACM学习历程16——List链表的应用之简单约瑟夫问题

约瑟夫问题是list链表的应用之一,问题描述:N个人围成一个圆圈,每个人都有唯一的一个编号,编号从1到N,从编号为1的人开始报数,依次报到K,报数为K的人出列,他的下一个又从1开始报数,直到所有的人都...

写的很好 链表的各种题目整理(C语言实现)

这里处理的全部是单链表: typedef struct node { char *data; struct node *next; } node_t; 我们约定一个打...

2017年第0届浙江工业大学之江学院程序设计竞赛决赛 E: qwb和李主席 [折半枚举二分]【思维?套路!】

题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=4 ———————————————————————————...

HDU 1800 Flying to the Mars ELFhash算法

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1800题意:给出一些数字,求出这些数字中出现次数,输出最多的那个次数。其中数字不超过30位思路:数字范围较大...

Acm Club 1326:算法2-8~2-11:链表的基本操作

题目描述 链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会...

一道简单的acm题的三种解决方案(数组、单向链表、容器vector)与代码优化

简述:这是一道很简单的acm题,乍眼一看就想到用数组实现(fishing.cpp),的确数组实现毫无鸭梨28行代码搞定,但是数组不能动态分配内存,这会导致严重的内存浪费,于是想到单向链表(fishin...

***UVa11988 Broken Keyboard ACM解题报告(链表)

这题用数组移动会超时,所以解决方案是采用链表,每输入一个字符就把它存起来,设输入字符串是s[1~n],就可以用next[i]表示在当前显示屏中s[i]右边的字符编号,本渣渣链表题刚接触,这题基本是参考...

acm编程训练 单向链表 C语言程序设计教程(第三版)课后习题11.8

acm编程训练 单向链表 C语言程序设计教程(第三版)课后习题11.8 Description 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 Inp...
  • mclinRV
  • mclinRV
  • 2017年07月02日 21:45
  • 347

ACM学习历程15——list双向链表容器

List容器是一种实现了双向链表的数据结构,它的每个节点都含有前驱元素指针域、数据域、后继元素指针域。不同于数组这样的线性表,由于list元素的前驱和后继都是靠指针来链接,因此在链表的任意位置进行元素...

链表c代码实现

  • 2017年10月22日 15:55
  • 783KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【ACM】【链表】关于在链表中实现…
举报原因:
原因补充:

(最多只允许输入30个字)