C语言链表问题,在经过查询语句之后想再次输出或查询信息直接崩溃

C语言 码拜 4年前 (2016-09-18) 434次浏览
一下为完整代码,还没有完成,在这里遇到了问题,求大家帮帮忙,看看吧,有点长。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
int n;
struct student {
char name[20];
int xh;//学号
int  bj;//班级
double eng;//英语
double math;//数学
double C;//C语言
double datab;//数据库
double sjjg;//数据结构
double avg;//平均
double sum;// 总分
struct student *next;//指向下一个节点
};
typedef struct student student;
student *create_list();
void add(student *head,student *newnode);
void print_list(student *head);
student *search(student *head);
void searchmeun();
//viod insert (student *head, student *newnode);
void print();
//***************************************************
int main() {
int g;
student *head=NULL,*p,*newnode;
//显示主菜单 (1)
while(1) { //选择主菜单 (2)
system(“cls”);
print();
// fflush(stdin);
printf(“请输入对应命令\n”);
scanf(“%d”,&g);
switch(g) {
case 1:
fflush(stdin);//–清空缓存区
//system(“cls”);清屏
student * head, * p, * q;
head=create_list();//调用链表   创建链表
system(“cls”);
break;
case 2:
fflush(stdin);
// system(“cls”);
newnode=(student*)malloc(sizeof(student));
printf(“请输入姓名\n”) ;
gets(newnode->name);
printf(“请输入学号:”);
scanf(“%d”,&newnode->xh);
printf(“请输入班级:”);
scanf(“%d”,&newnode->bj);
printf(“请输入英语成绩:”);
scanf(“%lf”,&newnode->eng);
printf(“请输入高数成绩:”);
scanf(“%lf”,&newnode->math);
printf(“请输入C语言成绩:”);
scanf(“%lf”,&newnode->C);
printf(“请输入数据库成绩:”);
scanf(“%lf”,&newnode->datab);
printf(“请输入数据结构成绩:”);
scanf(“%lf”,&newnode->sjjg);
newnode->sum=newnode->eng+newnode->math+newnode->C+newnode->datab+newnode->sjjg;//总分
newnode->avg=(newnode->eng+newnode->math+newnode->C+newnode->datab+newnode->sjjg)/5.0;//平均分
add(head,newnode);printf(“已增加录入一名学生信息\n”);
printf(“按任意键继续\n”);
getchar();// 任意输入一个字符
system(“cls”);
break;
case 3:
// system(“cls”);
fflush(stdin);
print_list(head);
printf(“按任意键继续\n”);
getchar();
break;
case 4:
fflush(stdin);
system(“cls”);
n=1;
while(n) {
searchmeun();
head = search(head);
printf(“按任意键继续\n”);
getchar();
}
break;
case 0:
exit(0);
break;
}
}
free(head);
head=NULL;
return 0;
}
//*******************************************************
student * create_list() { //创建链表函数
student *head,*p,*q;
char name1[20];
head =(student*)malloc(sizeof(student));
if(NULL==head) {//判断能否申请成功
free(head);
return NULL;
}
fflush(stdin);
q=head;
printf(“请输入学生姓名\n”);
gets(name1);
while (strlen(name1)!=0) {//判断输入然否有效
p=(student*)malloc(sizeof(student));
if(NULL==p)
return head;
strcpy(p->name,name1);
printf(“请输入学号:\n”);
scanf(“%d”,&p->xh);
printf(“请输入班级:\n”);
scanf(“%d”,&p->bj);
printf(“请输入英语成绩:\n”);
scanf(“%lf”,&p->eng);
printf(“请输入高数成绩:\n”);
scanf(“%lf”,&p->math);
printf(“请输入C语言成绩:\n”);
scanf(“%lf”,&p->C);
printf(“请输入数据库成绩:\n”);
scanf(“%lf”,&p->datab);
printf(“请输入数据结构成绩:\n”);
scanf(“%lf”,&p->sjjg);
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;//总分
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5;//平均分
q->next =p;//通过复制的头节点进行移动
q=p;
printf(“继续录入请再次输入学生姓名,否则回车结束!\n”);
fflush(stdin);//–清空缓冲区
gets(name1);//进入下一个节点
}
// printf(“创建成功!\n”);
q->next = NULL;
system(“cls”);
return head;
}
//******************************************************
void add(student *head,student *newnode) { //添加学生信息
fflush(stdin);
student *q,*p;
q=head;
if(head==NULL) head=(student * )(malloc(sizeof(student)));
p=head->next;
while (p!=NULL) {
if(strcmp(p->name, newnode->name)>0)//升序
break;
else {
p=p->next;
q=q->next; //寻找下一个节点
}
}
q->next = newnode;
newnode->next = p;
}
//*******************************************************
void print_list(student *head) { //输出学生信息
student *p;
printf(“\n学生成绩如下\n”);
printf(“姓名     学号     班级     英语     高数     C语言     数据库     数据结构     总分     平均分\n”);
p=head->next;
while(p!=NULL) {
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf(“%s”,p->name);
printf(“%8d%8d%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf\n”,p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
p=p->next;
}
// while(p!=NULL);
}
//****************************************************
student *search(student *head) { //查找学生信息
fflush(stdin);//–清空缓存区
student *p;
p=(student*)malloc(sizeof(student));
p=head;
int s;
scanf(“%d”,&s);
switch(s) {
case 1: {
fflush(stdin);
// system(“cls”);
printf(“正在使用学号查找信息\n请输入学号\n”);
int  y=0;//表示输入所查询的学号
scanf(“%d”,&y);
while (p!=NULL) {
if(p->xh==y) { //找到
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf(“%s”,p->name);
printf(“%8d%8d%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf\n”,p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
break;
} else
p=p->next;//指向下一个  由while进行遍历 直到最后
}
// break;
}
n=1;
print_list(head);
getchar();
//  Sleep(10000);
break;
case 2: {
fflush(stdin);
// system(“cls”);
char k[20]= {0};
printf(“正在使用姓名查找信息\n请输入姓名\n”);
gets(k) ;//输入所查询的姓名
while (p!=NULL) {
if(strcmp(p->name,k)==0) { //找到
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf(“%s”,p->name);
printf(“%8d%8d%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf\n”,p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
break;
} else
p=p->next;//指向下一个  由while进行遍历 直到最后
}
}
n=1;
// getchar();
break;
case 3: {
fflush(stdin);
// system(“cls”);
int cla=0;
printf(“正在使用班级查找信息\n请输入班级\n”);
scanf(“%lf”,&cla);
while (p!=NULL) {
if(p->bj==cla) { //找到
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf(“%s”,p->name);
printf(“%8d%8d%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf%8.0lf\n”,p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
p=p->next;
} else
p=p->next;//指向下一个  由while进行遍历 直到最后
}
// getchar();
// break;
}
n=1;
getchar ();
break;
// case 4:
//     system(“cls”);
case 0:
fflush(stdin);
system(“cls”);
n=0;
break;
default:
fflush(stdin);
printf(“输入有误!\n”);
n=1;
break;
printf(“未找到该信息\n”);
}
// break;
// }
}
//******************************************************
//*******************************************************
//***********************************************************
//*********************************************************
void print() { //显示
system(“cls”);//清屏
printf(“+======================================+\n”);
printf(“|      制作人:  15110100524  李旭      |\n”);
printf(“+======================================+\n”);
printf(“|    学 生 成 绩 管 理 系 统 主 菜 单  |\n”);
printf(“+======================================+\n”);
printf(“|    1  重新输入全部学生信息           |\n”);
printf(“|    2  补充输入一个学生信息           |\n”);
printf(“|    3  输出全部成绩                   |\n”);
printf(“|    4  查询子程序                     |\n”);
printf(“|    5  统计汇总子系统                |\n”);
printf(“|    6  排序子系统                     |\n”);
printf(“+======================================+\n”);
printf(“|    7  数据存盘                       |\n”);
printf(“|    8  读入学生信息                   |\n”);
printf(“+======================================+\n”);
printf(“|    0  退出系统                       |\n”);
printf(“+======================================+\n”);
}
//*********************************************************
void  searchmeun() { //查询子菜单
system(“cls”);
printf(“+======================================+\n”);
printf(“|    查  询  子  系  统  主  菜  单    |\n”);
printf(“+======================================+\n”);
printf(“|    1   按学号查询                    |\n”);
printf(“|    2   按姓名查询                    |\n”);
printf(“|    3   按班级查询                    |\n”);
printf(“|    4   扩展查询功能                  |\n”);
printf(“+======================================+\n”);
printf(“|    0   返回上一级                    |\n”);
printf(“+======================================+\n”);
printf(“\n”);
printf(“请输入命令:”);
}
C语言链表问题,在经过查询语句之后想再次输出或查询信息直接崩溃C语言链表问题,在经过查询语句之后想再次输出或查询信息直接崩溃C语言链表问题,在经过查询语句之后想再次输出或查询信息直接崩溃
解决方案

80

你的 search 函数没有返回一个值

80

1.search没有返回值
2.你main函数的head也有问题,switch外面有一个head,case1里面又有一个?
PS:你可以单步调试看看每一步的值是不是正确,经过查询语句之后你再输出崩溃了。
你可以打印下调用search前后的head地址是不是变了(甚至可以打印每个节点的地址),就知道问题了
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言链表问题,在经过查询语句之后想再次输出或查询信息直接崩溃
喜欢 (0)
[1034331897@qq.com]
分享 (0)