关于约瑟夫环问题,连接和编译都没问题,但一执行就出现错误,希望别人指教指教。
#include<stdio.h>#include<stdlib.h>
typedef struct node
{
int number;
int password;
struct node *next;
}person;
typedef person *personlist;
/* 得到一个头指针 */
void initlist(person *l)
{
person *head,*rear;
head=(person*)malloc(sizeof(person)); /* 得到一个头结点 */
rear=head; /* 让该链表为一条循环单链表 */
}
/* 初始化链表 */
void Dellist(personlist l,int e)
{
person *r,*p;
p=l->next; /* 让指针p指向头结点,从链表开始从头查找*/
while(p->next!=l->next) /* 当头结点指向自己的时候,表示删除完毕*/
{
p=p->next; /* 指针在链表上移动*/
if((p->number)==e)
{
r=p->next;
p->next=r->next;
free(r);
} /* 当指针指向的当前该结点的值时,删除该结点,并且释放结点空间*/
}
}
/* 删除链表中与e相等的值 */
int createlist(personlist l)
{
person *rear,*s;
int x,y; /* 让x和y分别赋值给结点上的号码与密码 */
int n;
n=0; /* n为输入的人数 */
int flag=1;
rear=l->next;
while(flag)
{
if(x!=(-1)) /*当输入的号码为-1时,结束输出 */
{
s=(personlist)malloc(sizeof(person));
scanf("%d,%d",&x,&y);
s->number=x;
s->password=y;
rear->next=s;
rear=s;
n++;
}
else
{
flag=0;
rear->next=l->next; /* 让末尾结点指针指向头结点 */
}
}
return n;
}
/* 成功建立了一个链表 */
int showlist(personlist l,int k)
{
person *p;
int n;
int flag;
p=l->next->next;
n=1;
flag=1;
while(flag)
{
if(n<=k)
{
printf("%d",*p);
p=p->next;
n++;
}
else
flag=0;
}
return n;
}
/* 为了检验,输出所有人的密码 */
void yuesefu(person *l,int m)
{
person *p;
p=l->next;
while(p->next!=l->next)
{
p=p->next;
if((p->number)==m)
{
printf("%d,%d",p->number,p->password);
m=(p->password);
}
Dellist(l,m);
}
}
/* 让指针在链表上移动并查找与m相匹配密码的人,输出,且将其删除 */
int main()
{
person *l;
initlist(l);
int y;
y=createlist(l);
showlist(l,y);
int x;
x=20;
yuesefu(l,x);
return 0;
}
/* 编写主函数 */