#i nclude <stdio.h>
#i nclude <stdlib.h>
#i nclude <string.h>
#define NULL 0
#define ST struct stunode
/*全局变量nN为链表长度*/
int nN;
/*学生结构体*/
struct student
{
long lnID;
char chName[10];
int nScore;
}stu1;
/*学生节点*/
ST
{
long lnID;
char chName[10];
int nScore;
ST *next;
};
FILE *fp;
/*函数Load功能:由指定文件中的数据生成链表,如果文件不存在则为空链*/
ST * Load(char chFname[])
{
ST *head,*p,*q;
q=head=NULL;
if ((fp=fopen(chFname,"rb"))==NULL)
return head;
else
{
while(!feof(fp))//从文件中每次读一个数据块并建立链表
{
if(fread(&stu1,sizeof(struct student),1,fp)==1)
{
p=(ST *)malloc(sizeof(ST));
p->lnID=stu1.lnID;
strcpy(p->chName ,stu1.chName );
p->nScore=stu1.nScore;
head=p; p->next=q;q=head;//头指针始终指向当前进入的。
}
nN=nN+1;//计算链表长度
}
fclose(fp);
return(head);
}
}
/*函数Show功能:显示所有学生记录*/
ST * Show(ST *head)
{
ST *p;
p=head;
while(p!=NULL)
{
printf("%ld/t%s/t%d/n",p->lnID,p->chName,p->nScore);
p=p->next;
}
return (head);
}
/*函数Insert功能:输入一条学生资料,添加到链表*/
ST * Insert(ST *head)
{
ST *p,*temp;
long lnTemp;
temp=head;
printf("请输入学生学号,输入0表示结束输入:/n");
scanf("%ld",&lnTemp );
while(lnTemp!=0)
{
p=(ST * )malloc(sizeof(ST));
p->lnID=lnTemp;
printf("请输入学生姓名:/n");
scanf("%s",&p->chName );
printf("请输入学生成绩:/n");
scanf("%d",&p->nScore );
head=p;
p->next=temp;
printf("请输入学生学号,输入0表示结束输入:/n");
scanf("%ld",&lnTemp );
}
return (head);
}
/*函数Delete功能:根据姓名删除一条学生记录*/
ST * Delete(ST *head)
{
ST *p,*q;
p=head;
char chName[10];
printf("请输入要删除学生的姓名:/n");
scanf("%s",chName);
while(p!=NULL)
{
if (strcmp(chName,p->chName)==0)
{
if(p==head) head=p->next; //如果该学生记录为表头
else q->next=p->next;
free(p);break;
}
else
{
q=p;
p=p->next;
}
}
if (p==NULL) printf("找不到此学生的记录:");
return head;
}
/*函数Search功能:根据姓名查找学生记录*/
ST * Search(ST *head)
{
ST *p;
p=head;
char chName[10];
printf("请输入要查找学生的姓名:/n");
scanf("%s",chName);
while(p!=NULL)
{
if(strcmp(chName,p->chName)==0)
{
printf("ID:%ld/tName:%s/tScore:%d/n",p->lnID,p->chName,p->nScore);
break;
}
else p=p->next;
}
if(p==NULL) printf("找不到此学生的记录/n");
return (head);
}
/*函数Compute功能:计算总分和平均分*/
void Compute(ST *head)
{
ST *p;
double dbSum=0,dbAvg,nI=0;
p=head;
while(p!=NULL)
{
dbSum=dbSum+p->nScore;
nI++;
p=p->next;
}
dbAvg=dbSum/nI;
printf("总分:%.1f/t平均分: %.2lf/n",dbSum,dbAvg);
return;
}
/*函数Save功能:保存学生记录*/
ST *Save(ST *head,char chFname[])
{
ST *p;
p=head;
if((fp=fopen(chFname,"wb"))==NULL)
printf("无法打开文件/n");
else
{
while(p!=NULL)
{
stu1.lnID=p->lnID;
strcpy(stu1.chName ,p->chName);
stu1.nScore =p->nScore;
if(fwrite(&stu1,sizeof(struct student),1,fp)!=1)
printf("写入失败!/n ");
p=p->next;
}
}
fclose(fp);
return (head);
}
/*函数menu功能:菜单选择界面*/
int Menu(void)
{
int nI,nK;
for(nI=0;nI<80;nI++)
printf("*");
printf("1插入一条记录/t/t/t2显示所有记录/t/t/t3按姓名查找/n");
printf("4按姓名删除/t/t/t5计算总分及平均分/t/t6存盘并退出/n");
for(nI=0;nI<80;nI++)
printf("*");
printf("请选择操作(选择(0)退出):");
scanf("%d",&nK);
return (nK);
}
void main(void)
{
ST *head;
char chFname[20]="1.txt";
head=Load(chFname);
printf("/t/t/t/t学生管理系统/n");
printf("/t/t/t作者:姜晨 班级:05032项目部 学号:TB0503133/n");
while(1)
{
printf("/n");
switch(Menu())
{
case 1:
{
head=Insert(head);
}break;
case 2:
{
head=Show(head);
}break;
case 3:
{
Search(head);
}break;
case 4:
{
head=Delete(head);
}break;
case 5:
{
Compute(head);
}break;
case 6:
{
head=Save(head,chFname);
exit(1);
}break;
default:printf("输入错误,请重新输入!");
}
}
}