求助各位,我尽力了

huangxin813 2006-05-21 08:47:32
若要从文件中读取数据放入一个链表中,这样做可以不,但我试了不行啊.

struct player *createplayer(void)
{
struct player *p1,*p2;
struct player *head;
FILE *fp;
int n;
n=0;
fp=fopen("playerdata","rb");
p1=p2=(struct player *)malloc(LEN2);
fread(p1,sizeof(LEN2),1,fp);
head=NULL;
while(p1->next!=NULL)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct player *)malloc(LEN2);
fread(p1,sizeof(LEN2),1,fp);
}
p2->next=NULL;
fclose(fp);
return head;
}
...全文
217 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-05-21
  • 打赏
  • 举报
回复
楼主一个一个函数测试一下 ....
链表的建立createplayer 似乎没有什么问题 ...

楼主可以试试 建立后马上输出,
看内容对不对 ...
huangxin813 2006-05-21
  • 打赏
  • 举报
回复
大家帮帮忙啊,也许作好了晚上就要用到
小弟我先谢了
huangxin813 2006-05-21
  • 打赏
  • 举报
回复
struct player *createdata(struct judge *p)
{
struct player *head;
head=create(p);
return head;
}
void savedata(struct player *head,int num)
{
FILE *fp;
int i;
struct player *p;
p=head;
if((fp=fopen("playerdata","ab"))==NULL)
fp=fopen("playerdata","wb");
for(i=0;i<num;i++)
{
fwrite(p,sizeof(LEN2),1,fp);
p=p->next;
}
printf("保存完毕!");
fclose(fp);
}
struct player *createplayer(void)
{
struct player *p1,*p2;
struct player *head;
FILE *fp;
int n;
n=0;
fp=fopen("playerdata","rb");
p1=p2=(struct player *)malloc(LEN2);
fread(p1,sizeof(LEN2),1,fp);
head=NULL;
while(p1->next!=NULL)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct player *)malloc(LEN2);
fread(p1,sizeof(LEN2),1,fp);
}
p2->next=NULL;
fclose(fp);
return head;
}
void orderdata(struct player *head)
{
struct player *p1,*p2;
int i,j;
int torder;
char tname[30];
char tsongname[60];
float ttotalpoint;
p1=p2=head;
for(i=0;i<playernum;i++)
{
for(j=0;j<playernum-1;j++)
{
p2=p1->next;
if(p1->totalpoint<p2->totalpoint)
{
torder=p1->order;p1->order=p2->order;p2->order=p1->order;
strcpy(tname,p1->name);strcpy(p1->name,p2->name);strcpy(p2->name,tname);
strcpy(tsongname,p1->songname);strcpy(p1->songname,p2->songname);strcpy(p2->songname,tsongname);
ttotalpoint=p1->totalpoint;p1->totalpoint=p2->totalpoint;p2->totalpoint=ttotalpoint;
}
}
p1=p1->next;
}
p1=head;
p1->rank=0;
for(i=0;i<playernum;i++)
{
p1->rank=p1->rank+1;
p1=p1->next;
}
for(i=0;i<30;i++)
{
printf(" ");
}
p1=head;
printf("* * * * *比 赛 成 绩* * * * *\n");
printf("排名");
printf("\t\t");
printf("编序");
printf("\t\t");
printf("姓名");
printf("\t\t");
printf("曲目");
printf("\t\t");
printf("成绩");
printf("\n");
for(i=0;i<playernum;i++)
{
printf("%2d",p1->rank);
printf("\t\t");
printf("%2d",p1->order);
printf("\t\t");
printf("%-4s",p1->name);
printf("\t");
printf("%-10s",p1->songname);
printf("\t\t");
printf("%5f",p1->totalpoint);
printf("\n");
}
}

void printdata(struct player *head)
{
struct player *p;
p=head;
printf("* * * * *比 赛 成 绩* * * * *\n");
printf("编序");
printf("\t\t");
printf("姓名");
printf("\t\t");
printf("曲目");
printf("\t\t");
printf("成绩");
printf("\n");
while(p->next!=NULL)
{
printf("%2d",p->order);
printf("\t\t");
printf("%-4s",p->name);
printf("\t");
printf("%-10s",p->songname);
printf("\t\t");
printf("%5f",p->totalpoint);
printf("\n");
p=p->next;
}
}

