记录大一粗略学习C语言后以链表做一个简单的学生管理系统,数据以Excel转为txt文本格式的文件进行输入。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
struct student
{
char name[25]; //姓名
int stunum; //学号
double score1; //平时成绩
double score2; //作业成绩
double score3; //考试成绩
double sumscore; //总成绩
struct student * next;
};
int main()
{
void Menu();
struct student * entrysystem(void);
void print(struct student * head);
struct student * searchsystem(struct student* head);
struct student *DeleteStudent(struct student* head);
struct student* Listsort(struct student* head);
struct student * head;
while(1)
{
Menu(); //显示菜单
char a = getch(); //按照菜单输入数字序号
switch (a)
{
case '1': //成绩信息录入
head = entrysystem();
break;
case '2': //成绩信息显示
print(head);
break;
case '3': //查询功能
searchsystem(head);
break;
case '4': //成绩信息删除
DeleteStudent(head);
break;
case '5': //排序功能
head = Listsort(head);
break;
case '0': //退出
return 0;
break;
default:
printf("输入有误\n");
system("pause");
system("cls");
break;
}
}
return 0;
}
void Menu()
{
printf("=============================================\n");
printf("* 请按序号选择功能 *\n");
printf("* 1、成绩信息录入功能 *\n");
printf("* 2、成绩信息显示浏览功能 *\n");
printf("* 3、查询功能 *\n");
printf("* 4、成绩信息删除功能 *\n");
printf("* 5、排序功能 *\n");
printf("* 0、退出 *\n");
printf("=============================================\n");
}
struct student * entrysystem(void) //功能一、信息录入
{
struct student *head; //定义“头指针”
struct student *p,*p1;
p = p1 = (struct student *)malloc(sizeof(struct student)); //在内存动态存储区里分配struct student*类型,
//大小为一个结构体的字节长度的连续空间
FILE *fp;
char filename[50]; //定义字符串数组用来保存文件名称
printf("请输入文件名称\n");
gets(filename);
fp = fopen(filename,"r"); //以只读模式打开文本文件
if((fp =fopen(filename,"r"))==NULL) //判断文件是否存在并做出选择
{
printf("can't open\n");
getchar();
exit(0);
}
fscanf(fp,"%s %d %lf %lf %lf",p->name,&p->stunum,&p->score1,&p->score2,&p->score3); //写入文件的数据
p->sumscore = p->score1 + p->score2 + p->score3;
head = NULL; //开始建立动态链表
while(p->name[0] != '0')
{
if(head == NULL) //判断链表是否为空
{
head = p;
}
else
{
p1 -> next = p;
}
p1 = p;
p = (struct student*)malloc(sizeof(struct student)); //为下一结点开辟空间
fscanf(fp,"%s %d %lf %lf %lf",p->name,&p->stunum,&p->score1,&p->score2,&p->score3); //写入数据
p->sumscore = p->score1 + p->score2 + p->score3;
}
fclose(fp) ;
p1 -> next = NULL; //链表结束,令最后的结点不再接入链表中
printf("信息已录入\n");
system("pause"); //暂停
system("cls"); //清屏
return(head);
}
void print(struct student * head) //功能二、成绩显示
{struct student * p;
double sum;
printf("\n姓名\t学号\t\t平时成绩\t作业成绩\t考试成绩\n");
p=head;
if(head!=NULL)
do
{
printf("%s\t%d\t%0.1lf\t\t%0.1lf\t\t%0.1lf\n",p->name,p->stunum,p->score1,p->score2,p->score3);
p=p->next;
}while(p!=NULL);
system("pause");
system("cls");
}
struct student * searchsystem(struct student* head) //功能三、姓名查找
{
char Searname[25];
printf("请输入学生姓名\n");
scanf("%s",Searname);
struct student* pMove = head;
if (pMove == NULL)
return NULL ;
while ( strcmp(pMove->name,Searname)!=0 ) //字符串比较函数
{
pMove = pMove->next;
}
printf("\n姓名\t学号\t\t平时成绩\t作业成绩\t考试成绩\n");
printf("%s\t%d\t%0.1lf\t\t%0.1lf\t\t%0.1lf\n",pMove->name,pMove->stunum,pMove->score1,pMove->score2,pMove->score3);
system("pause");
system("cls");
}
//8.删除学生信息
struct student *DeleteStudent(struct student* head)
{
struct student * p,*pbefore;
int searchnum;
printf("请输入要删除学生信息的学号:\n");//先把文件中的数据读取到链表
scanf("%d",&searchnum);
p = head;
while(p!=NULL)
{
if(searchnum==p->stunum)
{
if(p==head)
{
head = p ->next;
}
else if(p->next==NULL)
{
p = pbefore;
p -> next = NULL;
}
else
{
pbefore -> next = p->next;
}
printf("删除成功\n");
}
pbefore = p;
p = p -> next;
}
system("pause");
system("cls");
}
/*按总成绩排序*/
struct student* Listsort(struct student* head)
{
void print(struct student * head);
struct student *pfirst;
struct student *ptail;
struct student *pminBefore;
struct student *pmin;
struct student *p;
pfirst = NULL;
while (head != NULL)
{
for (p = head, pmin = head; p->next != NULL; p = p->next)
{
if (p->next->sumscore < pmin->sumscore)
{
pminBefore = p;
pmin = p->next;
}
}
if (pfirst == NULL)
{
pfirst = pmin;
ptail = pmin;
}
else
{
ptail->next = pmin;
ptail = pmin;
}
if (pmin == head)
{
head = head->next;
}
else
{
pminBefore->next = pmin->next;
}
}
if (pfirst != NULL)
{
ptail->next = head;
}
head = pfirst;
print(head);
system("pause");
system("cls");
return head;
}