关于数据结构中链表学习的实例--学生信息管理系统
程序代码:
#include"stdio.h" #include"stdlib.h" #include"malloc.h" typedef struct NODE{ char name[20]; int ID; float score[3]; struct NODE *next; } NODE; int index=0; //输入某个学生的成绩 NODE *Creat(int n){ NODE *phead,*p,*previous; int i; phead=(NODE*)malloc(sizeof(NODE)); previous=phead; previous->next=NULL; for(i=0;i<n;i++){ p=(NODE*)malloc(sizeof(NODE)); printf("please input name,ID\n"); scanf("%s%d",&p->name,&p->ID); printf("请输入3门成绩:\n"); scanf("%f%f%f",&p->score[0],&p->score[1],&p->score[2]); previous->next=p; p->next=NULL; previous=p; index++; } return phead; } //打印所有学生的成绩 void Print(NODE*phead){ NODE *ptemp; ptemp=phead; ptemp=ptemp->next; while(ptemp!=NULL){ printf("---the student information---\n"); printf("姓名:%s\n",ptemp->name); printf("学号:%d\n",ptemp->ID); printf("成绩:%f\t%f\t%f\t\n",ptemp->score[0],ptemp->score[1],ptemp->score[2]); ptemp=ptemp->next; } } //插入某个学生的成绩 NODE* Insert(NODE *phead){ NODE *ptemp,*p1; ptemp=phead; p1=(NODE*)malloc(sizeof(NODE)); printf("请输入姓名,学号:\n"); scanf("%s%d",&p1->name,&p1->ID); printf("请输入语文,数学,英语成绩:\n"); scanf("%f%f%f",&p1->score[0],&p1->score[1],&p1->score[2]); p1->next=ptemp->next; ptemp->next=p1; index++; return phead; } //删除某个学生的成绩 NODE* Delete(NODE*phead ,int i){ NODE *ptemp,*previous; ptemp=phead; ptemp=ptemp->next; previous=ptemp; while(ptemp!=NULL&&(ptemp->ID!=i)){ previous=ptemp; ptemp=ptemp->next; } if(ptemp) { previous->next=ptemp->next; free(ptemp); printf("删除成功!\n"); } return phead; } //计算所有学生的成绩 float AverageAll(NODE*phead){ NODE *ptemp; ptemp=phead; ptemp=ptemp->next; int i=0; float b,m,sum=0.0; while(ptemp!=NULL){ m=ptemp->score[0]+ptemp->score[1]+ptemp->score[2]; sum=sum+m; ptemp=ptemp->next; i++; } b=sum/(i); return b; } //计算某个学生的成绩 float AverageSigle(NODE*phead,int i){ NODE *ptemp; ptemp=phead; ptemp=ptemp->next; float m; while(ptemp->ID!=i&&ptemp!=NULL) ptemp=ptemp->next; if(ptemp) m=(ptemp->score[0]+ptemp->score[1]+ptemp->score[2])/3; return m; } //查找某个学生的信息 void Lookfor(NODE *phead,int i){ NODE *ptemp; ptemp=phead; ptemp=ptemp->next; while(ptemp!=NULL&&(ptemp->ID!=i)) ptemp=ptemp->next; if(ptemp) { printf("*********学生信息************\n"); printf("学号:%d\t姓名:%s\n",ptemp->ID,ptemp->name); printf("第一门成绩:%f第二门成绩:%f第三门成绩:%f\n",ptemp->score[0],ptemp->score[1],ptemp->score[2]); } } //修改学生的信息 void Revise_information(NODE*phead,int i){ NODE *ptemp; ptemp=phead; ptemp=ptemp->next; while(ptemp!=NULL&&(ptemp->ID!=i)) { ptemp=ptemp->next; } if(ptemp){ printf("请输入修改的姓名:"); scanf("%s",&ptemp->name); printf("请输入要修改的学号:"); scanf("%d",&ptemp->ID); printf("请输入要修改的成绩显3门:"); scanf("%f%f%f",&ptemp->score[0],&ptemp->score[1],&ptemp->score[2]); printf("修改成功!\n"); } } //按照递增的顺序排列 NODE* Ascendline(NODE*phead){ NODE*ptemp,*previous,*p1; int i; for(i=0;i<index;i++){ ptemp=phead; p1=ptemp; previous=ptemp=ptemp->next; ptemp=ptemp->next; while(ptemp!=NULL){ float m,n; m=ptemp->score[0]+ptemp->score[1]+ptemp->score[2]; n=previous->score[0]+previous->score[1]+previous->score[2]; if(n>m) { p1->next=ptemp; previous->next=ptemp->next; ptemp->next=previous; } p1=previous; previous=ptemp; ptemp=ptemp->next; } } return phead; } //按照递减的顺序排列 NODE* Descendline(NODE*phead){ NODE*ptemp,*previous,*p1; int i; for(i=0;i<index;i++){ ptemp=phead; p1=ptemp; previous=ptemp=ptemp->next; ptemp=ptemp->next; while(ptemp!=NULL){ float m,n; m=ptemp->score[0]+ptemp->score[1]+ptemp->score[2]; n=previous->score[0]+previous->score[1]+previous->score[2]; if(n<m) { p1->next=ptemp; previous->next=ptemp->next; ptemp->next=previous; } p1=previous; previous=ptemp; ptemp=ptemp->next; } } return phead; } void menu(){ printf("*************学生管理系统************************\n"); printf("1.输入n个学生的成绩\n"); printf("2.打印学生的成绩\n"); printf("3.插入某个学生的信息和成绩\n"); printf("4.删除某个学生的信息和成绩\n"); printf("5.查找某个学生的信息和成绩\n"); printf("6.计算所有学生的信息和成绩\n"); printf("7.计算某个学生的信息和成绩\n"); printf("8.修改某个学生的信息和成绩\n"); printf("9.按照成绩的递增进行排序\n"); printf("10.按照成绩的递减顺序排列\n"); }#include"head.h" void main(){ int n,i; NODE *phead; menu(); scanf("%d",&n); while(n){ switch(n){ case 1:printf("请问要输入几个学生的信息:\n"); scanf("%d",&i); phead=Creat(i); break; case 2:Print(phead); break; case 3:phead=Insert(phead); break; case 4:printf("请输入要删除学生的学号:"); scanf("%d",&i); Delete(phead,i); break; case 5:printf("请输入要查找学生的学号:"); scanf("%d",&i); Lookfor(phead,i);break; case 6:printf("所有学生的平均成绩是:%f\n",AverageAll(phead));break; case 7:printf("请输入要查找学生的学号:"); scanf("%d",&i); printf("学号为%d的成绩是:%f\n",i,AverageSigle(phead,i));break; case 8:printf("请输入要修改学生的学号:\n"); scanf("%d",&i); Revise_information(phead,i);break; case 9:phead=Ascendline(phead);printf("排序完成!\n"); Print(phead); break; case 10:phead=Descendline(phead);printf("排序完成!\n"); Print(phead); break; default:printf("输入错误!\n");break; } menu(); scanf("%d",&n); } }