小白求教 约瑟夫环问题

Gaunny 2018-04-19 07:59:38
题目是这样要求的:
从键盘输入人数N (N<50)及N个人的编号(整型)、姓 名、性别和年龄,正向建立带头节点的循环链表:
输出循环链表各结点的值
输入开始报数的人的编号S、间隔的个数M和剩余人数X;
在循环链表中查找到编号为S的结点;
从1开始向后报数,将报M的人(结点)从循环链表中删除,并输出该人的编号
从刚才被删除的下一人开始重复步骤5,直至最后只剩下X个人为止;
输出最后剩余的人的编号,姓名、性别和年龄.
然后我自己写了个代码,发现程序直接停止运行了,而且我写不出来如何输出剩余人的姓名性别等信息

#include<stdlib.h>
#include<stdio.h>

//声明循环链表结构体
typedef struct node
{int data;
char name[10];
char sex;
int age;
struct node *next;
}node;
struct node stu;

//创建单循环链表
node *Creatlist(node *h,int n)
{ node *p,*q;//创建两个结点指针
int S;
h=(node*)malloc(sizeof(node));//分配动态存储空间
h->next=NULL;//h指向下一个元素结点为空,确定*h是头结点指针
q=h;//将头结点的数据赋给q
for(S=n;S>0;S--)//遍历整个链表
{
p=(node*)malloc(sizeof(node));//分配动态存储空间
scanf("%d %s %c %d",&p->data,p->name,&p->sex,&p->age);//输入p的数值
p->next=q->next;//指针*q跟着*p后面,一个接一个插入
q->next=p;
q=p;//把p的值再传给q
}
q->next=h->next;//从链表中删除
free(h);//释放头结点*h
return q->next;//形成单循环链表
}

//执行出列操作
void Printlist(node *h)
{node *p;
p=h;//找到第M个人所在位置
while(p->next!=h)//当*p不再指向头结点时 ,即找到要出列人的位置
{printf("%d",p->data);
p=p->next;
}
printf("%d ",p->data);
printf("\n");}

//约瑟夫环
void YueSeFuHuan(node *h,int S,int n)
{node *p,*q;
int M,m,e;
p=h;
for(M=1;M<S;M++)
{
p=p->next;}
printf("被删除的编号:",p);
while(p->next!=p)//用循环输出链表中的元素
{for(m=1;m<n-1;m++)
{p=p->next;}
q=p->next;p->next=q->next;e=q->data;
free(q);
printf("%d ",e);
p=p->next;
}
e=p->data;
free(p);
printf("%d\n",e);
}

//主函数
int main()
{node *L;
int N,S,M,X;
{void input(node stu[]);//input函数声明
node stu[N],*p=stu;//定义结构体数组和指针
input(p);//调用input函数
printf(p);}
printf("输入人数\n");
scanf("%d",&N);
printf("输入每个人的编号\n");
L=Creatlist(L,N);
printf("建立的循环链表:\n");
Printlist(L);
printf("输入开始数数的人的位置:\n");
scanf("%d",&S);
printf("间隔的个数:\n");
scanf("%d",&M);
printf("输入剩余人数:\n");
scanf("%d",&X);
printf("删除的编号:\n");
YueSeFuHuan(L,S,M);
//printf("输出最后剩余的人的编号,姓名、性别和年龄:\n");
printf("data:%d\nname:%s\nsex:%c\nage:%d\n\n",stu.data,stu.name,stu.sex,stu.age);
}

void input(node stu[])//定义input函数
{
int i,N;
printf("输入各编号所对应的学生姓名,性别,年龄:\n");
for(i=0;i<N;i++)
{
scanf("%s %c %d",stu[i].name,stu[i].sex,&stu[i].age);
}
}
有没有大佬帮我改一下代码...谢谢!
...全文
1384 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-20
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
赵4老师 2018-04-20
  • 打赏
  • 举报
回复
百度搜相关关键字。
Gaunny 2018-04-20
  • 打赏
  • 举报
回复
又重写了了一下,运行还是出问题
#include<stdlib.h>
#include<stdio.h>

//声明循环链表结构体 
typedef struct node
{int data;
char name[10];
	char sex;
	int age;
struct node *next;
}node;
struct node stu;

//创建单循环链表 
node *Creatlist(node *h,int n)
{  node *p,*q;//创建两个结点指针 
int S;
h=(node*)malloc(sizeof(node));//分配动态存储空间 
h->next=NULL;//h指向下一个元素结点为空,确定*h是头结点指针
q=h;//将头结点的数据赋给q 
for(S=n;S>0;S--)//遍历整个链表 
{
p=(node*)malloc(sizeof(node));//分配动态存储空间 
scanf("%d %s %c %d",&p->data,p->name,&p->sex,&p->age);//输入p的数值 
p->next=q->next;//指针*q跟着*p后面,一个接一个插入
q->next=p;
q=p;//把p的值再传给q
}
q->next=h->next;//从链表中删除 
free(h);//释放头结点*h 
return q->next;//形成单循环链表 
}

//执行出列操作 
void Printlist(node *h)
{node *p,*q;
p=h;//找到第M个人所在位置 
while(p->next!=h)//当*p不再指向头结点时 ,即找到要出列人的位置 
{printf("%d",p->data);
p=p->next;
}
printf("%d ",p->data);
printf("\n");
free(p);
p=NULL;
while(q->next!=NULL)//当*q不再指向空结点时,即找到剩余人的位置 
{printf("\t\t\t编号\t\t\t姓名\t\t\t性别\t\t\t年龄\n");
for(q=h;q!=NULL;q=q->next)
printf("\t\t\t%d\t\t\t%s\t\t\t%c\t\t\t%d\n",q->data,q->name,q->sex,q->age);
}
}

//约瑟夫环 
void YueSeFuHuan(node *h,int S,int n)
{node *p,*q;
int M,m,e;
p=h;
for(M=1;M<S;M++)
{
p=p->next;}
printf("被删除的编号:",p);
while(p->next!=p)//用循环输出链表中的元素
	{for(m=1;m<n-1;m++)
	{p=p->next;}
q=p->next;p->next=q->next;e=q->data;
free(q);
printf("%d ",e);
p=p->next;
}
e=p->data;
free(p);
printf("%d\n",e);
}

void input(node stu[]);//input函数声明 

//主函数 
int main()
{node *L;
int N,S,M,X;
{printf("输入人数N: \n");
scanf("%d",&N);
node stu[N];//*p=stu;//定义结构体数组和指针 
input(stu);//调用input函数 
printf(stu);
}
printf("输入每个人的编号\n");
L=Creatlist(L,N);
printf("建立的循环链表:\n");
Printlist(L);
printf("输入开始数数的人的位置:\n");
scanf("%d",&S);
printf("间隔的个数:\n");
scanf("%d",&M);
printf("输入剩余人数:\n");
scanf("%d",&X);
printf("删除的编号:\n");
YueSeFuHuan(L,S,M);
//printf("输出最后剩余的人的编号,姓名、性别和年龄:\n");
//printf("data:%d\nname:%s\nsex:%c\nage:%d\n\n",stu[].data,stu[0].name,stu[0].sex,stu[0].age);
}

void input(node stu[])//定义input函数 
{
	int i,N;
	printf("输入各编号所对应的学生姓名,性别,年龄:\n");
	for(i=0;i<N;i++)
	{
scanf("%d %s %c %d",&stu[i].data,stu[i].name,stu[i].sex,&stu[i].age);
}
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