编程高手请帮忙,程序回主菜单运行第二次就会出错

xiangyang891006 2010-07-29 02:47:03
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "malloc.h"
//创建记录
struct StudentRecord{
char* Name;//姓名
int Num;//学号
};
//初始化记录
void InitRecord(StudentRecord &record)
{
record.Name=NULL;
record.Num=0;
}

//结点
struct Node
{
StudentRecord Record;//记录
Node* Next;//后继指针
};
//初始化结点
void InitNode(Node *&node)
{
InitRecord(node->Record);
node->Next=NULL;
}
//节点赋值
void SetNode1(Node * node,StudentRecord &record,int j)
{
printf("请输入第%d的姓名\n",j+1);
node->Record.Name = (char*)malloc(sizeof(char)*100);
scanf("%s",node->Record.Name);
printf("他(她)的学号是:\n");
scanf("%d",&node->Record.Num);
}
void SetNode2(Node *node,StudentRecord &record,int t)
{
Node * node1 [10];
node1[0]=(Node*)malloc(sizeof(Node));
InitNode(node1[0]);
node1[0]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[0]->Record.Name="小明";
node1[0]->Record.Num=0;
node1[1]=(Node*)malloc(sizeof(Node));
InitNode(node1[1]);
node1[1]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[1]->Record.Name="小华";
node1[1]->Record.Num=1;
node1[2]=(Node*)malloc(sizeof(Node));
InitNode(node1[2]);
node1[2]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[2]->Record.Name="小张";
node1[2]->Record.Num=2;
node1[3]=(Node*)malloc(sizeof(Node));
InitNode(node1[3]);
node1[3]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[3]->Record.Name="小李";
node1[3]->Record.Num=3;
node1[4]=(Node*)malloc(sizeof(Node));
InitNode(node1[4]);
node1[4]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[4]->Record.Name="小王";
node1[4]->Record.Num=4;
node1[5]=(Node*)malloc(sizeof(Node));
InitNode(node1[5]);
node1[5]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[5]->Record.Name="小赵";
node1[5]->Record.Num=5;
node1[6]=(Node*)malloc(sizeof(Node));
InitNode(node1[6]);
node1[6]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[6]->Record.Name="小马";
node1[6]->Record.Num=6;
node1[7]=(Node*)malloc(sizeof(Node));
InitNode(node1[7]);
node1[7]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[7]->Record.Name="小罗";
node1[7]->Record.Num=7;
node1[8]=(Node*)malloc(sizeof(Node));
InitNode(node1[8]);
node1[8]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[8]->Record.Name="小宾";
node1[8]->Record.Num=8;
node1[9]=(Node*)malloc(sizeof(Node));
InitNode(node1[9]);
node1[9]->Record.Name = (char*)malloc(sizeof(char)*100);
node1[9]->Record.Name="小段";
node1[9]->Record.Num=9;
node->Record.Name=node1[t]->Record.Name;
node->Record.Num=node1[t]->Record.Num;
}
//链表
struct LinkedList
{
Node* Head;//头结点
int Length;//元素个数
};
//初始化链表
void Initlist(LinkedList &list)
{
list.Head=(Node*)malloc(sizeof(Node));
InitNode(list.Head);
list.Length=0;
}
//尾插节点
void InsLast(LinkedList & list,Node* & node)
{
Node *p=list.Head;
while(p->Next)
{
p=p->Next;
}
node->Next=p->Next;
p->Next=node;
list.Length++;
}
//打印结点
void PrintNode(Node* node)
{
if( node == NULL)
{
printf("null\n");
return;
}
printf("%d %s ",node->Record.Num,node->Record.Name);
}
//删除节点
void DelNode(LinkedList&list)
{
Node*p=list.Head->Next;
if (p->Next==p)
{
free(p);
list.Head->Next=NULL;
}
else
{
while(p->Next!=list.Head->Next)
{
p=p->Next;
}
Node *q=list.Head->Next;
list.Head->Next=q->Next;
p->Next=q->Next;
free(q);
}
}
//寻找尾节点
Node* FindLast(LinkedList & list)
{
Node*p=list.Head;
while(p->Next)
{
p=p->Next;
}
return p;
}
int main()
{
int k=1;
while(k==1)
{
int total;
int now;
int i=0;
int j=0;
printf("\n\n\n **********约瑟夫环演示*********\n\n");
printf(" 1.手动输入数据;(不限定游戏人数)\n");
printf(" 2.选择信息输入;(游戏人数最多为10人)\n");
printf(" 0.退出系统;\n\n");
scanf("%d",&j);
if (j==0)
{
return 0;
}
if (j==1)
{
char c;
printf("\n输入总演示人数:");
loop:
if(scanf("%d",&total))
printf("\n");
else if(scanf("%c",&c))
{ printf("输入有误,请重新输入:");
goto loop;
}
LinkedList list;
Initlist(list);
while(i<total)
{
StudentRecord record;
InitRecord(record);
Node *node;
node=(Node*)malloc(sizeof(Node));
InitNode(node);
SetNode1(node,record,i);
InsLast(list,node);
i++;
}
Node * s=(Node*)malloc(sizeof(Node));
s=list.Head;
printf("\n你输入的数据是:");
for (i=0;i<total;++i)
{
PrintNode(s->Next);
s=s->Next;
}
printf("\n\n输入报数上限:");
scanf("%d",&now);
Node *q;
q=(Node*)malloc(sizeof(Node));
q=FindLast(list);
q->Next=list.Head->Next;
printf("\n\n他们的出列顺序为:");
while(list.Head->Next!=NULL)
{
for (i=1;i<now;++i)
{
list.Head=list.Head->Next;
}
PrintNode(list.Head->Next);
DelNode(list);
k=1;
}
}
if (j==2)
{
int a[10];
int i=0;
int p;
int q=0;
int w=0;
int total=0;
printf("请选择参加游戏的人物(每确定一个请按“Enter”,完成所有选择请输入“-1”):\n\n0.小明(00) 1.小华(01) 2.小张(02)\n3.小李(03) 4.小王(04) 5.小赵(05)\n6.小马(06) 7.小罗(07) 8.小宾(08)\n9.小段(09)\n");
while(i<9&&a[i-1]!=-1)
{
scanf("%d",&a[i]);
i++;
for (q=0;q<i-1;q++)
{
if (a[q]==a[i-1]||a[q]>9)
{
printf("你输入的人有重复或输入的编号人不存在,请重新输入:");
i=0;
}
}
}
for (p=0;p<i-1;p++)
{
printf("%d",a[p]);
}
w=i;
i=1;
LinkedList list;
Initlist(list);
while(i<9&&a[i-1]!=-1)
{
StudentRecord record;
InitRecord(record);
Node *node;
node=(Node*)malloc(sizeof(Node));
InitNode(node);
SetNode2(node,record,a[i-1]);
InsLast(list,node);
i++;
}
Node * s=(Node*)malloc(sizeof(Node));
s=list.Head;
printf("\n你输入的数据是:");
for (i=0;i<w-1;++i)
{
PrintNode(s->Next);
s=s->Next;
}
printf("\n请输入他们的报数上限:");
scanf("%d",&now);
Node *u;
u=(Node*)malloc(sizeof(Node));
u=FindLast(list);
u->Next=list.Head->Next;
printf("\n他们的出列顺序为:");
while(list.Head->Next!=NULL)
{
for (i=1;i<now;++i)
{
list.Head=list.Head->Next;
}
PrintNode(list.Head->Next);
DelNode(list);
}
}
}
}



