[C] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int id;
int shuxue;
int yingyu;
int yuwen;
int wuli;
int huaxue;
struct node *next;
} LinkList;
// 初始化单链表
void InitList(LinkList *&L)
{
L = (LinkList *)malloc(sizeof(LinkList));
L->next = NULL; // 创建头结点,其next域置为NULL
}
// 输出单链表
void DispList(LinkList *L)
{
LinkList *p = L->next;
printf("<<<<<<<所有学生成绩>>>>>>>\n");
if (p == NULL)
{
printf("无学生数据!\n");
}
else
{
printf("学号\t数学\t英语\t语文\t物理\t化学\t总分\n");
while (p != NULL)
{
printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n", p->id,
p->shuxue, p->yingyu, p->yuwen, p->wuli, p->huaxue, p->shuxue + p->yingyu + p->yuwen + p->wuli + p->huaxue);
p = p->next;
}
}
}
// 直接尾部插入元素
int ListInsert(LinkList *&L, int id, int math, int english, int chinese, int physics, int chemistry)
{
LinkList *p = L, *s;
if (p == NULL) // 未找到第i-1个结点
return 0;
else
{
s = (LinkList *)malloc(sizeof(LinkList)); // 创建新结点*s
s->id = id;
s->shuxue = math;
s->yingyu = english;
s->yuwen = chinese;
s->wuli = physics;
s->huaxue = chemistry;
s->next = p->next;
p->next = s; // 将*s插入到*p之后
return 1;
}
}
// 搜索元素
int Search(LinkList *L, int e)
{
LinkList *p = L->next;
int n = 1;
while (p != NULL && p->id != e)
{
p = p->next;
n++;
}
if (p == NULL)
return 0;
else
return n;
}
// 删除数据元素
int ListDelete(LinkList *L, int e)
{
int j = 1; // 将j的初始值改为1
LinkList *p = L, *q;
while (j < e && p != NULL) // 修改循环条件
{
j++;
p = p->next;
}
if (p == NULL) // 未找到第i-1个结点
return 0;
else
{
q = p->next; // q指向要删除的结点
if (q == NULL)
return 0;
p->next = q->next; // 从单链表中删除*q结点
free(q); // 释放*q结点
return 1;
}
}
// 检测是否为数字
int check(int a)
{
if (a > 0 && a < 100000)
return 0;
else
{
getchar(); // 清除缓冲区的内容
return 1;
}
}
// 销毁单链表
void DestroyList(LinkList *&L)
{
LinkList *p = L, *q = p->next;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
// 根据学号查询成绩
void LocateElem(LinkList *L, int e)
{
LinkList *p = L->next;
while (p != NULL && p->id != e)
{
p = p->next;
}
if (p == NULL)
{
printf("未找到该学号的成绩!\n");
}
else
{
printf("学号\t数学\t英语\t语文\t物理\t化学\t总分\n");
printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n", p->id,
p->shuxue, p->yingyu, p->yuwen, p->wuli, p->huaxue, p->shuxue + p->yingyu + p->yuwen + p->wuli + p->huaxue);
}
}
// 主函数入口
int main()
{
printf("\t***欢迎使用学生成绩管理系统***\n");
LinkList *h;
int e, i;
int id, math, english, chinese, physics, chemistry;
InitList(h);
ex1:
printf("------------------------------------------------------------\n");
printf("\n\t *1录入成绩\n\t *2浏览所有人成绩\n\t *3根据学号查询成绩\n\t *4删除学生成绩\n\t *5退出程序\n");
printf("请选择要进行的操作(填入序号<1-5>): ");
scanf("%d", &i);
if (check(i)) // check函数的调用
{
printf("输入错误值,请重新选择!\n");
goto ex1;
}
printf("------------------------------------------------------------\n");
switch (i)
{
case 1: // 录入
ex2:
printf("请输入学号:");
ex3:
if (scanf("%d", &id) != 1) // 添加判断,检查输入是否为数字
{
printf("输入错误,请重新输入数字学号!\n");
while (getchar() != '\n') // 清空输入缓冲区
continue;
goto ex3;
}
if (check(id) || Search(h, id) != 0)
{
printf("当前输入学号已存在或输入的成绩中包含错误\n");
printf("请重新输入学号:");
goto ex3;
}
printf("请输入成绩(每门成绩请用空格或回车隔开):\n数学 英语 语文 物理 化学\n");
ex4:
if (scanf("%d %d %d %d %d", &math, &english, &chinese, &physics, &chemistry) != 5) // 添加判断,检查输入是否为数字
{
printf("输入错误,请重新输入数字成绩!\n");
while (getchar() != '\n') // 清空输入缓冲区
continue;
goto ex4;
}
if (check(math) || check(english) || check(chinese) || check(physics) || check(chemistry)) // check函数的调用
{
printf("输入的成绩中包含错误值;\n");
printf("请重新输入成绩(每门成绩请用空格或者回车隔开):\n数学 英语 语文 物理 化学\n");
goto ex4;
}
printf("确定输入录入!(1-是/其他数字-否):");
scanf("%d", &i);
if (i == 1)
{
if (ListInsert(h, id, math, english, chinese, physics, chemistry) == 1)
{
printf("录入成绩成功!\n");
}
}
else
{
printf("录入成绩失败!\n");
goto ex2;
}
goto ex1;
case 2: // 浏览
DispList(h);
goto ex1;
case 3: // 查找
ex5:
printf("请输入查询的学号:");
if (scanf("%d", &e) != 1) // 添加判断,检查输入是否为数字
{
printf("输入错误,请重新输入数字学号!\n");
while (getchar() != '\n') // 清空输入缓冲区
continue;
goto ex5;
}
if (check(id) == 1 || Search(h, id) == 0)
{
printf("当前输入学号不存在或输入错误信息\n");
printf("请重新输入学号:");
scanf("%d", &e);
goto ex5;
}
LocateElem(h, e);
goto ex1;
case 4: // 删除
ex6:
printf("请输入要删除的学号:");
if (scanf("%d", &e) != 1) // 添加判断,检查输入是否为数字
{
printf("输入错误,请重新输入数字学号!\n");
while (getchar() != '\n') // 清空输入缓冲区
continue;
goto ex6;
}
if (check(id) == 1 || Search(h, id) == 0)
{
printf("请重新输入学号:");
goto ex6;
}
if (ListDelete(h, e) == 1) // 修改此处的函数调用
{
printf("删除成功!\n");
}
else
{
printf("删除失败!\n");
}
goto ex1;
case 5:
DestroyList(h);
return 0;
default:
goto ex1;
}
}