69,373
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define CLEAR system("cls")
#define PAUSE system("pause")
//运动员结构体;运动员信息存放文件:athlete.txt
struct athlete
{
char ID[10];
char name[15];
char pwd[15];//密码
char sex[5];
char from[15];
int sport; //参加项目
float result;//比赛结果
int mingci;//名次
float score;//排名后的分数
};
//单链表结构体:
typedef struct anode
{
struct athlete adata;// adata为Athlete结构类型的数据
struct anode *next; //后继结点
}aNode,*aLink;//Node为anode类型的结构变量,*aLink为anode类型的指针变量
void addAthlete(aLink alink);
void saveAthlete(aNode* alink);
aLink openAthlete();
int main()
{
aLink alink,temp;
alink=(aNode*)malloc(sizeof(aNode));
temp=(aNode*)malloc(sizeof(aNode));
addAthlete(alink);
temp= openAthlete();
PAUSE;
return;
}
//添加运动员
void addAthlete(aLink alink)
{
aNode *apoint,*arecord,*s; //临时的结构体指针变量
char ch,flag=0,id[10],ctemp[15];
int itemp;
float ftemp;
arecord=alink;
s=alink->next;
CLEAR;
while(arecord->next!=NULL)
{
arecord=arecord->next; //将指针移到链表末尾
}
while(alink)//一次可输入多条记录,输入0结束添加操作
{
while(alink)//输入ID,不可重复
{
printf("请输入ID(输入0返回):");
scanf("%s",&id);
if(strcmp(id,"0")==0)
{return;}
s=alink->next;
while(s)//查询id是否存在
{
if(strcmp(s->adata.ID,id)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
{
printf("这个ID %d 已存在,重试?(y/n)",id);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
continue;
}
else break;
}
apoint=(aNode*)malloc(sizeof(aNode));
if(!apoint)
{
printf("申请内存失败!\n");
PAUSE;
return;
}
strcpy(apoint->adata.ID,id);
printf("请输入姓名:");
scanf("%s",&ctemp);
strcpy(apoint->adata.name,ctemp);
strcpy(apoint->adata.pwd,"111");
printf("请输入性别:");
scanf("%s",&ctemp);
strcpy(apoint->adata.sex,ctemp);
printf("请输入单位:");
scanf("%s",&ctemp);
strcpy(apoint->adata.from,ctemp);
printf("请输入项目:");
scanf("%d",&itemp);
apoint->adata.sport=itemp;
apoint->adata.result=0.0;
apoint->adata.mingci=0;
apoint->adata.score=0.0;
apoint->next=NULL; //标明这是链表的尾节点
arecord->next=apoint;//将新建的节点加入到链表尾部
arecord=apoint;
saveAthlete(arecord);//保存
}
return;
}
}
//保存到文件
void saveAthlete(aNode* alink)
{
FILE* afp;
aNode *ap;
int count=0;
afp=fopen("athlete.txt","a+");
if(afp==NULL)
{
printf("\n\t打开文件失败!\n");
PAUSE;
return;
}
ap=alink;
while(ap)
{
fprintf(afp,"%10s%15s%15s%5s%15s%5d%5.2f%5d%5.2f\n",
ap->adata.ID,ap->adata.name,ap->adata.pwd,ap->adata.sex,ap->adata.from,ap->adata.sport,
ap->adata.result,ap->adata.mingci,ap->adata.score);
ap=ap->next;
count++;
}
if(count>0)
{
printf("\n\n\t===>已保存到文件,总记录数:%d\n",count);
PAUSE;
}
else
{
CLEAR;
printf("\n\n\t===>链表为空,没有保存记录!\n");
PAUSE;
}
fclose(afp);
}
//从文件读取
aLink openAthlete() //alink 为新链表头指针,为返回值
{
aLink alink;
FILE* afp;
aLink ap,aq;
int c;
afp=fopen("athlete.txt","r");
aq=(aNode*)malloc(sizeof(aNode));
alink=(aNode*)malloc(sizeof(aNode));
aq->next=NULL;
alink->next=aq;
while(!feof(afp))
{
ap=(aNode*)malloc(sizeof(aNode));
aq=(aNode*)malloc(sizeof(aNode));
fread(ap,sizeof(aNode),1,afp);
if(ap==NULL)
{ printf("\n\n\t\t没有记录!\n\t");
PAUSE;
exit(0);
}
printf("%s\t %s\t %s\t %s\t %s\t %d\t %.2f\t %d\t %.2f\n",
ap->adata.ID,ap->adata.name,ap->adata.pwd,ap->adata.sex,ap->adata.from,ap->adata.sport,
ap->adata.result,ap->adata.mingci,ap->adata.score);
fflush(stdin);
ap->next=aq->next;
aq->next=ap;
aq=ap;
}
PAUSE;
fclose(afp);
return alink;
}