我用的是Microsoft Visual Studio 2008编写的。就是程序用了一次,回到主菜单第二次用就会出现问题 提示如下
Windows has triggered a breakpoint in 22222.exe.

This may be due to a corruption of the heap, which indicates a bug in 22222.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while 22222.exe has focus.

The output window may have more diagnostic information.

用C++ 6.0则提示:
user breakpoint called from code at
...全文
209 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjjgg 2011-03-15
  • 打赏
  • 举报
回复
请问16楼的问题解决没 怎么弄啊 我最近也遇到这个问题
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
恩。我看了也是说这个地方。;可是不知道为什么
小楫轻舟 2010-07-29
  • 打赏
  • 举报
回复
刚调试了下,发现是main函数中malloc处报错,
还没查出原因,要下班了,抱歉,等高手。。。

while(i<total)
{
StudentRecord record;
InitRecord(record);
Node *node = NULL; //初始化
node=(Node*)malloc(sizeof(Node)); // 此处
InitNode(node);
SetNode1(node,record,i);
InsLast(list,node);
i++;
}
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
晕啊晕啊晕。有些电脑上运行时很正常的,就是我的电脑不行~~
jvs 2010-07-29
  • 打赏
  • 举报
回复
?经典的学生管理系统,用链表写的……慢慢改,花时间
WEBCONFIG 2010-07-29
  • 打赏
  • 举报
回复
刚才还偶尔报错,现在彻底不报错了。
不好意思,彻底没辙了。
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
可以帮我改下吗?谢谢
WEBCONFIG 2010-07-29
  • 打赏
  • 举报
回复
好像是Initlist这个函数中的问题。
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
是啊。我也很闷啊 啊
WEBCONFIG 2010-07-29
  • 打赏
  • 举报
