约瑟夫c语言链表,C语言循环链表解决约瑟夫问题

最近学习数据结构,需要用单循环链表解决约瑟夫问题,遇到了一些困难,记录一下。

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.找到指定位置,对指定位置节点进行删除。

这一点比较好解决,用两个循环,一个循环让位于链表头的指针指向起始位置,另一个循环让位于起始位置的指针根据报数移动到相应位置。然后将这的位置的节点进行删除。

在删除时要注意,我们需要两个指针,一个指针pPre指向要删除节点的前一个节点,另一个指针p指向要删除节点。然后pPre->next = p->next; 将p所指向的节点从链表中删掉,然后free(p),释放掉p所占的内存空间。然后要让p继续作为pPre的后继,所以,p = pPre->next;

4,如果我们选中的是从头结点开始就删除,那怎末办?

在写程序时,这个方面没有处理好,产生了bug

根据3,需要一个指针指向所选节点,所以,在一开始,最好的方法就是让pPre指向尾节点,然后进行两次循环。

ok,上代码

void Joseph(List* pHead,int n,int m,int position)

{

if(npNext;

}

pFind = pHead;//pFind指向头节点

int i,j;

for(i=1; ipNext;

}

while(pFind->pNext!=pFind)

{

for(j = 1; jpNext;

}

pPreFind->pNext = pFind->pNext;//删除节点

printf("%d出列",pFind->data);

free(pFind);

pFind = pPreFind->pNext;

}

printf("%d最后",pFind->data);

free(pFind);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值