#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);
}
}
在VScode可以正常运行的代码,为什么在VS2010上运行不了?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- qzjhjxj 2021-12-23 14:33关注
没什么错误,几个输入函数里 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); } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
- ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
- ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
- ¥15 手机接入宽带网线,如何释放宽带全部速度