回复
很诡异啊,我调试了一下。有的时候报错,有的时候不报错。
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
怎么我的编译器没有错误呢?? Microsoft Visual Studio 2008
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
上面的大侠。这是干什么、。本人很急。。。谢谢
bobo364 2010-07-29
  • 打赏
  • 举报
回复
我这里有一大堆的错,语法错误居多,用链表写这个确实不好写

编译器: Default GCC compiler
执行 gcc.exe...
gcc.exe "D:\C project\41.c" -o "D:\C project\41.exe" -I"D:\Dev-Cpp\Include" -L"D:\Dev-Cpp\Lib"
D:\C project\41.c:1:20: stdafx.h: No such file or directory
D:\C project\41.c:11: error: syntax error before '&' token
D:\C project\41.c: In function `InitRecord':
D:\C project\41.c:13: error: `record' undeclared (first use in this function)
D:\C project\41.c:13: error: (Each undeclared identifier is reported only once
D:\C project\41.c:13: error: for each function it appears in.)

D:\C project\41.c: At top level:
D:\C project\41.c:20: error: syntax error before "StudentRecord"
D:\C project\41.c:20: warning: no semicolon at end of struct or union
D:\C project\41.c:21: warning: data definition has no type or storage class
D:\C project\41.c:22: error: syntax error before '}' token
D:\C project\41.c:24: error: syntax error before '*' token

D:\C project\41.c: In function `InitNode':
D:\C project\41.c:26: error: `node' undeclared (first use in this function)
D:\C project\41.c: At top level:
D:\C project\41.c:30: error: syntax error before '*' token
D:\C project\41.c: In function `SetNode1':
D:\C project\41.c:32: error: `j' undeclared (first use in this function)
D:\C project\41.c:33: error: `node' undeclared (first use in this function)
D:\C project\41.c: At top level:
D:\C project\41.c:38: error: syntax error before '*' token
D:\C project\41.c: In function `SetNode2':
D:\C project\41.c:40: error: `Node' undeclared (first use in this function)
D:\C project\41.c:40: error: `node1' undeclared (first use in this function)
D:\C project\41.c:41: error: syntax error before ')' token
D:\C project\41.c:46: error: syntax error before ')' token
D:\C project\41.c:51: error: syntax error before ')' token
D:\C project\41.c:56: error: syntax error before ')' token
D:\C project\41.c:61: error: syntax error before ')' token
D:\C project\41.c:66: error: syntax error before ')' token
D:\C project\41.c:71: error: syntax error before ')' token
D:\C project\41.c:76: error: syntax error before ')' token
D:\C project\41.c:81: error: syntax error before ')' token
D:\C project\41.c:86: error: syntax error before ')' token
D:\C project\41.c:91: error: `node' undeclared (first use in this function)
D:\C project\41.c:91: error: `t' undeclared (first use in this function)
D:\C project\41.c: At top level:

D:\C project\41.c:97: error: syntax error before "Node"
D:\C project\41.c:97: warning: no semicolon at end of struct or union

