C语言实现学生成绩管理系统
该系统是由带头结点的单链表实现的,实现了增删改查等的基本功能。
在打印的时候会有界面的不整齐,但是基本功能都已经实现。
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
typedef struct LNode
{
char number[20];
char name[20];
float score1;
float score2;
float score3;
float average;
float total;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList plist);
void Insert_Head(LinkList plist,char* number,char* name,
float score1,float score2,float score3);
LinkList Search(LinkList plist,char* key,int flag);
void Delete_Key(LinkList plist,char* key);
void Delete_Head(LinkList plist);
int GetLength(LinkList plist);
int IsEmpty(LinkList plist);
void Show(LinkList plist);
void Clear(LinkList plist);
void Destory(LinkList plist);
static LinkList _Apply_Node(char* number,char* name,float score1,float score2,
float score3,float average,float total,LinkList next)
{
LinkList s=(LinkList)malloc(sizeof(LNode));
assert(s != NULL);
if(s == NULL)
{
printf("Apply Space Fail\n");
return NULL;
}
strcpy_s(s->name,20,name);
strcpy_s(s->number, 20,number);
s->score1 = score1;
s->score2 = score2;
s->score3 = score3;
s->average = average;
s->total = total;
s->next = next;
return s;
}
void InitList(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("Singly LinkList Initialization Failed\n");
return;
}
plist->next = NULL;
}
void Insert_Head(LinkList plist,char* number,char* name,
float score1,float score2,float score3)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("The Single LinkList is NULL\n");
return;
}
float total = score1+score2+score3;
float average = total/3;
plist->next = _Apply_Node(number,name,score1,score2,score3,
average,total,plist->next);
}
LinkList Search(LinkList plist,char* key,int flag)
{
assert(plist != NULL);
if(plist == NULL)
{
return NULL;
}
LinkList s = plist->next;
while (s->next != NULL)
{
if(flag == 1)
{
if(s->name == key)
{
break;
}
}
else
{
if(s->number == key)
{
break;
}
}
s = s->next;
}
return s;
}
void Delete_Key(LinkList plist,char* key)
{
assert(plist != NULL);
LinkList s = plist,q;
while (s->next != NULL)
{
if(s->next->name == key)
{
q = s->next;
s->next = q->next;
free(q);
break;
}
s=s->next;
}
}
void Delete_Head(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("The Single LinkList is NULL\n");
return;
}
LinkList q = plist->next;
if(q != NULL)
{
plist->next = q->next;
}
free(q);
}
int GetLength(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("The Single LinkList is NULL\n");
return 0;
}
int length = 0;
for(LinkList p = plist->next;p != NULL;p = p->next)
{
length++;
}
return length;
}
int IsEmpty(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("The HeadNode Is NULL\n");
return 1;
}
if(plist->next == NULL)
{
printf("The FirstNode Is NULL\n");
return 2;
}
return 0;
}
void Show(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("The Single LinkList is NULL\n");
return;
}
printf("学号 姓名 成绩1 成绩2 成绩3 平均成绩 总成绩\n");
for(LinkList p = plist->next;p != NULL;p = p->next)
{
printf("%s %s %.2f %.2f %.2f %.2f %.2f\n",p->number,
p->name,p->score1,p->score2,p->score3,p->average,p->total);
}
}
void Clear(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("The Single LinkList is NULL\n");
return;
}
while (!IsEmpty(plist))
{
Delete_Head(plist);
}
}
void Destory(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
printf("The Single LinkList is NULL\n");
return;
}
free(plist->next);
plist->next=NULL;
}
void Bubble_Sort(LinkList s1)
{
assert(s1 != NULL);
if(s1 == NULL)
{
printf("Bubble_Sort:Invalid List\n");
return;
}
int flag = 0;
LinkList s = s1,p = s->next,q = p->next;
LinkList order = s1;
while(1)
{
order = s1;
for(;order->next != NULL && order->next->next != NULL;order = order->next)
{
if(order->next->average < order->next->next->average)
{
flag = 1;
}
else
{
flag = 0;
s = order;
break;
}
}
if(flag == 1)
{
break;
}
p = s->next,q = p->next;
while(q != NULL)
{
if(p->average > q->average)
{
q = q->next;
s->next = p->next;
p->next = q;
s->next->next = p;
s = s->next;
}
else
{
p = p->next,q = q->next,s = s->next;
}
}
}
}
void Menu()
{
printf("******……欢迎来到学生成绩管理系统******……\n");
printf("******…………0-----退出******…………\n");
printf("******…………1-----插入******…………\n");
printf("******…………2-----修改(根据学号)******…………\n");
printf("******…………3-----删除(学号)******…………\n");
printf("******…………4-----查询(1姓名,2学号)******…………\n");
printf("******…………5-----排序(平均成绩)******…………\n");
printf("******…………6-----打印******…………\n");
}
int main()
{
int choose = 0;
char number[20]={0};
char name[20]={0};
float score1=0;
float score2=0;
float score3=0;
float average=0;
float total=0;
int searchid = 0;
LNode s1;
LinkList result = NULL;
Menu();
InitList(&s1);
while(1)
{
printf("请输入你的选择:");
scanf("%d",&choose);
if(0 == choose)
{
Destory(&s1);
printf("已成功退出本系统\n");
break;
}
switch (choose)
{
case 1:
printf("请输入要插入的学生的学号、姓名、成绩1、成绩2、成绩3:");
scanf("%s %s %f %f %f",&number,&name,&score1,&score2,&score3);
Insert_Head(&s1,number,name,score1,score2,score3);
break;
case 2:
printf("请输入要修改的学生的学号、成绩1");
scanf("%s %f",&number,&score1);
result = Search(&s1,number,2);
result->score1 = score1;
break;
case 3:
printf("请输入要删除的学生的学号:");
scanf("%s",&number);
Delete_Key(&s1,number);
printf("已成功删除该学生的所有信息\n");
break;
case 4:
printf("请输入查询条件(1姓名,2学号):");
scanf("%d",&searchid);
if(searchid == 1)
{
printf("请输入要查询的学生的姓名:");
scanf("%s",&name);
result = Search(&s1,name,1);
}
else if(searchid == 2)
{
printf("请输入要查询的学生的学号:");
scanf("%s",&number);
result = Search(&s1,number,2);
}
else
{
printf("错误输入\n");
}
if( result == NULL)
{
printf("找不到该学生信息\n");
}
else
{
printf("学号 姓名 成绩1 成绩2 成绩3 平均成绩 总成绩‐n");
printf("%s %s %.2f %.2f %.2f %.2f %.2f\n",result->number,result->name,result->score1,
result->score2,result->score3,result->average,result->total);
}
break;
case 5:
Bubble_Sort(&s1);
printf("已按照平均成绩排序\n");
break;
case 6:
Show(&s1);
break;
default:
printf("请重新选择\n");
break;
}
}
system("pause");
return 0;
}