约瑟夫环问题解答。求高手帮忙~~~要求C语言编程

2024-11-29 22:49:44
推荐回答(1个)
回答1:

循环链表实现约瑟夫环

#include
#include
typedef struct node
{
int num;
struct node *next;
}NODE;
//创建一个没有头结点的链表
NODE *createlinklist(int n)
{
system("color 5");
NODE *head,*p,*q;
int i=1;
int x;
head=p=(struct node*)malloc(sizeof(struct node));
printf("请输入第1个元素的值:");
scanf("%d",&x);
p->num=x;//没有头结点的链表
for(i=2;i<=n;i++)
{
int y;
q=(struct node*)malloc(sizeof(struct node));
if(q==0) return(0);
p->next=q;
p=q;
printf("请输入第%d个元素的值:",i);
scanf("%d",&y);
p->num=y;
}
p->next=head;//使链表尾指向链表头 形成循环链表
return head;
}
//输出这个链表
void printlinklist(NODE *p,int n)
{
system("color 1f");
int i;
NODE *q = p;
if(NULL == q->next)
{
printf("链表为空!");
return;
}
printf("所有元素的信息列表:\n");
for(i=1;i<=n;i++)
{
if(NULL == q)
{
printf("the list is NULL!");
return;
}
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
//开始从第一个人开始玩起
void yuesefu(NODE *p,int n,int m)
{
system("color 2f");
int i,j;
NODE *q;
for(i=1;i {
for(j=1;j { p=p->next;
}
q=p->next;
p->next = q->next;
printf("%d ",q->num);
free(q);
p=p->next;//每次删除结点之后,指针P向后移一个,表示从出列的人的后一个人开始玩起;
}
printf("\n最后剩余的是第%d号.\n",p->num);
p->next=NULL;
}
//主函数
void main()
{
NODE *head;
int n,m;
system("color 9f");
printf("请输入元素的个数N:\n");
scanf("%d",&n);
printf("请输入间隔数K:\n");
scanf("%d",&m);
head=createlinklist(n);
printlinklist(head,n);
printf("依次被选出的是:\n");
yuesefu(head,n,m);
}