0x5293ED6C (msvcr110d.dll) (统计成绩2.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x0000000C 时

mildzfx 2018-01-10 01:08:43
# 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);
}

}


改的我都快崩溃了,我也不知道哪里有问题,大神们帮我看看,其他的没什么大问题,就是运行查询功能的时候就出错
...全文
796 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-11
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
缘来是梦 2018-01-10
  • 打赏
  • 举报
回复
if(q->data.Tote < q->pNext->data.Tote) { p->pNext = q->pNext; q->pNext = p->pNext->pNext; p->pNext->pNext = q; q = p->pNext; } 排序里的这段代码是有问题的.
赵4老师 2018-01-10
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
  • 打赏
  • 举报
回复
这种情况很明显是,指针未初始化就使用,或者销毁后继续使用造成的。 终端,跟踪一下就好了。
mildzfx 2018-01-10
  • 打赏
  • 举报
回复
别沉啊,各位大佬,

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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