#include<stdio.h.>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct student{
int num;
char name[10];
int math;
int Chinese;
int English;
int total;
}stu; /*建立学生成绩信息结构体;*/
typedef struct dlnode
{
stu data;
struct dlnode *prior;
struct dlnode *next;
}dnode; /*建立双向链表结构体;*/
dnode *head;
void enter(void)//输入学生成绩
{
dnode *p,*rear;
char flag='Y';
head=(dnode *)malloc(sizeof(dnode));
rear=head;
head->next=head;
head->prior=head; /*建立双链表空头节点;*/
while(flag=='Y'||flag=='y')
{
p=(dnode *)malloc(sizeof(dnode));
printf("学号:");
scanf("%d/n",&p->data.num);
printf("姓名:");
scanf("%s/n",&p->data.name);
printf("语文成绩:");
scanf("%d/n",&p->data.Chinese);
printf("数学成绩:");
scanf("%d/n",&p->data.math);
printf("英语成绩:");
scanf("%d",&p->data.English);
p->data.total=(p->data.Chinese+p->data.English+p->data.math);
rear->next=p;
p->prior=rear;
rear=p;
p->next=head; /*向双链表中动态增加节点数据;*/
printf("继续输入吗?(Y/N)\n");
scanf("%s",&flag);
}
printf("\n");
}
void load(dnode *head) //从文件中读取
{
FILE *fp;
int n,i;
dnode *p,*rear;
rear=head;
head->next=head;
head->prior=head;
if((fp=fopen("file.txt","rb"))==NULL)
{
printf("打开文件失败!!!\n");
exit(0);
}
fscanf(fp,"%d",&n);
for(i=0;i<n;i++)
{
p=(dnode *)malloc(sizeof(dnode));
fscanf(fp,"%-5d%8s%8d%9d%9d",&p->data.num,&p->data.name,&p->data.Chinese,&p->data.math,&p->data.English);
rear->next=p;
p->prior=rear;
rear=p;
p->next=head;/*从文件中动态载入节点数据;*/
}
fclose(fp);
printf("下载数据成功!!!\n\n");
}
void display(dnode *head) //显示所有成绩
{
dnode *p;
p=head->next;
printf("学号 姓名 语文 数学 英语 总分\n");
while(p!=head)
{
printf("%-5d%8s%8d%9d%9d%9d",p->data.num,p->data.name,p->data.Chinese,p->data.math,p->data.English,p->data.total);
printf("\n");
p=p->next;
}
}
void save(dnode *head)//存盘
{
FILE *fp;
dnode *p;
int n=0,i;
if((fp=fopen("file.txt","wb"))==NULL)
{
printf("打开文件失败!!!\n");
exit(1);
} p=head->next;
if(p!=head)
{
while (p!=head)
{
p=p->next;
n++;
}
fprintf(fp,"%d",n); /*写入节点个数;*/
fprintf(fp,"\r\n"); /*写入回车符;*/
p=head->next;
for(i=0;i<n;i++)
{
fprintf(fp,"%-5d%8s%8d%9d%9d",p->data.num,p->data.name,p->data.Chinese,p->data.math,p->data.English);
fprintf(fp,"\r\n");
p=p->next;
} /*向文件中写入节点数据;*/
}
else
printf("Please make sure the data is not NULL!!");
fclose(fp);
printf("存盘成功!!!\n");
}
void sort(dnode * head)//排序
{
dnode *p,*pre,*q;
p=head->next->next;
head->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=head;
while(pre->next!=NULL&&pre->next->data.total<p->data.total)
pre=pre->next;
p->next=pre->next;
if(pre->next!=NULL)
pre->next->prior=p;
pre->next=p;
p->prior=pre;
p=q;
}
display(head);
}
void quit(void) //退出
{
exit(0);
}
void main()
{
char flag='Y';
for(;;)
{
dnode *q;
int ch;
printf("学生成绩管理系统:\n");
printf(" 输入学生成绩-----------------0\n");
printf(" 下载纪录-----------------1\n");
printf(" 显示所有成绩-------------2\n");
printf(" 存盘---------------------3\n");
printf(" 按总分排序-------------4\n");
printf(" 退出---------------------5\n");
printf("请输入数字(0~5):\n");
scanf("%d",&ch);
switch(ch)
{
case 0: enter();
break;
case 1: head=(dnode *)malloc(sizeof(dnode));
load(head);
break;
case 2: display(head);
break;
case 3: save(head);
break;
case 4: sort(head);
break;
case 5: quit();
break;
default:
printf("警告!!!请输入数字0-5!\n");
}/*用SWITCH函数选择菜单;*/
}
}