c语言把链表设置为空号,C语言 类似约瑟夫环问题 在线等 谢谢!!!

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

xtd0faum

2013.04.06

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:57%    等级:12

已帮助:3664人

这不就是瑟夫环问题

以下是我做的:(数据结构作业,运行过没问题)

#define ERROR 0

#define OK 1

#include

#include

struct CirNode//定义每个结点的类型

{

int data;//每个人所拥有的密码

int num;//每个人在圈中的位序

struct CirNode *next;

};

int a[30];//人数要求≤30

struct CirNode *CreateList(int n)//生成n个结点的单向循环链表

{

struct CirNode *L,*p,*q;

int i;

int j=1;

L=q=(struct CirNode*)malloc(sizeof(struct CirNode));//建立一个不带头结点的单向循环链表

if(!q) return ERROR;

printf("Please input a code for each people:\n");

q->num=j;

printf("%d.data=",j);

scanf("%d",&q->data);

j++;

q->next=L;

for(i=1;i

{

p=(struct CirNode*)malloc(sizeof(struct CirNode));

printf("Please input a code for each people:\n");

p->num=j;

printf("%d.data=",j);

scanf("%d",&p->data);

j++;

q->next=p;

p->next=L;

q=q->next;

}//for

return (L);

}//Create

struct CirNode *DeleteList(struct CirNode *L,int m,int n)//报m的人出列

{

int i,j=0;

int k=n;

struct CirNode *p,*q,*pre;

pre=p=L;

do

{

i=1;

while(inext;i++;}

if(m==1)

{

while(pre->next!=p) pre=pre->next;

m=p->data;//得到新的密码

a[j]=p->num;//得到出列人的序号

q=p;

pre->next=p->next;

p=p->next;

free(q);

L=pre=p;//让新的报1的人作为头结点

k--;j++;

}//if

else

{

q=p->next;

m=q->data;

a[j]=q->num;

p->next=q->next;

p=q->next;

free(q);

L=pre=p;

k--;j++;

}//else

}while(k>1);

a[j]=p->num;//最后一个出列人的序号

printf("Now all people hava dequeue.\n");

return (L);

}//DeleteList

int main()

{

struct CirNode *L;

int i,n,m;

printf("======This is a Joseph problem======\n");

printf("Please input the number of people,n=");

scanf("%d",&n);

if(n>30||n<1)

{

printf("ERROR! Please input again,n=");

scanf("%d",&n);

}//if

L=CreateList(n);

printf("Please input the first code,m=");

scanf("%d",&m);

if(m<1)

{

printf("ERROR! Please input again,m=");

scanf("%d",&m);

}//if

DeleteList(L,m,n);

printf("The dequeue sequence is:\n");

for(i=0;i

printf("%d ",a[i]);

printf("\n");

return 0;

}

00分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值