最近学习数据结构,需要用单循环链表解决约瑟夫问题,遇到了一些困难,记录一下。
1。构建的链表是否应该有头节点?
对于普通的单链表,我们设置头节点会带来很多方便,但是对于循环链表,因为我们要进行循环,但是我们不希望头节点加入进来,因此,我们最好是构建不含头结点的链表。
2.单循环链表的构建。
由于之前构建的链表是单链表,在构建循环链表时,尾节点与头指针的相连的方法。
List* creatList()
{
int i = 0,data = 0;
List* pHead = NULL,*pEnd = NULL,*pNew = NULL;
for(i=0; i<5; i++)
{
pNew = (List*)malloc(sizeof(List));
if(NULL == pNew)
{
printf("分配内存失败");
}
if(NULL == pHead)
{
pHead = pNew;
}
else
{
pEnd->pNext = pNew;
}
pEnd = pNew;
printf("请输入节点元素的值:");
scanf("%d",&data);
pNew->data = data;
length++;
}
pNew->pNext = pHead;//将尾节点的next域指向链表头
return pHead;
}
通过最后将尾部节点的next域与链表头相连,实现循环链表的构建。可能是自己很少写链表结构,构建起来跟不熟练,自己总结关于链表的构建技巧:必须要声明一个尾指针,这个指针负责连接新建节点。
3.找到指定位置,对指定位置节点进行删除。
这一点比较好解决,用两个循环,一个循环让位于链表头的指针指向起始位置,另一

本文介绍了如何使用C语言构建单循环链表解决约瑟夫问题。首先讨论了循环链表是否需要头节点的问题,然后讲解了单循环链表的构建方法,以及如何在链表中找到指定位置并删除节点。在处理删除头结点的特殊情况时,文章提到了可能遇到的bug,并给出了修正方法。最后,作者分享了相关的代码实现。
最低0.47元/天 解锁文章
3532

被折叠的 条评论
为什么被折叠?