struct player * deletedata(struct player *head,int num)
{
struct player *p1,*p2;
if(head==NULL)
{
printf("\n找不到成绩结果!\n");
goto end;
}
p1=head;
while(num!=p1->order&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->order)
{
if(p1=head) head=p1->next;
else p2->next=p1->next;
printf("删除:%d号选手数据",num);
playernum=playernum-1;
}
else printf("%d号选手数据未找到!\n",num);
end:
return(head);
}
void deldata()
{
struct player *p1,*p2;
int order;
p1=createplayer();
printdata(p1);
printf("请输入要删除的选手编号:");
scanf("%d",&order);
p2=deletedata(p1,order);
printdata(p2);
savedata(p2,playernum);
}
huangxin813 2006-05-21
  • 打赏
  • 举报
回复
playerdata是一个用来存数据的文件
希望新建一个指针用来存从playerdata中读取的数据
源程序如下:


include<stdio.h>
#include<malloc.h>
#include<cstdlib>
#include<stdlib.h>
#include<string.h>
#define NULL 0
#define LEN1 sizeof(struct judge)
#define LEN2 sizeof(struct player)
struct judge
{
int order;
char name[30];
float score;
struct judge *next;
};
int judgenum;
struct player
{
int order;
char name[30];
char songname[100];
float totalpoint;
int rank;
struct player *next;
};
int playernum;

void main()
{
struct player *createdata(struct judge *p);
void savedata(struct player *head,int );
void deldata();
void orderdata(struct player *head);
struct judge *createjudge(void);
struct player *createplayer(void);

char contestname[100];
int i;
char choice;
struct judge *head1;
struct player *head2;
struct player *readhead;

printf("请输入赛事名称:");
scanf("%s",contestname);
getchar();
head1=createjudge();
while(1)
{
getchar();
printf("\n");
for(i=0;i<=30;i++)
{ printf(" "); }
printf("%s",contestname);
printf("\n\n");
for(i=0;i<=30;i++)
{ printf(" "); }
printf("1、 建立选手数据 \n");
for(i=0;i<=30;i++)
{ printf(" "); }
printf("2、 保存选手数据 \n");
for(i=0;i<=30;i++)
{ printf(" "); }
printf("3、 删除选手数据 \n");
for(i=0;i<=30;i++)
{ printf(" "); }
printf("4、 选手分数排序 \n");
for(i=0;i<=30;i++)
{ printf(" "); }
printf("5、 退出 \n");
printf("\n\n");
printf("请输入选择:");
choice=getchar();
switch(choice)
{
case '1':head2=createdata(head1);break;
case '2':savedata(head2,playernum);break;
case '3':deldata();;break;
case '4':{
readhead=createplayer();
orderdata(readhead);
break;
}
case '5':exit(0);break;
default:printf("请正确输入");
}
}
}


struct judge *createjudge(void)
{
struct judge *head;
struct judge *p1,*p2;
char str[30];
judgenum=0;
printf("请输入裁判#%d的姓名,按#结束(至少三名):",judgenum+1);
head=NULL;
scanf("%s",str);
while(strlen(str)!=1||str[0]!='#')
{
p1=(struct judge *)malloc(LEN1);
if(judgenum==0)
{
head=p1;
p2=p1;
}
p1->order=++judgenum;
strcpy(p1->name,str);
p1->next=NULL;
p2->next=p1;
p2=p1;
printf("请输入裁判#%d的姓名:",judgenum+1);
scanf("%s",str);

}

return(head);
}
void printjudge(struct judge *head)
{
struct judge *p;
p=head;
if(head!=NULL)
do
{
printf("%s的分数为:",p->name);
printf("%f\n",p->score);
p=p->next;
}while(p!=NULL);
}
void scanjudge(struct judge *head)
{
struct judge *p;
p=head;
while(p!=NULL)
{ printf("输入裁判#%d的分数:",p->order);
scanf("%f",&p->score);
p=p->next;
}
}

