满意答案
xtd0faum
2013.04.06
采纳率: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分享举报