#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 定义结构体存储学生信息
typedef struct student
{
char ID[20];
char Name[20];
char Sex[4];
int Math;
int English;
int C;
} Student;
// 单链表,一个节点存储一个学生信息
typedef struct node
{
struct node *next;/* 指向下一个节点的地址 */
Student data;/* 学生信息 */
} Node;
// 用于排序的单链表
typedef struct sorting
{
Node *address;/* 学生信息节点的地址 */
struct sorting *next;
} Sorting;
Node *init();/* 申请节点空间 */
void Menu(Node *head);/* 菜单 */
void Input(Node *head);/* 学生信息输入 */
void Input_ID(char *str);/* 学生ID输入,必须为纯数字,不能为空*/
void Input_Other(char *str);/* 其他信息输入,不能为为空 */
void Input_Sex(char *str);/* 性别输入,限制为男或女 */
int Input_Score();/* 成绩输入,0~100之间,不能为空 */
void Output(Node *head);/* 输出所有学生信息 */
void Output_By_Name(Node *head);/* 根据学生姓名输出 */
void Output_By_ID(Node *head);/* 根据学号输出 */
void Output_By_C(Node *head);/* 根据C语言从高到低输出 */
int main()
{
// 申请链表头结点地址,并初始化
Node *head = init();
head->next = NULL;
// 循环输出菜单
while (1)
{
// 清屏
system("CLS");
Menu(head);
// 按任意键下一步
system("PAUSE");
}
return 0;
}
Node *init()
{
Node *head;
// 分配空间
head = (Node *)malloc(sizeof(Node));
// 判断是否成功
if (head == NULL)
{
printf("申请内存空间失败!");
exit(0);
}
// 返回地址
return head;
}
void Menu(Node *head)
{
printf("欢迎使用学生成绩管理系统\n");
printf("1.增加学生信息 2.显示学生信息 3.从高到低显示C语言成绩 4.按学号查找\n");
printf("5.按姓名查找 0.退出系统\n");
printf("请输入你的选择:");
// 获取输入选项
int c;
fflush(stdin);
scanf("%d", &c);
switch (c)
{
case 1:
Input(head);
break;
case 2:
Output(head);
break;
case 3:
Output_By_C(head);
break;
case 4:
Output_By_ID(head);
break;
case 5:
Output_By_Name(head);
break;
default:
printf("输入信息有误,请重新输入!\n");
break;
}
}
void Input(Node *head)
{
int N;
printf("\n请输入要录入的学生数量:");
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
printf("\n现在添加第 %d 个学生数据!\n\n", i + 1);
//申请一个节点
Node *p = init();
p->next = NULL;
// 填充信息
printf("\n学号:");
Input_ID(p->data.ID);
printf("\n姓名:");
Input_Other(p->data.Name);
printf("\n性别:");
Input_Sex(p->data.Sex);
printf("\n数学成绩:");
p->data.Math = Input_Score();
printf("\n英语成绩:");
p->data.English = Input_Score();
printf("\nC语言成绩:");
p->data.C = Input_Score();
Node *a = head;
// 使a指向最后一个节点
while (a->next != NULL)
{
a = a->next;
}
// 将节点挂到链表最后
a->next = p;
printf("\n添加成功!\n\n");
}
}
void Input_ID(char *str)
{
fflush(stdin);
gets(str);
// 判断输入是否为纯数字
if (strspn(str, "0123456789") == strlen(str))
{
// 判断是否为空
if (strlen(str) == 0)
{
printf("\n学号不能为空,请重新输入:");
Input_ID(str);
}
}
else
{
printf("\n学号为纯数字,请重新输入:");
Input_ID(str);
}
}
void Input_Other(char *str)
{
fflush(stdin);
gets(str);
if (strlen(str) == 0)
{
printf("不能为空,请重新输入:");
Input_Other(str);
}
int i = 0, x = 0;
// 判断是否全部为为空格
while (str[i] != '\0')
{
if (str[i] == ' ')
x++;
i++;
}
if (i == x)
{
printf("不能全为空格,请重新输入:");
Input_Other(str);
}
}
void Input_Sex(char *str)
{
fflush(stdin);
gets(str);
if (strlen(str) == 0)
{
printf("不能为空,请重新输入:");
Input_Sex(str);
}
else if ((strcmp(str, "男") == 0) || (strcmp(str, "女") == 0))
{
return;
}
else
{
printf("内容不合规(男或女),请重新输入:");
Input_Sex(str);
}
}
int Input_Score()
{
fflush(stdin);
int a;
scanf("%d", &a);
if (a < 0 || a > 100)
{
printf("成绩取值范围在0~100之间!请重新输入:");
a = Input_Score();
}
return a;
}
void Output(Node *head)
{
Node *a;
a = head;
if (a->next == NULL)
{
printf("\n当前没有职工信息数据!\n\n");
return;
}
int math_H = 0, math_L = 101, math_sum = 0;
int english_H = 0, english_L = 101, english_sum = 0;
int c_H = 0, c_L = 101, c_sum = 0;
int i = 0;
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
while (a->next != NULL)
{
// 获取最高分
if (math_H < a->next->data.Math)
math_H = a->next->data.Math;
// 获取最低分
if (math_L > a->next->data.Math)
math_L = a->next->data.Math;
// 获取分数总和
math_sum += a->next->data.Math;
if (english_H < a->next->data.English)
english_H = a->next->data.English;
if (english_L > a->next->data.English)
english_L = a->next->data.English;
english_sum += a->next->data.English;
if (c_H < a->next->data.C)
c_H = a->next->data.C;
if (c_L > a->next->data.C)
c_L = a->next->data.C;
c_sum += a->next->data.C;
// 输出学生信息
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", a->next->data.ID, a->next->data.Name, a->next->data.Sex, a->next->data.Math, a->next->data.English, a->next->data.C);
a = a->next;
i++;
}
// 输出最高分,最低分,平均分
printf("\n%-10s %-10s %-10s %-15d %-15d %-15d\n", "", "最高分是", "", math_H, english_H, c_H);
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", "", "最低分是", "", math_L, english_L, c_L);
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", "", "平均成绩是", "", math_sum / i, english_sum / i, c_sum / i);
printf("\n");
}
void Output_By_C(Node *head)
{
if (head->next == NULL)
{
printf("\n信息为空,请输入信息后再进行此操作\n");
return;
}
Node *a = head->next;
// 初始化,并将第一个节点添加到排序链表
Sorting *h = (Sorting *)malloc(sizeof(Sorting));
Sorting *h1 = (Sorting *)malloc(sizeof(Sorting));
h->next = h1;
h1->address = a;
h1->next = NULL;
// 循环学生信息链表
while (a->next != NULL)
{
Node *x;
x = a->next;
// 判断C语言成绩是否小于等于当前节点,如果小于,则继续比较下一个节点,如果大于当前节点则退出
Sorting *b = h;
while (x->data.C <= b->next->address->data.C)
{
if (b->next->next == NULL)
{
break;
}
b = b->next;
}
// 创建一个新的节点,然后插入
Sorting *h2 = (Sorting *)malloc(sizeof(Sorting));
h2->address = x;
if (x->data.C <= b->next->address->data.C)
{
h2->next = b->next->next;
b->next->next = h2;
}
else
{
h2->next = b->next;
b->next = h2;
}
a = a->next;
}
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
while (h->next != NULL)
{
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", h->next->address->data.ID, h->next->address->data.Name, h->next->address->data.Sex, h->next->address->data.Math, h->next->address->data.English, h->next->address->data.C);
h = h->next;
}
}
void Output_By_ID(Node *head)
{
if (head->next == NULL)
{
printf("\n信息为空,请输入信息后再进行此操作\n");
return;
}
printf("\n请输入需要查询的学号:\n");
char str[20];
Input_Other(str);
Node *a;
a = head;
int i = 0;
while (a->next != NULL)
{
if (strcmp(str, a->next->data.ID) == 0)
{
if (i == 0)
{
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
}
i++;
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", a->next->data.ID, a->next->data.Name, a->next->data.Sex, a->next->data.Math, a->next->data.English, a->next->data.C);
}
a = a->next;
}
if (i == 0)
{
printf("没有学号为 %s 的学生,请核对后再输入!!\n", str);
}
}
void Output_By_Name(Node *head)
{
if (head->next == NULL)
{
printf("\n信息为空,请输入信息后再进行此操作\n");
return;
}
printf("\n请输入需要查询的姓名:\n");
char str[20];
Input_Other(str);
Node *a;
a = head;
int i = 0;
while (a->next != NULL)
{
if (strcmp(str, a->next->data.Name) == 0)
{
if (i == 0)
{
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
}
i++;
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", a->next->data.ID, a->next->data.Name, a->next->data.Sex, a->next->data.Math, a->next->data.English, a->next->data.C);
}
a = a->next;
}
if (i == 0)
{
printf("没有姓名为 %s 的学生,请核对后再输入!!\n", str);
}
}
没什么错误,几个输入函数里 gets()做了修改,供参考:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 定义结构体存储学生信息
typedef struct student
{
char ID[20];
char Name[20];
char Sex[4];
int Math;
int English;
int C;
} Student;
// 单链表,一个节点存储一个学生信息
typedef struct node
{
struct node* next;/* 指向下一个节点的地址 */
Student data;/* 学生信息 */
} Node;
// 用于排序的单链表
typedef struct sorting
{
Node* address;/* 学生信息节点的地址 */
struct sorting* next;
} Sorting;
Node* init();/* 申请节点空间 */
void Menu(Node* head);/* 菜单 */
void Input(Node* head);/* 学生信息输入 */
void Input_ID(char* str);/* 学生ID输入,必须为纯数字,不能为空*/
void Input_Other(char* str);/* 其他信息输入,不能为为空 */
void Input_Sex(char* str);/* 性别输入,限制为男或女 */
int Input_Score();/* 成绩输入,0~100之间,不能为空 */
void Output(Node* head);/* 输出所有学生信息 */
void Output_By_Name(Node* head);/* 根据学生姓名输出 */
void Output_By_ID(Node* head);/* 根据学号输出 */
void Output_By_C(Node* head);/* 根据C语言从高到低输出 */
int main()
{
// 申请链表头结点地址,并初始化
Node* head = init();
head->next = NULL;
// 循环输出菜单
while (1)
{
// 清屏
system("CLS");
Menu(head);
// 按任意键下一步
system("PAUSE");
}
return 0;
}
Node* init()
{
Node* head;
// 分配空间
head = (Node*)malloc(sizeof(Node));
// 判断是否成功
if (head == NULL)
{
printf("申请内存空间失败!");
exit(0);
}
// 返回地址
return head;
}
void Menu(Node* head)
{
printf("欢迎使用学生成绩管理系统\n");
printf("1.增加学生信息 2.显示学生信息 3.从高到低显示C语言成绩 4.按学号查找\n");
printf("5.按姓名查找 0.退出系统\n");
printf("请输入你的选择:");
// 获取输入选项
int c;
fflush(stdin);
scanf("%d", &c);
switch (c)
{
case 1:
Input(head);
break;
case 2:
Output(head);
break;
case 3:
Output_By_C(head);
break;
case 4:
Output_By_ID(head);
break;
case 5:
Output_By_Name(head);
break;
default:
printf("输入信息有误,请重新输入!\n");
break;
}
}
void Input(Node* head)
{
int N;
printf("\n请输入要录入的学生数量:");
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
printf("\n现在添加第 %d 个学生数据!\n\n", i + 1);
//申请一个节点
Node* p = init();
p->next = NULL;
// 填充信息
printf("\n学号:");
Input_ID(p->data.ID);
printf("\n姓名:");
Input_Other(p->data.Name);
printf("\n性别:");
Input_Sex(p->data.Sex);
printf("\n数学成绩:");
p->data.Math = Input_Score();
printf("\n英语成绩:");
p->data.English = Input_Score();
printf("\nC语言成绩:");
p->data.C = Input_Score();
Node* a = head;
// 使a指向最后一个节点
while (a->next != NULL)
{
a = a->next;
}
// 将节点挂到链表最后
a->next = p;
printf("\n添加成功!\n\n");
}
}
void Input_ID(char* str)
{
fflush(stdout); rewind(stdin);//fflush(stdin);
gets_s(str,20); //gets(str);
// 判断输入是否为纯数字
if (strspn(str, "0123456789") == strlen(str))
{
// 判断是否为空
if (strlen(str) == 0)
{
printf("\n学号不能为空,请重新输入:");
Input_ID(str);
}
}
else
{
printf("\n学号为纯数字,请重新输入:");
Input_ID(str);
}
}
void Input_Other(char* str)
{
fflush(stdout); rewind(stdin);//fflush(stdin);
gets_s(str,20); //gets(str);
if (strlen(str) == 0)
{
printf("不能为空,请重新输入:");
Input_Other(str);
}
int i = 0, x = 0;
// 判断是否全部为为空格
while (str[i] != '\0')
{
if (str[i] == ' ')
x++;
i++;
}
if (i == x)
{
printf("不能全为空格,请重新输入:");
Input_Other(str);
}
}
void Input_Sex(char* str)
{
fflush(stdout); rewind(stdin);//fflush(stdin);
gets_s(str,4); //gets(str);
if (strlen(str) == 0)
{
printf("不能为空,请重新输入:");
Input_Sex(str);
}
else if ((strcmp(str, "男") == 0) || (strcmp(str, "女") == 0))
{
return;
}
else
{
printf("内容不合规(男或女),请重新输入:");
Input_Sex(str);
}
}
int Input_Score()
{
fflush(stdout); rewind(stdin);// fflush(stdin);
int a;
scanf("%d", &a);
if (a < 0 || a > 100)
{
printf("成绩取值范围在0~100之间!请重新输入:");
a = Input_Score();
}
return a;
}
void Output(Node* head)
{
Node* a;
a = head;
if (a->next == NULL)
{
printf("\n当前没有职工信息数据!\n\n");
return;
}
int math_H = 0, math_L = 101, math_sum = 0;
int english_H = 0, english_L = 101, english_sum = 0;
int c_H = 0, c_L = 101, c_sum = 0;
int i = 0;
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
while (a->next != NULL)
{
// 获取最高分
if (math_H < a->next->data.Math)
math_H = a->next->data.Math;
// 获取最低分
if (math_L > a->next->data.Math)
math_L = a->next->data.Math;
// 获取分数总和
math_sum += a->next->data.Math;
if (english_H < a->next->data.English)
english_H = a->next->data.English;
if (english_L > a->next->data.English)
english_L = a->next->data.English;
english_sum += a->next->data.English;
if (c_H < a->next->data.C)
c_H = a->next->data.C;
if (c_L > a->next->data.C)
c_L = a->next->data.C;
c_sum += a->next->data.C;
// 输出学生信息
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", a->next->data.ID, a->next->data.Name, a->next->data.Sex, a->next->data.Math, a->next->data.English, a->next->data.C);
a = a->next;
i++;
}
// 输出最高分,最低分,平均分
printf("\n%-10s %-10s %-10s %-15d %-15d %-15d\n", "", "最高分是", "", math_H, english_H, c_H);
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", "", "最低分是", "", math_L, english_L, c_L);
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", "", "平均成绩是", "", math_sum / i, english_sum / i, c_sum / i);
printf("\n");
}
void Output_By_C(Node* head)
{
if (head->next == NULL)
{
printf("\n信息为空,请输入信息后再进行此操作\n");
return;
}
Node* a = head->next;
// 初始化,并将第一个节点添加到排序链表
Sorting* h = (Sorting*)malloc(sizeof(Sorting));
Sorting* h1 = (Sorting*)malloc(sizeof(Sorting));
h->next = h1;
h1->address = a;
h1->next = NULL;
// 循环学生信息链表
while (a->next != NULL)
{
Node* x;
x = a->next;
// 判断C语言成绩是否小于等于当前节点,如果小于,则继续比较下一个节点,如果大于当前节点则退出
Sorting* b = h;
while (x->data.C <= b->next->address->data.C)
{
if (b->next->next == NULL)
{
break;
}
b = b->next;
}
// 创建一个新的节点,然后插入
Sorting* h2 = (Sorting*)malloc(sizeof(Sorting));
h2->address = x;
if (x->data.C <= b->next->address->data.C)
{
h2->next = b->next->next;
b->next->next = h2;
}
else
{
h2->next = b->next;
b->next = h2;
}
a = a->next;
}
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
while (h->next != NULL)
{
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", h->next->address->data.ID, h->next->address->data.Name, h->next->address->data.Sex, h->next->address->data.Math, h->next->address->data.English, h->next->address->data.C);
h = h->next;
}
}
void Output_By_ID(Node* head)
{
if (head->next == NULL)
{
printf("\n信息为空,请输入信息后再进行此操作\n");
return;
}
printf("\n请输入需要查询的学号:\n");
char str[20];
Input_Other(str);
Node* a;
a = head;
int i = 0;
while (a->next != NULL)
{
if (strcmp(str, a->next->data.ID) == 0)
{
if (i == 0)
{
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
}
i++;
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", a->next->data.ID, a->next->data.Name, a->next->data.Sex, a->next->data.Math, a->next->data.English, a->next->data.C);
}
a = a->next;
}
if (i == 0)
{
printf("没有学号为 %s 的学生,请核对后再输入!!\n", str);
}
}
void Output_By_Name(Node* head)
{
if (head->next == NULL)
{
printf("\n信息为空,请输入信息后再进行此操作\n");
return;
}
printf("\n请输入需要查询的姓名:\n");
char str[20];
Input_Other(str);
Node* a;
a = head;
int i = 0;
while (a->next != NULL)
{
if (strcmp(str, a->next->data.Name) == 0)
{
if (i == 0)
{
printf("\n%-10s %-10s %-10s %-15s %-15s %-15s\n", "学号", "姓名", "性别", "数学成绩", "英语成绩", "C语言成绩");
}
i++;
printf("%-10s %-10s %-10s %-15d %-15d %-15d\n", a->next->data.ID, a->next->data.Name, a->next->data.Sex, a->next->data.Math, a->next->data.English, a->next->data.C);
}
a = a->next;
}
if (i == 0)
{
printf("没有姓名为 %s 的学生,请核对后再输入!!\n", str);
}
}
代码没有?