C语言数据结构——用链表处理约瑟夫问题-创新互联
题目链接如下:
创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为黄骅企业提供专业的成都网站设计、做网站,黄骅网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。
tOpenJudge - 1748:约瑟夫问题
问题描述:
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入输出要求:输入:需能同时输入多组数据,以0 0结尾标志着结束。
样例输入:6 2 12 4 8 3 0 0
样例输出:5 1 7
解决思路:1.由于猴子围成了一个圈,故此处使用循环链表的数据结构,将每只猴子看作是一个结点,用序号表示。
//建立结点数据结构
typedef struct node
{
int data;
struct node *next;
}Node,*Link;
for(i=0;idata = i+1;
tail->next = p;
p->next = head->next;
tail = p;
}
2.当猴子报数为m时,将该猴子所表示的结点删除,并将下一个结点(猴子)标号为1,看作是下一趟报数的起点。
if(i==m)
{
q->next = p->next;
free(p);
p = q->next;
i = 1;//第二趟报数
}
3.如果不是m号猴子,不改变结点,指针指向下一结点。
代码实现:#include#include#include//建立结点数据结构
typedef struct node
{
int data;
struct node *next;
}Node,*Link;
int main()
{
int n,m,count,i;
//定义头结点head
Link head,tail,p,q;
head = (Link)malloc(sizeof(Node));
head->next = NULL;
while(1)
{
scanf("%d %d",&n,&m);
if(n==0&&m==0)//结束条件
{
free(head);
break;
}
else
{
tail = head;
for(i=0;idata = i+1;
tail->next = p;
p->next = head->next;
tail = p;
}
p = head->next;//p指向第一个结点
q = tail;//q指向最后一个结点
i = 1;
while(p!=q)//出列
{
if(i==m)
{
q->next = p->next;
free(p);
p = q->next;
i = 1;//第二趟报数
}
else//q指针在p指针之前,如果两个指针重合,说明只剩下一个结点
{
q = p;
p = p->next;
i++;
}
}
printf("%d\n",p->data);
free(p);
}
}
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享文章:C语言数据结构——用链表处理约瑟夫问题-创新互联
分享链接:http://hbruida.cn/article/cecedg.html