0x5293ED6C (msvcr110d.dll) (统计成绩2.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x0000000C 时
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<malloc.h>
typedef struct Date
{
char StudentName[20]; //姓名
char StudentID[20]; //学号
int Chinese; //语文成绩
int Math; //数学成绩
int English; //英语成绩
long Tote; //总分
}Data;
typedef struct Node
{
Data data;
struct Node * pNext;
}NODE, * LinkList;
int len; //全局变量,记录链表的长度
LinkList L = NULL; //定义链表
LinkList CreateList(); //创建链表,并录入学生信息
void TraverseList(LinkList); //遍历链表
void SortListTote(LinkList); //总分排序,由高到低
void SortListSID(LinkList); //学号排序,由低到高
void SearchListSID(LinkList); //按学号查询
void SearchListNID(LinkList); //按姓名查询
void SearchList_s(LinkList); //查询辅助函数
void TraverseList_s(LinkList); //排序显示辅助函数
int main()
{
int m;
system("cls");
printf("\t主菜单\t\n");
printf("\n");
printf("\t 1.输入学生信息\n");
printf("\t 2.学生总分统计\n");
printf("\t 3.总分排序\n");
printf("\t 4.查询\n");
printf("\t 5.列表显示\n");
printf("\t 6.退出本程序\n");
printf("\t 请选择(1-6):");
scanf("%d", &m);
fflush(stdin);/***清空缓存区,防止数据读取错误***/
do
{
switch(m)
{
case 1:
system("cls");
L = CreateList();
system("cls");
main();
break;
case 2:
printf("\t 学生信息为:\n");
TraverseList(L);
system("pause");
main();
break;
case 3:
SortListTote(L);
printf("\t 排序后的信息为:\n");
printf("\t 姓名\t 学号\t 语文\t 数学\t 英语\t 总分\n");
TraverseList(L);
printf("\n");
system("pause");
main();
break;
case 4:
SearchList_s(L);
printf("\n");
system("pause");
main();
break;
case 5:
TraverseList_s(L);
system("pause");
main();
break;
case 6: exit(0);
default: printf("错误命令"); getchar(); main();
}
}while(1);
return 0;
}
LinkList CreateList(void)
{
int i;
char ch;
LinkList list = (LinkList)malloc(sizeof(NODE));
if(list == NULL)
{
printf("error!exit!");
exit(-1);
}
LinkList pTail = list;
pTail->pNext = NULL;
printf("\t 请输入学生的个数:");
scanf("%d", &len);
ch = getchar();
for(i = 0; i < len; i++)
{
LinkList pNew = (LinkList)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("error!exit!");
exit(-1);
}
system("cls");
printf("\t 请输入第%d个学生姓名:", i + 1);
gets(pNew->data.StudentName);
printf("\t 请输入第%d个学生学号:", i + 1);
gets(pNew->data.StudentID);
printf("\t 请输入第%d个学生语文成绩:", i + 1);
scanf("%d", &pNew->data.Chinese);
printf("\t 请输入第%d个学生数学成绩:", i + 1);
scanf("%d", &pNew->data.Math);
printf("\t 请输入第%d个学生英语成绩:", i + 1);
scanf("%d", &pNew->data.English);
pNew->data.Tote = pNew->data.Chinese + pNew->data.Math + pNew->data.English;
ch = getchar();
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail= pNew;
}
return list;
}
void TraverseList(LinkList L)
{
LinkList p = L->pNext;
printf("\t 姓名\t 学号\t 语文\t 数学\t 英语\t 总分\n");
while (p)
{
printf("\t %s\t %s\t %d\t %d\t %d\t %ld\n", p->data.StudentName, p->data.StudentID, p->data.Chinese, p->data.Math, p->data.English, p->data.Tote);
p = p->pNext;
}
printf("\n");
}
void SortListTote(LinkList L)
{
LinkList p, q;
int i = 0;
while(i < len)
{
p = L;
q = L->pNext;
while(q->pNext != NULL)
{
if(q->data.Tote < q->pNext->data.Tote)
{
p->pNext = q->pNext;
q->pNext = p->pNext->pNext;
p->pNext->pNext = q;
q = p->pNext;
}
p = p->pNext;
q = q->pNext;
}
i++;
}
}
void SortListSID(LinkList L)
{
LinkList p, q;
int i = 0;
while(i < len)
{
p = L;
q = L->pNext;
while(q->pNext != NULL)
{
if(strcmp(p->data.StudentID, p->pNext->data.StudentID) > 0)
{
p->pNext = q->pNext;
q->pNext = p->pNext->pNext;
p->pNext->pNext = q;
q = p->pNext;
}
p = p->pNext;
q = q->pNext;
}
i++;
}
}
void TraverseList_s(LinkList L)
{
system("cls");
int choice;
printf("\t 请选择显示方式\n");
printf("\t 1.按学号显示\n");
printf("\t 2.按成绩显示\n");
printf("\t 请输入1-2的数字:");
scanf("%d", &choice);
switch(choice)
{
case 1:
SortListSID(L);
TraverseList(L);
break;
case 2:
SortListTote(L);
TraverseList(L);
break;
default:printf("输入有误,请重新输入!");TraverseList_s(L);
}
}
void SearchListSID(LinkList L, char stu[20])
{
LinkList p;
if(L == NULL)
printf("链表为空");
else
{
for(p = L->pNext; p!=NULL; p = p->pNext)
{
if(strcmp(p->data.StudentID, stu) == 0)
break;
}
if(p != NULL)
{
printf("\t 姓名\t 学号\t 语文\t 数学\t 英语\n");
printf("\t %s\t %s\t %s\n", p->data.StudentName, p->data.StudentID, p->data.Chinese, p->data.Math, p->data.English);
}
else
printf("未找到");
}
}
void SearchListNID(LinkList L, char stu[20])
{
LinkList p;
if(L == NULL)
printf("链表为空");
else
{
for(p = L->pNext; p!=NULL; p = p->pNext)
{
if(strcmp(p->data.StudentName, stu) == 0)
break;
}
if(p != NULL)
{
printf("\t 姓名\t 学号\t 语文\t 数学\t 英语\n");
printf("\t %s\t %s\t %s\n", p->data.StudentName, p->data.StudentID, p->data.Chinese, p->data.Math, p->data.English);
}
else
printf("未找到");
}
}
void SearchList_s(LinkList L)
{
int choice;
char stu[20];
char ch;
//LinkList li;
printf("\t 请选择查询方式\n");
printf("\t 1.按学号查询\n");
printf("\t 2.按姓名查询\n");
printf("\t 请输入1-2的数字:");
scanf("%d", &choice);
ch = getchar();
switch(choice)
{
case 1:
printf("\t 请输入你想查询的学生学号:");
gets(stu);
SearchListSID(L, stu);
break;
case 2:
printf("\t 请输入你想查询的学生姓名:");
gets(stu);
SearchListNID(L, stu);
break;
default:printf("输入错误!");system("pause");SearchList_s(L);
}
}
改的我都快崩溃了,我也不知道哪里有问题,大神们帮我看看,其他的没什么大问题,就是运行查询功能的时候就出错