您当前的位置:首页 > 互联网教程

求问c语言单向链表和双向链表与循环链表的区别

发布时间:2025-05-12 16:56:31    发布人:远客网络

求问c语言单向链表和双向链表与循环链表的区别

一、求问c语言单向链表和双向链表与循环链表的区别

1、打个比方。把链表节点看作是一个人,把链表指针看作是人的手(左手是前向指针,右手是后向指针)。

2、非循环的单向链表是这样的:若干个人排成一排,每个人都抬起右手指向他右边的人,最右边的人的右手指向了空气(NULL)。如果要想找到这一排中任意一个人,必须从排头(链表头)开始沿手指的方向挨个查找。

3、循环单向链表是这样的:若干个人围成一圈,每个人都抬起右手指向他右边的人,这样每个人的右手都能指到一个人(如果只有一个人,那么他的右手指向自己)。从任意一个人开始,沿着手指的方向,可以不停地循环找到每一个人。

4、非循环的双向链表是这样的:若干个人排成一排,每个人都抬起左手指向他左边的人,并且每个人都抬起右手指向他右边的人,那么最左边的人的左手指向了空气(NULL),最右边的人的右手指向了空气(NULL)。如果要想找到这一排中某个目标人,从任意一个人开始,可以沿左手方向尝试查找,如果找不到,可以继续沿右手方向查找,直到找到目标人。

5、循环双向链表是这样的:若干个人围成一圈,每个人都抬起左手指向他左边的人,并且每个人都抬起右手指向他右边的人,这样每个人的左右手都可以指到一个人(如果只有一个人,那么他的左右手都指向自己)。无论选择左手方向还是右手方向,都可以不停地循环找到每一个人。

二、求c语言双向循环链表的一个应用例子

1、比如。有10个数。从大到小排序成有序数组a[0]~a[9]

2、这时如果加入第11个数时要要保序新的数组有序,假设这个值要插在第a[n] n<9;

3、那就意味着插入前要把a[n]-a[9]的位置向后移一位,在插入a[n]

4、用链表的话只要对要插入N个结点及附近的结点信息就可以通过几个操作就搞定了

5、那单向链表与双向链表在于。插入,和遍历的灵活性

6、比如你找到链表中的一个结点P。现在要遍历出他前面 N个结点打印出来

7、用双向的话直接可反向一个个找出来打印

8、而用单向的话。能产现打印出结点P后面N个结点

9、——————————————————————

10、你的程序可以命题为,一个有序的数据集,(比如档案)按某条件排序,用双向链表存,

11、1打印出该档案的其他信息(如日期)

12、功能2和3写成函数传入参数为结点指针---这样在函数你就会发现链表的结构优点了

三、如何创建一个空的c语言双向循环链表

至少需要一个元素,空的不能能建立数据结构。

循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。循环链表的运算与单链表的运算基本一致。所不同的有以下几点:

1)在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。

2)在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。

当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。

pdbNodepnode=(pdbNode)malloc(sizeof(DbNode));

pnode->left=pnode->right=pnode;//创建新结点时,让其前驱和后继指针都指向自身

pdbNodeCreateList(inthead)//参数给出表头结点数据(表头结点不作为存放有意义数据的结点)

pdbNodepnode=(pdbNode)malloc(sizeof(DbNode));

pnode->left=pnode->right=pnode;

//插入新结点,总是在表尾插入;返回表头结点

pdbNodeInsertNode(pdbNodenode,intdata)//参数1是链表的表头结点,参数2是要插入的结点(结

pdbNodepnode=CreateNode(data);

node->left->right=pnode;

//查找结点,成功则返回满足条件的结点指针,否则返回NULL

pdbNodeFindNode(pdbNodenode,intdata)//参数1是链表的表头结点,参数2是要查找的结点(其中

while(pnode!=node&&pnode->data!=data)

//删除满足指定条件的结点,返回表头结点,删除失败返回NULL(失败的原因是不存在该结点)

pdbNodeDeleteNode(pdbNodenode,intdata)//参数1是链表的表头结点,参数2是要删除的结点(其

pdbNodepnode=FindNode(node,data);

pnode->left->right=pnode->right;

pnode->right->left=pnode->left;

intGetLength(pdbNodenode)//参数为链表的表头结点

voidPrintList(pdbNodenode)//参数为链表的表头结点

voidReverPrint(pdbNodenode)//参数为链表的表头结点

voidDeleteList(pdbNodenode)//参数为链表表头结点

printf("Inputthedatatoinsert:");

printf("Inputthedatatodelete:");

printf("Inputthedatatofind:");

printf("Thelist'slengthis%d\n",GetLength(list));