以前帮一个大学生做的毕业考试,当时他是数据结构的考试吧。当时写的很匆忙,其实应该很多可以优化的,先上截图再上代码吧。
因为这个学生还比较爽快,因此注释还是给他写的很详细的。
代码部分
/*学生管理系统*/ #include <stdio.h> #include <malloc.h> /*内存操作*/ /*先定义课程表*/ static char g_syllabus[4][100] = {"语文", "数学", "英语", "计算机"}; /*定义学生信息*/ typedef struct Student { int id; /* 学号 唯一 */ char name[30]; /* 姓名 */ float score[4]; /* 每个课程的分数 */ }Student; /* Student等价于struct Student*/ /* 定义线线性表单链表存储结构 */ typedef struct Node { Student data; /* 数据域 ,学生信息 */ struct Node* pNext; /* 下一个结点 */ }Node ,*pNode ; /* Node 等价于 struct Node,*pNode 等价于 struct Node* */ /* 定义链表 */ typedef struct List { Node* head; /*头结点*/ int length; /*链表长度*/ }List,*pList; /* 初始化链表 */ pList init_list() { pList my_list = (pList)malloc(sizeof(List)); if(!my_list)return 0; my_list->head = (Node*)malloc(sizeof(Node)); my_list->head->pNext = my_list->head; my_list->length = 0; return my_list; } /*创建一个节点*/ Node * NewNode(pList my_list) { Node * pNewNode = ( Node * )malloc( sizeof(Node) ); if( ! pNewNode ) return 0; pNewNode ->pNext = my_list -> head; return pNewNode; } /* 根据学号查找结点 ,返回学生的结点指针 ,参数一个为链表,一个为要找的id*/ Node* search(pList my_list , int id) { Node* p = my_list->head->pNext; while(my_list->head != p && p->data.id != id) { p = p->pNext; } return p; } /* 插入学生结点到链表中 */ void insert(pList my_list,Node* pNode) { pNode->pNext = my_list->head->pNext; my_list->head->pNext = pNode; ++ my_list->length; } /*增加学生*/ void addStudentMenu(pList my_list ){ int i = 0; Node* pFind; Node* pNode = NewNode(my_list); /// 判断学号存在标志 int isExistFlag = 0; do { isExistFlag = 0; printf("请输入学生的信息:\n"); printf("学号:"); scanf("%d", &(pNode ->data.id)); if (0 == pNode ->data.id) { return; } pFind = search(my_list,pNode->data.id); if (pFind != my_list->head) { isExistFlag = 1; printf("此学号已经存在,请重新输入。返回请输入0。\n"); } }while(1 == isExistFlag); printf("姓名:"); scanf("%s", pNode->data.name); for (i = 0; i < 4; ++ i) { printf("%s分数:", g_syllabus[i]); scanf("%f", &(pNode->data.score[i])); } insert(my_list,pNode); printf("插入学生信息成功。\n"); } /* 查看所有学生 */ void selectAllStudentMenu(pList my_list) { Node* p; int i = 0; if (0 == my_list->length) { printf("没有学生信息,请增加学生信息以后再查看。\n"); return; } printf("学号 姓名 "); for (i = 0; i < 4; ++ i) { printf("%s ", g_syllabus[i]); } printf("\n"); p = my_list->head->pNext; while(my_list->head != p) { printf("%d %6s ", p->data.id, p->data.name); for (i = 0; i < 4; ++ i) { printf("%4.2f ", p->data.score[i]); } printf("\n"); p = p->pNext; } } /*主菜单,参数为链表*/ void mainMenu(pList my_list); void exitMenu(void); /*退出*/ int main(void) { pList my_list = NULL; my_list = init_list(); /*初始化*/ if(0 == my_list){ printf("分配内存失败,程序终止!\n"); exit(-1); }; mainMenu(my_list); return 0; } void mainMenu(pList my_list) { int a = -1; /*先设置个操作判断变量,因为0为退出,所以初始化赋值为-1*/ while(0 != a) { printf("\n*************************************学生成绩统计软件************************\n"); printf("1.增加学生 2.查看学生的总分及平均分 3.查看学生成绩分布图 4.导出学生成绩单 0.退出\n" ); // printf("); printf("请输入你需要的操作数(0-4):"); scanf("%d", &a); getchar(); printf("*******************************************************************************\n"); switch (a) { case 0: exitMenu(); /*退出*/ break; case 1: addStudentMenu(my_list); /*增加学生*/ break; case 2: selectAllStudentMenu(my_list); break; case 3: //deleteStudentMenu(); break; default: printf("\n格式不对,请输入上面目录前面的数字。\n"); a = 7; break; } } } /*退出*/ void exitMenu(void) { printf("谢谢你的使用。\n"); }