#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define strcpy strcpy_s
//定义基本结构体
struct sorenote
{
int number; //学号
char name[10]; //姓名
float chinese; //语文成绩
float mathmatic; //数学成绩
float english; //英语成绩
struct sorenote *next=NULL;
};
typedef struct sorenote sore;
//链表节点计数
int jishu(sore*p)
{
int n = 0;
while (p!=NULL)
{
n = n + 1;
p = p->next;
}
return n;
}
//输入或添加学生信息
sore *shuru(sore*head)
{
sore *p1, *p2, *p3;
p2 = head;
if (head != NULL)
{
p2 = head;//取链表头指针
while (head != NULL)
{
head = head->next;
}
p1 = head = (sore*)malloc(sizeof(sore));
}
else
{
p1 = p2 = head = (sore*)malloc(sizeof(sore));
}
printf("请输入学生资料(输入0退出)!\n");
while (1)
{
repeat1:
printf("请输入学生学号(学号应大于0):");
scanf_s("%d", &p1->number);
while (p1->number < 0)
{
getchar();
printf("输入错误,请重新输入学生学号(输入0退出):");
scanf_s("%d", &p1->number);
}
if (p1->number == 0)
{
return p2;
}
else
{
p3 = p2;
int n;
n=jishu(p3);
if (n > 0)
{
for (int i = 0; i < n; i++)
{
if (p1->number != p3->number)
{
p3 = p3->next;
}
else
{
printf("学号重复,请重新输入!\n");
goto repeat1;
}
}
}
}
printf("请输入学生姓名:");
scanf_s("%s", &p1->name,10);
printf("请输入语文成绩(0~100):");
scanf_s("%f", &p1->chinese);
for (; p1->chinese < 0 || p1->chinese > 100;)
{
getchar();
printf("输入错误,请重新输入语文成绩:");
scanf_s("%f", &p1->chinese);
}
printf("请输入数学成绩(0~100):");
scanf_s("%f", &p1->mathmatic);
for (; p1->mathmatic < 0 || p1->mathmatic > 100;)
{
getchar();
printf("输入错误,请重新输入数学成绩:");
scanf_s("%f", &p1->mathmatic);
}
printf("请输入英语成绩(0~100):");
scanf_s("%f", &p1->english);
for (; p1->english < 0 || p1->english> 100;)
{
getchar();
printf("输入错误,请重新输入英语成绩:");
scanf_s("%f", &p1->english);
}
p1 = p1->next = (sore*)malloc(sizeof(sore));
}
return p2;
}
//链表按学号排序
sore *paixu(sore *head)
{
int n, k;
n = jishu(head);
float fen;
char t[10];
sore *p1, *p3, *max;
p1 = head;
p3 = head;
//冒泡排序学号
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
max = p1;
p1 = p1->next;
if (max->number > p1->number)
{
//交换节点学号
k = max->number;
max->number = p1->number;
p1->number = k;
//交换节点姓名
strcpy(t, max->name);
strcpy(max->name, p1->name);
strcpy(p1->name, t);
//交换节点语数外成绩
fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
fen = max->english; max->english = p1->english; p1->english = fen;
}
}
max = head;
p1 = head;
}
return head;
}
//链表按姓名排序
sore *namepaixu(sore *head)
{
int n,k;
n = jishu(head);
float fen;
char t[10];
sore *p1, *p3, *max;
p1 = head;
p3 = head;
//冒泡排序学号
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
max = p1;
p1 = p1->next;
if (strcmp(max->name , p1->name)>0)
{
//交换节点学号
k = max->number;
max->number = p1->number;
p1->number = k;
//交换节点姓名
strcpy(t, max->name);
strcpy(max->name, p1->name);
strcpy(p1->name, t);
//交换节点语数外成绩
fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
fen = max->english; max->english = p1->english; p1->english = fen;
}
}
max = head;
p1 = head;
}
return head;
}
//链表按语文成绩排序
sore *chinesepaixu(sore *head)
{
int n,k;
n = jishu(head);
float fen;
char t[10];
sore *p1, *p3, *max;
p1 = head;
p3 = head;
//冒泡排序学号
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
max = p1;
p1 = p1->next;
if (max->chinese > p1->chinese)
{
//交换节点学号
k = max->number;
max->number = p1->number;
p1->number = k;
//交换节点姓名
strcpy(t, max->name);
strcpy(max->name, p1->name);
strcpy(p1->name, t);
//交换节点语数外成绩
fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
fen = max->english; max->english = p1->english; p1->english = fen;
}
}
max = head;
p1 = head;
}
return head;
}
//链表按数学成绩排序
sore *mathpaixu(sore *head)
{
int n,k;
n = jishu(head);
float fen;
char t[10];
sore *p1, *p3, *max;
p1 = head;
p3 = head;
//冒泡排序学号
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
max = p1;
p1 = p1->next;
if (max->mathmatic > p1->mathmatic)
{
//交换节点学号
k = max->number;
max->number = p1->number;
p1->number = k;
//交换节点姓名
strcpy(t, max->name);
strcpy(max->name, p1->name);
strcpy(p1->name, t);
//交换节点语数外成绩
fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
fen = max->english; max->english = p1->english; p1->english = fen;
}
}
max = head;
p1 = head;
}
return head;
}
//链表按英语成绩排序
sore *englishpaixu(sore *head)
{
int n, k;
n = jishu(head);
float fen;
char t[10];
sore *p1, *p3, *max;
p1 = head;
p3 = head;
//冒泡排序学号
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
max = p1;
p1 = p1->next;
if (max->english > p1->english)
{
//交换节点学号
k = max->number;
max->number = p1->number;
p1->number = k;
//交换节点姓名
strcpy(t, max->name);
strcpy(max->name, p1->name);
strcpy(p1->name, t);
//交换节点语数外成绩
fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
fen = max->english; max->english = p1->english; p1->english = fen;
}
}
max = head;
p1 = head;
}
return head;
}
//生成链表
sore *creatlink()
{
sore *head=NULL;
head = shuru(head); //生成链表,写入链表数据
head = paixu(head); //链表排序
printf("输入学生个数为:%d个!\n",jishu(head));
printf("生成完成,已退出");
return head;
}
//显示学生信息
void print(sore *head)
{
int n,k;
sore *p;
if (head == NULL)
{
printf("\n没有任何学生资料\n");
}
else
{
printf("%d\n", jishu(head));
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n");
printf("-----------------------------------------\n");
p = head;
for (; p->next == NULL;)
{
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english);
printf("-----------------------------------------\n");
p = p->next;
}
}
printf("显示完毕");
}
//添加学生数据
sore *add(sore*head)
{
head = shuru(head); //添加学生数据
head = paixu(head); //链表排序
printf("现在学生数为:%d个!",jishu(head));
return 0;
}
//查询学生成绩
sore *search(sore *head)
{
int number;
sore *p1;
if (head == NULL)
{
printf("\n没有学生资料!\n");
return head;
}
while (1)
{
printf("输入要查询的学生的学号(输入0退出):");
scanf_s("%d", &number);
getchar();
if (number == 0)
{
break;
}
else
{
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n");
printf("-----------------------------------------\n");
p1 = head;
while (p1->number != number && p1->next != NULL)
{
p1 = p1->next;
}
if (p1->number == number)
{
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english);
printf("-----------------------------------------\n");
}
else
{
printf("%d不存在此学生!\n", number);
}
}
}
printf("已经退出!\n");
return 0;
}
//删除数据
sore *dele(sore *head)
{
int number;
sore *p1,*p2;
if (head == NULL)
{
printf("\n没有学生资料!\n");
return head;
}
while (1)
{
printf("输入要删除的学生的学号(输入0退出):");
scanf_s("%d", &number);
getchar();
if (number == 0)
{
break;
}
else
{
p1 = head;
p2 = head;
while (p1->number != number && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p1->number == number)
{
p2->next = p1->next;
free(p1);
}
else
{
printf("%d不存在此学生!\n", number);
}
}
}
printf("已经退出!\n");
return head;
}
//链表排序
sore *sortdata(sore *head)
{
int n;
if (head == NULL)
{
printf("\n没有任何学生资料!\n");
}
else
{
for (int i = 0; i < 80; i++)
{
printf("*");
}
printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n");
printf("4按数学成绩排序\t5按英语成绩排序\t\n");
for (int i = 0; i < 80; i++)
{
printf("*");
}
printf("请选择操作:");
scanf_s("%d", &n);
getchar();
switch (n)
{
case 1:head = paixu(head); break;
case 2:head = namepaixu(head); break;
case 3:head = chinesepaixu(head); break;
case 4:head = mathpaixu(head); break;
case 5:head = englishpaixu(head); break;
default:printf("输入错误请重新输入");
}
print(head);
}
return head;
}
//保存数据
int save(sore *p1)
{
int n;
FILE *fp;
char filepn[20]; //存放文件名及保存路径
printf("请输入文建路径及文件名:");
scanf_s("%s", filepn,20);
n = fopen_s(&fp, filepn, "w+");
if (n!=0)
{
printf("文件无法打开!\n");
return 0;
}
while (p1 != NULL)
{
fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english);
p1 = p1->next;
}
fclose(fp);
printf("文件已保存!\n");
return 0;
}
//从文件读取数据
sore *loadfile()
{
int n;
sore *p1, *p2;
char filepn[20]; //存放文件名及保存路径
FILE *fp;
printf("请输入文件路径及文件名:");
scanf_s("%s", &filepn,20);
n= fopen_s(&fp,filepn, "r+");
if ( n!= 0)
{
printf("无法打开文件!\n");
return 0;
}
printf(" 学生成绩管理系统 \n");
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n");
printf("-----------------------------------------\n");
p1 = p2 = (sore *)malloc(sizeof(sore));
do
{
fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english);
printf("-----------------------------------------\n");
p1=p1->next= (sore *)malloc(sizeof(sore));
} while (!feof(fp));
free(p1);
fclose(fp);
return p2;
}
//菜单
int menu()
{
int a=0;
int i;
printf("\t\t\t\t学生管理系统\n");
printf("\n");
for (i = 0; i < 80; i++)
{
printf("*");
}
printf("\n");
printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n");
printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n");
printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n");
for (i = 0; i < 80; i++)
{
printf("*");
}
printf("\n");
printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):");
scanf_s("%d", &a);
getchar();
return a;
}
//成绩统计
sore *tongji(sore *head)
{
float sum1=0, sum2=0, sum3=0;
float ave1=0, ave2=0, ave3=0;
float max=0, min=0;
char maxname[10], minname[10];
sore *p;
p = head;
int x, y = 0;
printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n");
scanf_s("%d", &x);
getchar();
if (head == NULL)
{
printf("\n没有学生资料!\n");
return 0;
}
else
{
switch (x)
{
case 1:
printf("---------------------------------------------------------\n");
printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n");
printf("---------------------------------------------------------\n");
while (p != NULL)
{
sum1 = p->chinese + p->mathmatic + p->english;
ave1 = sum1 / 3;
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1);
printf("---------------------------------------------------------\n");
p = p->next;
}
break;
case 2:
while (p != NULL)
{
sum1 = sum1 + p->chinese;
sum2 = sum2 + p->mathmatic;
sum3 = sum3 + p->english;
}
y = jishu(head);
ave1 = sum1 / y;
ave2 = sum2 / y;
ave3 = sum3 / y;
printf("语文平均分是:%.1f\n", ave1);
printf("数学平均分是:%.1f\n", ave2);
printf("英语平均分是:%.1f\n", ave3);
break;
case 3:
for (int i = 0; i < jishu(head); i++)
{
sum1 = p->chinese + p->mathmatic + p->english;
if (max < sum1)
{
max = sum1;
strcpy(maxname, p->name);
}
if (min < sum1)
{
min = sum1;
strcpy(minname, p->name);
}
p = p->next;
}
printf("最高分为:%.1f,姓名:%s\n", max, maxname);
printf("最低分为:%.1f,姓名:%s\n", min, minname);
break;
default:printf("输入错误,请重新输入!\n");
}
}
return 0;
}
//主函数
int main()
{
int k;
sore *head =NULL,*stu=NULL;
k = 100;
while (k!=0)
{
k = menu();
switch (k)
{
case 1:head = creatlink(); break;
case 2:print(head); break;
case 3:search(head); break;
case 4:head = add(head); break;
case 5:head = dele(head); break;
case 6:head = sortdata(head); break;
case 7:save(head); break;
case 8:tongji(head); break;
case 9:head = loadfile(); break;
case 0:return 0;
default:printf("输入错误,请重新输入!\n");
}
}
}
c语言使用malloc导致程序退出,问题zai第37行到第50行
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- Toblerone_Wind 2019-07-27 17:40关注
这种问题一般都是自己找的,我看了下你的代码,觉得你对链表的掌握还是有点欠缺,而且代码结构性比较差。
出错方面看看书吧,也可以写一个小demo自己试着调。
看样子你是在写学生信息管理系统,如果有需要我可以发你一份。解决 无用评论 打赏 举报
悬赏问题
- ¥15 c程序不知道为什么得不到结果
- ¥40 复杂的限制性的商函数处理
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置