2 wf915584221 wf915584221 于 2014.03.22 21:03 提问

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("%d\n",pt->n);
return 0;
}
以上是代码,编译出错,麻烦大神看看,,怎么修改,谢谢!

2个回答

u014090107
u014090107   2014.03.23 14:01

用了链表就没有必要再去定义数组了。

u014090107
u014090107   2014.03.23 14:28

#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;

}

看看对你有没有帮助。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!