循环链表的定义:将单链表中的最后一个元素的next指针指向第一个元素
新增功能:游标的定义。
在循环列表中可以定义一个当前指针,这个指针通常称为游标,可以通过这个游标来遍历列表中的所有元素
循环列表新操作
将游标重置指向链表中的第一个数据元素
获取当前游标指向的数据元素
将游标移动指向到链表中的下一个数据元素
直接指定删除列表中的某个数据元素
优点:功能强了,循环链表,只是在单链表的基础上做了一个加强
循环链表可以完全取代单链表的使用
循环链表的next 和current操作可以高效地遍历列表中的所有元素。
缺点:代码复杂度提高了
约瑟夫问题:N个人围成一个圆圈,首先第一个人从一开始一个人,一个人顺时针报数,报到第m个人,令其出列 .然后再从下一个人开始从1顺时针报数,报到第m个人,令其出列 如此下去,求出列顺序.
示例代码(头文件略)
#include
#include
#include"Circlelist.h"
struct Value
{
CircleListNode header;
int v;
};
void main()
{
int i = 0;
CircleList*list = CircleList_Create();
struct Value v1;
struct Value v2;
struct Value v3;
struct Value v4;
struct Value v5;
struct Value v6;
struct Value v7;
struct Value v8;
CircleList*lis_Insert(list, (CircleListNode)&v1, CircleList_Length(list));
CircleList*lis_Insert(list, (CircleListNode)&v2, CircleList_Length(list));
CircleList*lis_Insert(list, (CircleListNode)&v3, CircleList_Length(list));
CircleList*lis_Insert(list, (CircleListNode)&v4, CircleList_Length(list));
CircleList*lis_Insert(list, (CircleListNode)&v5, CircleList_Length(list));
CircleList*lis_Insert(list, (CircleListNode)&v6, CircleList_Length(list));
CircleList*lis_Insert(list, (CircleListNode)&v7, CircleList_Length(list));
CircleList*lis_Insert(list, (CircleListNode)&v8, CircleList_Length(list));
for (i = 0; i < CircleList_Length(list); i++)
{
//获取游标所指元素 然后游标下移
struct Value*pv = (struct Value*)CircleList_Next(list);
printf("%d
", pv->v);
}
printf("
");
//重置游标
while (CircleList_Length(list) > 0)
{
struct Value*pv = NULL;
for (i = 0; i < 3; i++)
{
CircleList_Next(list);
}
pv = (struct Value*)CircleList_Current(list);
printf("%d
", pv->v);
CircleList_DeleteNode(list, (CircleListNode*)pv);
}
CircleList_Destroy(list);
system("pause");
return;
}
[灵光一闪]
页面更新:2024-05-16
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号