让我抓狂的文件写入读出链表啊啊!!求给一个简单范例,写入读出链表及主函数,谢谢啦!!!!只有十快大洋 10

 我来答
efanabe
2012-06-12 · TA获得超过2008个赞
知道小有建树答主
回答量:708
采纳率:0%
帮助的人:1130万
展开全部
纯手动根据你的问题要求现做的最简单的范例,完整的程序,经测试,编译执行结果正确。
有读入读出链表函数两个,和主函数。主函数是简单的测试用例,其内容可根据自己的需要更改。

#include <stdio.h>
#include <stdlib.h>

typedef struct _node
{
int val;
struct _node *next;
}Node;

typedef int ElemType;

/*建立带头结点的空链表*/
Node * init()
{
Node * p;
p=(Node*)malloc(sizeof(Node));
p->next=NULL;
return p;
}

/*向链表末尾插入值s*/
void insert(Node * H,ElemType s)
{
Node * p,* q;
for(q=H; q->next; q=q->next);
p=(Node*)malloc(sizeof(Node));
p->next=NULL;
p->val=s;
q->next=p;
}

/*删除链表末尾的元素*/
void deleteR(Node * H)
{
Node * q;
for(q=H; q->next->next; q=q->next);
q->next=NULL;
}

/*从文件读取,构造链表*/
void read(Node * H)
{
FILE * fp;
ElemType s;
if((fp=fopen("Node.dat","rb"))==NULL){printf("文件打开失败\n");return;}
while(!feof(fp))
{
fread(&s,sizeof(ElemType),1,fp);
insert(H,s);/*insert函数的作用是在链表尾部插入值为s的新结点*/
}
deleteR(H);
fclose(fp);
}

/*将链表各结点值写入文件*/
void write(Node * H)
{
FILE * fp;
ElemType s;
Node * p;
if((fp=fopen("Node.dat","wb"))==NULL){printf("文件打开失败\n");return;}
for(p=H->next;p;p=p->next)
{
s=p->val;
fwrite(&s,sizeof(ElemType),1,fp);
}
fclose(fp);
}

void print(Node * H)
{
Node * p;
for(p=H->next; p; p=p->next)
printf("%d ",p->val);
printf("\n");
}

int main()
{
Node *h,*h1;
h=init();
insert(h,10);
insert(h,12);
insert(h,9);
insert(h,21);
insert(h,3);
printf("链表h各元素:\n");
print(h);
write(h);

h1=init();
read(h1);
printf("链表h1各元素:\n");
print(h1);
return 0;
}
zero_fn
2012-06-12 · TA获得超过2258个赞
知道小有建树答主
回答量:1173
采纳率:80%
帮助的人:462万
展开全部
如果是因为读取文件后next指针无效问题的话应该很好解决吧,链表生成的基本操作。如果是文件操作的问题的话应该好好看看资料哦,我采用的是整个结构体存储,有点浪费空间,单比较好处理,如果你要用逐一字段存储的话就会比较麻烦了。下面是一个读写的片段,包含上面两个问题,开始部分的结构体定义可以放到头文件里。
#define TRUE 1
#define FAUSE 0
struct _studentinfo{
UINT32 ID;
UCHAR name[20+1];
UCHAR sex[6+1];
UINT32 math;
UINT32 english;
UINT32 chinese;
}studentinfo;

typedef struct _student{
struct _studentinfo info;
struct _student * next;
}student;

student * read_stud_info(void);
int save_stu(student *head,UCHAR * filename);

student * read_stud_info(void)
{
//char buffer[100*sizeof(student)];
FILE * pF, * pF1;
student * pShead = NULL, * pStail = NULL, * pScur=NULL, * pScur_pre = NULL, * pStmp = NULL,* pStmphead = NULL, * pStmptail = NULL;
UINT32 count = 0,tmpint = 0;
int i = 0, j = 0;
UCHAR choise = ' ',tmpch = ' ';

if(!checkfile()) {puts("\ndisk error! "); return 0;} //检查磁盘文件是否存在
else if(NULL == (pF=fopen("student.dat","rb"))) return 0;
//setbuf (pF , buffer);
fseek(pF, 0L, SEEK_END);
if(1>(count=(ftell(pF)/sizeof(studentinfo))))
{
puts("\n the \"student.dat\" is NULL file");
getch();
pShead = NULL;
pScur = NULL;
pStail = NULL;
choise = '2';
}
else
{
rewind(pF);
while(!feof(pF)) //用链表装入文件记录
{
if(NULL == (pScur = (student*)malloc(sizeof(student))))
{puts("malloc()failed");getch();return FALSE;}
else
{
if(NULL == pShead)
{
pShead = pScur;
pStail = pScur;
pStail->next = NULL;
}
else
pStail->next = pScur;
}
if(1 != (fread(&(pScur->info),sizeof(studentinfo),1,pF)))
{
//puts("read error ");
pStail->next = NULL;
free(pScur);
//fclose(pF);
break;
}
else
{
pScur->next = NULL;
pStail = pScur;
}
}
}
if(fclose(pF)) {puts("\nERROR CLOSE THE FILE");return FALSE;}
return pShead;
}

int save_stu(student *head,UCHAR * filename)
{
//UCHAR * filename is for more function in the future
FILE *pF;
student * phead, * pcur;
phead = head;
pcur=head;
if(NULL == phead) return FALSE;
if(!checkfile()) return FALSE;
remove("student.dat.bak");
if(rename("student.dat","student.dat.bak")) return FALSE;
if(NULL == (pF=fopen("student.dat","wb+"))) return FALSE;
while(!(NULL == pcur))
{
if(1 != (fwrite(&(pcur->info),sizeof(studentinfo),1,pF))) return FALSE;
pcur=pcur->next;
}
if(!(0 == fclose(pF))) return FALSE;
return TRUE;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式