以前帮一个大学生做的毕业考试,当时他是数据结构的考试吧。当时写的很匆忙,其实应该很多可以优化的,先上截图再上代码吧。
因为这个学生还比较爽快,因此注释还是给他写的很详细的。
代码部分
/*学生管理系统*/
#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");
}