这个c程序问题在哪里?

来源:百度知道 编辑:UC知道 时间:2024/05/13 03:42:52
那个怎么环的问题。1圈人依次报数(从1报到3),报到3者出列,求最后留下的人的那个题目。
我的程序运行后输入大于1的数就遇到问题出错了。哪里有问题?

#include<stdio.h>
#include<malloc.h>
#define SI sizeof(struct data)
struct data
{
int num;
struct data *next;
};
void main()
{
int come(int n);
int n,z;
printf("有几个人排队?\n");
scanf("%d",&n);
z=come(n);
printf("最后留下第%d位\n",z);
}
int come(int n)
{
int i,k;
struct data *h,*p,*q;
p=(struct data *)malloc(SI);
p->num=1;
for(i=1;i<n;i++)
{
if(i==1)
h=p;
else
q->next=p;
q=p;
p=(struct data *)malloc(SI);
p->num=i+1;
}
p->next=h;
for(i=1;i<n;i++)
{
for(k=0;k<=2;k++)
{
q=p;
p=p->next;
}
q->next=p->next;
}
k=p->num;
return(k);
}
报错为:
Loaded 'ntdll

先定义结构体data,再定义SI为其大小。
另外,动态分配内存的那一句有问题,
p=(struct data *)malloc(SI);
比如SI=5,那么相当于申请了5个存储data* 的空间,而不是一个指针。
有一个不好的习惯是使用malloc后不释放空间。
上面那位的程序就简单明了多了,想用动态链表来解决这样一个小问题确实得不偿失!

#include<stdio.h>
#include<malloc.h>
#define SI sizeof(struct data) //我认为此处没有问题;
struct data
{
int num;
struct data *next;
};
void main()
{
int come(int n);
int n,z;
printf("有几个人排队?\n");
scanf("%d",&n);
z=come(n);
printf("最后留下第%d位\n",z);
}
int come(int n)
{
int i,k;
struct data *h,*p,*q;
p=(struct data *)malloc(SI);
p->num=1;
for(i=1;i<n;i++)
{
if(i==1) 我个人考虑,最好把1单独考虑
h=p;
else ELSE语句应包括后面,应用括号括起;
q->next=p; Q应申请空间,而且对于I=2时此处两句赋值语句不行应改为P->NEXT=Q;P=P->NEXT;你可以举例试试
q=p;
p=(struct data *)malloc(SI);
p->num=i+1;
}
p->next=h;
for