C语言二级考试循环链表是循环队列的链式存储结构
发布时间:2025-05-19 05:14:46 发布人:远客网络
一、C语言二级考试循环链表是循环队列的链式存储结构
1、循环队列本身是一种顺序存储结构,而循环列表是一种链式存储结构。两者之间是平级关系。(用于解释第一句话的错误原因。)
2、线性链表是线性表的链式存储结构,包括单链表,双链表,循环链表等。(补充说明)
3、队列的顺序存储结构一般采用循环队列的形式。(用于解释第二句话的正确原因。)
二、求c语言用循环链表编写约瑟夫环代码(速度求解)!!!
1、#define size 100/*输入人数的上限*/
2、 int start, overNum;/*开始位置各跨过位置*/
3、 int deleNum;/*出列人所在数组中的下标*/
4、 int name, total;/*输入时,人的信息以及人的总数*/
5、 printf("请输入圆桌上人的总数:");
6、 scanf("%d",&arrayLen); printf("\n");
7、 if(( arrayLen> size)||( arrayLen< 0))
8、 printf("超出范围,请重新输入:");
9、 scanf("%d",&arrayLen); printf("\n");
10、 printf("请输入各个人的信息(整数):\n");
11、 for( i= 0; i< arrayLen; i++)
12、 printf("你输入的数据的顺序为:\n");
13、 for( i= 0; i< arrayLen- 1; i++)
14、 printf("%d==>", person[i]);
15、 printf("%d\n", person[arrayLen- 1]);
16、 printf("你打算从第几个人开始?请输入开始号:");
17、 printf("请输入相邻两出列人之间的间隔:");
18、 printf("程序运行后,出列人的顺序为:\n\n");
19、 for( i= 0; i< total; i++)/*要打印total个人的情况,故做total次*/
20、 printf("%d", person[0]);/*如果是数组只剩一个元素,直接出列*/
21、 deleNum=( start+ overNum- 1)% arrayLen;/*此取模保证循环*/
22、 printf("%d==>", person[deleNum]);
23、 for( j= deleNum; j< arrayLen; j++)/*将出列元素后面的各元素前移*/
24、 arrayLen= arrayLen- 1;/*移动完毕后,数组长度减1*/
三、如何创建一个空的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));