问题描述
- C语言编程,约瑟夫环问题,用链表实现
-
#include
struct num
{
int n;
struct num *p;
}
a[14];
int main()
{
struct num *pt;
int i;
for(i=0;i<14;i++)
a.n=i;for(i=1;i<14;i++) a.p=&a[i+1]; a[13].p=&a[1];
pt=&a[1];
for(i=0;i<14;i++)
printf("%5d",a.n);
printf("n");while(pt!=pt->p)
{
for(i=1;i<2;i++){pt=pt->p;
printf("%d",pt->p->n);
printf("n");pt->p=pt->p->p;
pt=pt->p;
}
}
printf("%dn",pt->n);
return 0;
}
以上是代码,编译出错,麻烦大神看看,,怎么修改,谢谢!
解决方案
用了链表就没有必要再去定义数组了。
解决方案二:
#include
#include
#define LEN sizeof(struct num)
#define N 10 //总共有多少;
struct num
{
int n;
struct num *p;
};//用链表就没有必要去定义数组了;数组的地址是连续的,要指向下一个就可以直接用指针;
struct num *create();//建立一个链表
void print(struct num *); //打印链表结果(只是用来查看链表是否正确)
int Josephus(struct num *);//约瑟夫环函数;
int main()
{
struct num *head;
head=create();
print(head);
printf("最终剩下的是:(假设数到三的都退出):%d",Josephus(head));
return 0;
}
struct num *create()
{
struct num *head=(struct num *)malloc(LEN);
head->p=NULL;
head->n=1;
struct num *p0,*p1;
int i;
p0=p1=head;
for(i=2;i<=N;i++)
{
p0=(struct num *)malloc(LEN);
p0->n=i;
p0->p=NULL;
p1->p=p0;
p1=p0;
}
return head;
}
void print(struct num *head)
{
while(head!=NULL)
{
printf(" %d",head->n);
head=head->p;
}
}
int Josephus(struct num *head)
{
struct num *p0=head,*p1;
int k=0,m=0;//k用来每次数数的计数;m用来计算总共推出的数量;
while(N-m!=1)
{
if(p0->n!=0)k++;
if(k==3){p0->n=0;k=0;m++;}//数到3的退出;
p0=p0->p;
if(p0==NULL)p0=head;
printf("n");
print(head);
}
p1=head;
while(p1->n==0)p1=p1->p; //最后剩下的没有标记零的就是结果;
return p1->n;
}
看看对你有没有帮助。