当前位置: 代码迷 >> C语言 >> [求助]C语言对数据文件的链表操作是怎么用的
  详细解决方案

[求助]C语言对数据文件的链表操作是怎么用的

热度:276   发布时间:2007-05-25 09:02:59.0
[求助]C语言对数据文件的链表操作是怎么用的

好急啊.
下面是我根据谭浩强的课本编的对数据文件的链表。它能将数据读入链表,但输出的时候,只输出一次数据。检查的时候,发现链表输出函数void print(struct yxdata *head)中p=p->next;这条语句好象没起作用,输出一次后p=NULL,循环就结束了,而没有将链中的所有数据输出。请问这该怎么办啊,求大家帮个忙啦,谢谢。

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#define LEN sizeof(struct yxdata)
#define NULL 0

struct yxdata
{
double dep;
double perm;
double por;
double vcal;
double xmd;
struct yxdata *next;
};

int n;

struct yxdata *creat(void)
{
struct yxdata *head;
struct yxdata *p1,*p2;
n=0;
p1=p2=(struct yxdata *)malloc(LEN);

char fn1[30];
FILE *fp1;
printf("请输入数据文件名(加扩展文件名):");
scanf("%s",fn1);
fp1=fopen(fn1,"r");
fscanf(fp1,"%lf%lf%lf%lf%lf",&p1->dep,&p1->por,&p1->perm,&p1->vcal,&p1->xmd);
head=NULL;
while(!feof(fp1))
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p1=(struct yxdata *)malloc(LEN);
fscanf(fp1,"%lf%lf%lf%lf%lf",&p1->dep,&p1->por,&p1->perm,&p1->vcal,&p1->xmd);
}
p2->next=NULL;
fclose(fp1);
return(head);
}

void print(struct yxdata *head)
{
struct yxdata *p;
printf("\nNOW,These %d records are:\n",n);
printf("dep\t");
printf("por\t");
printf("perm\t");
printf("vcal\t");
printf("xmd\n");
p=head;
if(head!=NULL)
do
{
printf("%7.3lf\t%7.3lf\t%7.3lf\t%7.3lf\t%7.3lf\n",p->dep,p->por,p->perm,p->vcal,p->xmd);
p=p->next;
}while(p!=NULL);
}

void main()
{
struct yxdata *head;
head=creat();
print(head);
}


数据文件是这样yx.txt
1722.28 7.8 0.01 50.5 -999
1722.65 6.5 0.01 -999 -999
1727.51 11.7 0.02 42 0.014
1727.73 9.6 0.01 -999 -999
1740.625 7.5 0.01 25 0.042
1740.695 5.7 0.01 -999 -999
1745.035 7 0.01 20.5 0.058
1821.13 6 0.02 17 0.099
1821.97 5 0.02 -999 -999
1859.38 8.9 0.03 23 0.053
1869.58 12.6 0.17 -999 -999
1870.11 15.3 0.28 13 0.086
1870.45 14.5 0.35 -999 -999
1871.15 13.5 0.23 -999 -999
1871.97 12.8 0.18 14.5 0.098
1875.269 13.9 0.61 22.5 0.065
1876.089 13.4 1.01 -999 -999
1876.969 5.4 0.48 -999 -999
1877.689 15.5 0.67 14.5 0.118
1878.049 14.7 0.29 -999 -999
1878.269 13 0.07 -999 -999
1878.949 12.9 0.92 18.5 0.128
1879.669 14.6 0.26 -999 -999
1879.849 12.8 0.17 -999 -999

搜索更多相关的解决方案: 链表  C语言  数据文件  谭浩强  yxdata  

----------------解决方案--------------------------------------------------------
你的链表中好像只有个 head 后面你没有链上
就是在你的creat()函数中有逻辑错误
----------------解决方案--------------------------------------------------------

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#define LEN sizeof(struct yxdata)
#define NULL 0

struct yxdata
{
double dep;
double perm;
double por;
double vcal;
double xmd;
struct yxdata *next;
};

int n;

struct yxdata *creat(void)
{
struct yxdata *head;
struct yxdata *p1,*p2;
n=0;
p1=p2=(struct yxdata *)malloc(LEN);

char fn1[30];
FILE *fp1;
printf("请输入数据文件名(加扩展文件名):");
scanf("%s",fn1);
fp1=fopen(fn1,"r");
fscanf(fp1,"%lf%lf%lf%lf%lf",&p1->dep,&p1->por,&p1->perm,&p1->vcal,&p1->xmd);
head=NULL;
while(!feof(fp1))
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1; //加个这句就行了....
p1=(struct yxdata *)malloc(LEN);
fscanf(fp1,"%lf%lf%lf%lf%lf",&p1->dep,&p1->por,&p1->perm,&p1->vcal,&p1->xmd);
}
p2->next=NULL;
fclose(fp1);
return(head);
}

void print(struct yxdata *head)
{
struct yxdata *p;
printf("\nNOW,These %d records are:\n",n);
printf("dep\t");
printf("por\t");
printf("perm\t");
printf("vcal\t");
printf("xmd\n");
p=head;
if(head!=NULL)
do
{
printf("%7.3lf\t%7.3lf\t%7.3lf\t%7.3lf\t%7.3lf\n",p->dep,p->por,p->perm,p->vcal,p->xmd);
p=p->next;
}while(p!=NULL);
}

void main()
{
struct yxdata *head;
head=creat();
print(head);
}


----------------解决方案--------------------------------------------------------