struct player *create(struct judge *head)
{
int i,j;
float total=0,t;
struct player *head1;
struct player *p1,*p2;
struct judge *pj1,*pj2;
char tname[100];

playernum=0;
pj1=pj2=head;
p1=p2=(struct player *)malloc(LEN2);
printf("请输入参赛选手编序:(输入0结束");
scanf("%d",&p1->order);
getchar();
printf("请输入参赛选手姓名:");
scanf("%s",p1->name);
printf("请输入参赛选手曲目:");
//gets(p1->songname);
scanf("%s",p1->songname);
printf("请输入各个裁判的评分 ");
scanjudge(pj1);
pj1=head;
for(i=0;i<judgenum-1;i++)
{
for(j=0;j<judgenum-1-i;j++)
{
pj2=pj1->next;
if(pj1->score>pj2->score)
{
t=pj1->score;pj1->score=pj2->score;pj2->score=t;
strcpy(tname,pj1->name);strcpy(pj1->name,pj2->name);strcpy(pj2->name,tname);
}
pj1=pj1->next;
}
pj1=head;
}
pj1=head->next;
for(i=0;i<judgenum-2;i++)
{
total=total+pj1->score;
pj1=pj1->next;
}
p1->totalpoint=total*1/(judgenum-2);
printf("该选手的成绩:\n");
printjudge(head);
pj1=pj2=head;

while(pj1->next!=NULL)
{
pj2=pj1->next;
pj1=pj1->next;
}
pj1=head;
printf("去掉一个最高分:%f\n",pj2->score);
printf("去掉一个最低分:%f\n",pj1->score);
printf("%d号参赛选手%s《 %s 》的最后得分为:%f\n",p1->order,p1->name,p1->songname,p1->totalpoint);
head1=NULL;
do
{
playernum=playernum+1;
if(playernum==1) head1=p1;
else p2->next=p1;
p2=p1;
p1=(struct player *)malloc(LEN2);
printf("请输入参赛选手编序:");
scanf("%d",&p1->order);
if(p1->order==0) break;
getchar();
printf("请输入参赛选手姓名:");
scanf("%s",p1->name);
printf("请输入参赛选手曲目:");
scanf("%s",p1->songname);
printf("请输入各个裁判的评分 ");
scanjudge(pj1);
pj1=head;
for(i=0;i<judgenum-1;i++)
{
for(j=0;j<judgenum-1-i;j++)
{
pj2=pj1->next;
if(pj1->score>pj2->score)
{
t=pj1->score;pj1->score=pj2->score;pj2->score=t;
strcpy(tname,pj1->name);strcpy(pj1->name,pj2->name);strcpy(pj2->name,tname);
}
pj1=pj1->next;
}
pj1=head;
}
pj1=head->next;
for(i=0;i<judgenum-2;i++)
{
total=total+pj1->score;
pj1=pj1->next;
}
p1->totalpoint=total*1/(judgenum-2);
printf("该选手的成绩:\n");
printjudge(head);
pj1=pj2=head;
while(pj1->next!=NULL)
{
pj2=pj1->next;
pj1=pj1->next;
}
pj1=head;
printf("去掉一个最高分:%f\n",pj2->score);
printf("去掉一个最低分:%f\n",pj1->score);
printf("%d号参赛选手%s《 %s 》的最后得分为:%f\n",p1->order,p1->name,p1->songname,p1->totalpoint);
}while(p1->order!=0);
p2->next=NULL;
return(head1);
}
f_acme 2006-05-21
  • 打赏
  • 举报
回复
既然p1是一个结构指针,那么应该读取一个结构吧。
fread(p1,sizeof(LEN2),1,fp);
fread(p1,sizeof(struct player),1,fp);
这样才可以放进结构里面吧。
daseny 2006-05-21
  • 打赏
  • 举报
回复
我就看了一下creat,如果不是f_acme兄说的sizeof(LEN2)问题,只会丢掉最后一个元素而已。
代码这样写会清晰一点:

//====================================
struct player *createplayer(void)
{
struct player *p1, *p2, *head;
FILE *fp;

fp = fopen("playerdata","rb");
p1 = (struct player *)malloc(LEN2);
fread(p1,LEN2,1,fp); //如果LEN2是常量,sizeof的值就很奇怪了
head = p1; //head不必放到循环里

while(p1->next!=NULL)
{
p2 = p1;
p1 = (struct player *)malloc(LEN2);
fread(p1,LEN2,1,fp);
p2->next = p1;
}

fclose(fp);
return head;
}
//====================================

最先需要验证的是每个元素是否成功读出了,可以在read之后把相关值打印一下。
caiyujie87 2006-05-21
  • 打赏
  • 举报
回复
up
huangxin813 2006-05-21
  • 打赏
  • 举报
回复
各位帮帮忙啊,我调了很久,第三个和第四个没有用,和同学讨论好像是从文件中读取数据存在问题,所读取的数据不能按设想放入要建立的一个链表中

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