编程高手请帮忙,程序回主菜单运行第二次就会出错
#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