#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct info
{
char num[20];
char name[10];
float cj;
struct info *next;
struct info *last;
};
void author();
struct info* input(struct info *);
struct info* search(char *,struct info *);
struct info* del(char *,struct info *);
struct info* deleteMenu(struct info *);
void searchMenu(struct info *fPtr);
void saveData(struct info *);
struct info* loadData(struct info *);
void showAll(struct info *);
struct info* sort(struct info *);
void main()
{
struct info *first=0;
int choose;
author();
while(1){
printf("**********************************************************/n");
printf("* 1:加入一个新纪录 2:删除一个记录 3:查询(修改)一个记录 */n");
printf("* 4:退出程序 5:保存数据 6:载入数据 */n");
printf("* 7:显示全部记录 8:按成绩排序记录 */n");
printf("**********************************************************/n");
printf("请选择(1~8):");
scanf("%d",&choose);
printf("/n");
switch(choose){
case 1:
first=input(first);
break;
case 2:
first=deleteMenu(first);
break;
case 3:
searchMenu(first);
break;
case 4:
return;
case 5:
saveData(first);
break;
case 6:
first=loadData(first);
break;
case 7:
showAll(first);
break;
case 8:
first=sort(first);
break;
default:
printf("输入错误!/n/n/n");
break;
}
printf("/n/n/n");
}
}
struct info *input(struct info *fPtr)
{
struct info *i;
i=(struct info*)malloc(sizeof(struct info));
printf("输入该生学号:");
scanf("%s",i->num);
printf("输入该生姓名:");
scanf("%s",i->name);
printf("输入该生成绩:");
scanf("%f",&(i->cj));
(i->next)=fPtr;
if(fPtr!=0){
(fPtr->last)=i;
}
(i->last)=0;
fPtr=i;
return fPtr;
}
struct info* del(char *s,struct info *fPtr)
{
struct info *r;
r=search(s, fPtr);
if(r==0){
printf("没有记录可删除!/n/n/n");
return fPtr;
}
else{
if(r==fPtr){
fPtr=fPtr->next;
free(r);
printf("删除成功!/n/n/n");
return fPtr;
}
((r->last)->next)=(r->next);
free(r);
printf("删除成功!/n/n/n");
return fPtr;
}
}
struct info *search(char *s,struct info *fPtr)
{
int r;
if(fPtr==0){
return 0;
}
while(1){
r=strcmp(fPtr->num, s);
if(r==0){
return fPtr;
}
r=strcmp(fPtr->name,s);
if(r==0){
return fPtr;
}
if((fPtr->next)!=0){
fPtr=(fPtr->next);
}
else{
return 0;
}
}
}
struct info* deleteMenu(struct info *fPtr)
{
char nn[20];
printf("输入该生姓名或学号:");
scanf("%s",nn);
return del(nn,fPtr);
}
void searchMenu(struct info *fPtr)
{
int yorn;
char nn[2];
struct info *r;
printf("输入该生姓名或学号:");
scanf("%s",nn);
r=search(nn,fPtr);
if(r==0){
printf("查无记录!/n/n/n");
return;
}
else{
printf("学号:%s 姓名:%s 成绩:%f/n/n/n",r->num,r->name,r->cj);
printf("是否要修改?(1=是 , 0=否)");
scanf("%d",&yorn);
if(yorn==1){
printf("输入该生学号:");
scanf("%s",r->num);
printf("输入该生姓名:");
scanf("%s",r->name);
printf("输入该生成绩:");
scanf("%f",&(r->cj));
printf("修改成功!/n/n/n");
}
}
}
void saveData(struct info *fPtr)
{
FILE *fp;
if(fPtr==0){
printf("没有记录可保存!/n/n/n");
return;
}
fp=fopen("info.stu","wb+");
while(1){
fwrite(fPtr,sizeof(struct info),1,fp);
fPtr=(fPtr->next);
if(fPtr==0){
break;
}
}
printf("保存成功!/n");
fclose(fp);
}
struct info* loadData(struct info *fPtr)
{
struct info *now=0;
struct info *up=0;
FILE *fp;
if((fp=fopen("info.stu","rb"))==NULL){
printf("无法打开文件");
return fPtr;
}
fPtr=(struct info*)malloc(sizeof(struct info));
up=fPtr;
fread(fPtr,sizeof(struct info),1,fp);
if((fPtr->next)==0){
printf("数据载入成功!/n/n/n");
return fPtr;
}
while(1){
now=(struct info*)malloc(sizeof(struct info));
fread(now,sizeof(struct info),1,fp);
(now->last)=up;
(up->next)=now;
up=now;
if((now->next)==0){
fclose(fp);
printf("数据载入成功!/n/n/n");
return fPtr;
}
}
}
void showAll(struct info *fPtr)
{
if(fPtr==0){
printf("没有记录!/n/n/n");
return;
}
while(1){
printf("学号:%s 姓名:%s 成绩:%f/n-----------------------------/n",fPtr->num,fPtr->name,fPtr->cj);
fPtr=fPtr->next;
if(fPtr==0){
printf("显示成功!/n/n/n");
return;
}
}
}
void author()
{
printf(" ***********************************************/n");
printf(" * 简易成绩 作者:周伟 */n");
printf(" * 统计系统 版本:1.1 */n");
printf(" ***********************************************/n/n/n");
}
struct info* sort(struct info *fPtr)
{
struct info *now;
struct info *ne;
struct info *temp=0;
if(fPtr==0){
printf("没有记录可排序!");
return fPtr;
}
while(1){
int i=0;
int j=1;
now=fPtr;
ne=(fPtr->next);
if((now->next)==0){
printf("排序成功!");
return fPtr;
}
while(1){
if((now->cj)<(ne->cj)){
temp=(ne->next);
(ne->next)=now;
(now->next)=temp;
temp=(now->last);
(now->last)=ne;
(ne->last)=temp;
if(temp!=0){
(temp->next)=ne;
}
if(j==1){
fPtr=ne;
}
ne=(now->next);
i=1;
}
else{
now=ne;
ne=(ne->next);
}
j++;
if((now->next)==0){
break;
}
}
if(i==0){
printf("排序成功!");
return fPtr;
}
}
}