D:\C project\41.c:99: error: syntax error before '}' token
D:\C project\41.c:101: error: syntax error before '&' token
D:\C project\41.c: In function `Initlist':
D:\C project\41.c:103: error: `list' undeclared (first use in this function)
D:\C project\41.c:103: error: `Node' undeclared (first use in this function)
D:\C project\41.c:103: error: syntax error before ')' token
D:\C project\41.c: At top level:

D:\C project\41.c:108: error: syntax error before '&' token
D:\C project\41.c: In function `InsLast':
D:\C project\41.c:110: error: `Node' undeclared (first use in this function)
D:\C project\41.c:110: error: `p' undeclared (first use in this function)
D:\C project\41.c:110: error: `list' undeclared (first use in this function)
D:\C project\41.c:115: error: `node' undeclared (first use in this function)
D:\C project\41.c: At top level:
D:\C project\41.c:120: error: syntax error before '*' token
D:\C project\41.c: In function `PrintNode':
D:\C project\41.c:122: error: `node' undeclared (first use in this function)
D:\C project\41.c: At top level:
D:\C project\41.c:130: error: syntax error before '&' token
D:\C project\41.c: In function `DelNode':
D:\C project\41.c:132: error: `Node' undeclared (first use in this function)
D:\C project\41.c:132: error: `p' undeclared (first use in this function)
D:\C project\41.c:132: error: `list' undeclared (first use in this function)
D:\C project\41.c:144: error: `q' undeclared (first use in this function)
D:\C project\41.c: At top level:
D:\C project\41.c:151: error: syntax error before '*' token
D:\C project\41.c:151: error: syntax error before '&' token
D:\C project\41.c: In function `FindLast':
D:\C project\41.c:153: error: `Node' undeclared (first use in this function)
D:\C project\41.c:153: error: `p' undeclared (first use in this function)
D:\C project\41.c:153: error: `list' undeclared (first use in this function)
D:\C project\41.c: In function `main':
D:\C project\41.c:189: error: `LinkedList' undeclared (first use in this function)
D:\C project\41.c:189: error: syntax error before "list"
D:\C project\41.c:190: error: `list' undeclared (first use in this function)
D:\C project\41.c:193: error: `StudentRecord' undeclared (first use in this function)
D:\C project\41.c:193: error: syntax error before "record"
D:\C project\41.c:194: error: `record' undeclared (first use in this function)
D:\C project\41.c:195: error: `Node' undeclared (first use in this function)
D:\C project\41.c:195: error: `node' undeclared (first use in this function)
D:\C project\41.c:196: error: syntax error before ')' token
D:\C project\41.c:202: error: `s' undeclared (first use in this function)
D:\C project\41.c:202: error: syntax error before ')' token
D:\C project\41.c:212: error: `q' undeclared (first use in this function)
D:\C project\41.c:213: error: syntax error before ')' token
D:\C project\41.c:256: error: syntax error before "list"
D:\C project\41.c:260: error: syntax error before "record"
D:\C project\41.c:263: error: syntax error before ')' token
D:\C project\41.c:269: error: syntax error before ')' token
D:\C project\41.c:279: error: `u' undeclared (first use in this function)
D:\C project\41.c:280: error: syntax error before ')' token

执行结束
Compilation Failed. Make ret
bobo364 2010-07-29
  • 打赏
  • 举报
回复
Node * s=(Node*)malloc(sizeof(Node));
s=list.Head;
printf("\n你输入的数据是:");
for (i=0;i<total;++i)
{
PrintNode(s->Next);
s=s->Next;
}
printf("\n\n输入报数上限:");
scanf("%d",&now);
Node *q;
q=(Node*)malloc(sizeof(Node));
q=FindLast(list);
q->Next=list.Head->Next;
printf("\n\n他们的出列顺序为:");
while(list.Head->Next!=NULL)
{
for (i=1;i<now;++i)
{
list.Head=list.Head->Next;
}
PrintNode(list.Head->Next);
DelNode(list);
k=1;
}
}
if (j==2)
{
int a[10];
int i=0;
int p;
int q=0;
int w=0;
int total=0;
printf("请选择参加游戏的人物(每确定一个请按“Enter”,完成所有选择请输入“-1”):\n\n0.小明(00) 1.小华(01) 2.小张(02)\n3.小李(03) 4.小王(04) 5.小赵(05)\n6.小马(06) 7.小罗(07) 8.小宾(08)\n9.小段(09)\n");
while(i<9&&a[i-1]!=-1)
{
scanf("%d",&a[i]);
i++;
for (q=0;q<i-1;q++)
{
if (a[q]==a[i-1]||a[q]>9)
{
printf("你输入的人有重复或输入的编号人不存在,请重新输入:");
i=0;
}
}
}
for (p=0;p<i-1;p++)
{
printf("%d",a[p]);
}
w=i;
i=1;
LinkedList list;
Initlist(list);
while(i<9&&a[i-1]!=-1)
{
StudentRecord record;
InitRecord(record);
Node *node;
node=(Node*)malloc(sizeof(Node));
InitNode(node);
SetNode2(node,record,a[i-1]);
InsLast(list,node);
i++;
}
Node * s=(Node*)malloc(sizeof(Node));
s=list.Head;
printf("\n你输入的数据是:");
for (i=0;i<w-1;++i)
{
PrintNode(s->Next);
s=s->Next;
}
printf("\n请输入他们的报数上限:");
scanf("%d",&now);
Node *u;
u=(Node*)malloc(sizeof(Node));
u=FindLast(list);
u->Next=list.Head->Next;
printf("\n他们的出列顺序为:");
while(list.Head->Next!=NULL)
{
for (i=1;i<now;++i)
{
list.Head=list.Head->Next;
}
PrintNode(list.Head->Next);
DelNode(list);
}
}
}
}
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
我就是不知道啊、、、麻烦高手帮我帮我啊
skyworth98 2010-07-29
  • 打赏
  • 举报
回复
貌似有什么地方有堆破环,多次free,还是缓冲区越界?
xiangyang891006 2010-07-29
  • 打赏
  • 举报
回复
还是有问题。麻烦再看下~~~
赵4老师 2010-07-29
  • 打赏
  • 举报
回复
在每个scanf前面加fflush(stdin);

69,373

社区成员

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

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