嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
约瑟夫环的链表实现,使用当前结点的前一个结点巧妙实现删除操作
#include <bits/stdc .h>
//约瑟夫环的链表实现
using namespace std;
struct link{
int value;
link* next; //或者写成 struct link* next;
};
int main()
{
int n,m;
while (cin>>n>>m && n!=0 && m!=0){ //读取
link* head=(link*)malloc(sizeof(link)); //申请头节点,链表的尾指链表头
head->value=1;
head->next=head; //循环
link* index=head; //index是游标,临时变量
for(int i=2;i<=n;i ){ //申请够n个节点,一直往中间插入数字
link* nextLink=(link*)malloc(sizeof(link));
nextLink->value=i;
nextLink->next=head; //每次保证构成循环
index->next=nextLink;
index=nextLink;
}
link* preLink=index; //preLink是index的前一个节点
index=head; //index相当于一个游标
while (index->next!=index){ //直到只剩下一个节点,即尾巴==头
for (int i=1;i<m;i ) { //数够m个节点
index=index->next;
preLink=preLink->next;
}
preLink->next=index->next; //index是第m个节点 前一个节点连接后一个节点,跳过中间节点,那就在链表中少了一个节点
link* tmp = index; //删除结点操作
index=index->next;
free(tmp);
}
cout<<index->value<<endl; //输出这个结点的值
}
return 0;
}