链表存储文件
A. c语言中怎样用链表保存结构体数据(动态数据结构)
链表有多种形式,如:单向链表,双向链表,单向循环链表,双向循环链表。将链表结构定义为list_t,则该类型中一定(至少)存在一个指向下一节点的指针list_t
*next;除了这个指针,list_t
中可以包含其它类型的数据,包括结构体变量。比如:typedef
struct
{
struct
usr_struct
data;
list_t
*next;
}
list_t;
B. 如何将c++将链表存储文件中
首先看你链表里面存的是什么数据类型,比如是char类型,那么你就遍历链表,把每个链表保存的数据保存到一个char类型变量中,然后把这个char类型变量写入文件就可以了!
文件的存储结构是自己设计的,如果要将取出的文件数据放到链表中,只需按照当初写的文件结构读出来,然后依次存到链表中就可以了!
C. C语言链表数据存入文件的存储问题
链表存如文本跟打印在窗口方法是一样的,就是操作函数变变就行。
读取的话也就是一节一节读取,可以用插入的方式creat整个链表。
D. 关于C语言中,链表数据的文件储存和提取。
当把链表已经确定的时候,就可以依次存入文件。
和平时链表的遍历一样,每读取一个节点内容就进行一次存入操作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。
按照问题要求的代码如下:
Consumer*read_list()
{
FILE*fp;
if((fp=fopen("CONSUMER.dat","rb"))==NULL)
{
printf("无法读取CONSUMER.dat ");
returnNULL;
}
intsign;
Consumer*s,*p,*head;
head=(Consumer*)malloc(SIZE_C);
if(head==NULL)
{
printf("读取失败!内存空间申请不足! ");
returnNULL;
}
fseek(fp,0,SEEK_END);
if(ftell(fp)==0)
{
returnNULL;
}
p=head;
p->next=NULL;
while(feof(fp))
{
s=(Consumer*)malloc(SIZE_C);
//fread(s,SIZE_C,1,fp);
fread(s,sizeof(char),SIZE_C,fp);
p->next=s;
p=s;
p->next=NULL;
}
fclose(fp);
returnhead;
}//读取文件到链表
intsave_consumer(Consumer*p)
{
FILE*fp;
Consumer*head;
head=p;//p为已经构建好的链表
//if((fp=fopen("CONSUMER.dat","ab+"))==NULL)
if((fp=fopen("CONSUMER.dat","wb"))==NULL)
{
printf("无法打开CONSUMER.dat! ");
return-1;
}
while(p!=NULL)
{
//fwrite(p,SIZE_C,1,fp);
fwrite(p,sizeof(char),SIZE_C,fp);
p=p->next;
}
fclose(fp);
return1;
}//储存链表到文件
E. c语言,关于保存链表到文件和从文件装载链表(高手请进,急)
拿去用吧~
#include<stdio.h>
#include<malloc.h>
#include<string.h>
structaddress
{
inta;
intb;
charc;
address*next;
};
voidSaveToFile(structaddress*p,FILE*fp)
{
if(p!=NULL)
{
do
{
fwrite(p,sizeof(structaddress),1,fp);
p=p->next;
}
while(p!=NULL);
}
}
intload(FILE*fp,structaddress**head,int&n)//读取文件数据,建立链表
{
structaddress*p1,*p2;
*head=(structaddress*)malloc(sizeof(structaddress));
memset(*head,0,sizeof(structaddress));
if(fread(*head,sizeof(structaddress),1,fp)!=1)
{
free(*head);
*head=NULL;
return(0);
}
p2=*head;
n++;
while(!feof(fp))
{
p1=(structaddress*)malloc(sizeof(structaddress));
fread(p1,sizeof(structaddress),1,fp);
p2->next=p1;
p2=p1;
n++;
}
p2->next=NULL;
return(n);
}
voidmain()
{
structaddress*head;
intn=0;
structaddress*Test[10]={0};
inti=0;
FILE*fp=NULL;
for(;i<10;i++)
{
Test[i]=(structaddress*)malloc(sizeof(structaddress));
if(Test[i]!=NULL)
{
memset(Test[i],0,sizeof(structaddress));
//输入你的数据(a,b,c)
//如下
Test[i]->a=100+i;//不用则注释掉
}
}
for(i=0;i<10;i++)
{
if(i<10)
{
Test[i]->next=Test[i+1];//将结构指针连成链表
}
}
if((fp=fopen("addrbook","wb"))!=NULL)
{
SaveToFile(Test[0],fp);
fclose(fp);
}
if((fp=fopen("addrbook","rb"))!=NULL)
{
load(fp,&head,n);
}
}
F. 关于C语言中,链表的文件储存方式
思路1是可行的,但思路2大多情况下是不可行的,因为链表是动态申请内存空间的,并且地址(理论上是随机的)不确定,你用数据块来读写,这不就等于原先随机生产的指针地址都拿过来了?(如果释放了链表的内存,被其它给占用了该内存点,你的程序大多情况下会漰掉的)
思路2的可行情况:
1.原先申请的内存不能释放,并且还在一起(当然程序也不可以关闭),保存文件等于没啥用处
2.在读取文件后,重置一下指向指针的地址!...
G. c语言中怎么讲链表中的数据存到文件中
fwrite
中,每次写的都是id,应该是fwrite(te,sizeof(ID),1,TEL);
另外结构体中name、tel、style、mail都应该是一个buf,这样才会将数据写进去
例如
char
name[32];
H. C语言的链表数据如何保存在文件中
可以将链表的结构按顺序读出来存放在文件中,在家载的时候读文件然后重新生成链表结构就可以了
I. 如何将该链表中的数据以文件形式保存在磁盘上
楼上的思路是正解,你要是喜欢,我还可以教你一点旁门左道的东西。
其实也简单,就是自定义malloc函数,使得链表在分配空间时在一个限定区段内(比如0000~FFFF)进行分配,即你已经知道了链表可能存在的最大空间,然后保存时,直接用指针:
fwrite()把整个区段写进去,然后再记录根地址即可;
调用时,先把整个区段读进去,然后把根地址读出来作为根,这样整个链表一共用两个指令就完成读写操作了。
不要觉得有多无赖可笑,现代操作系统:WINXP
/
VISTA
/
WIN7
/
LINUX
/
OS
X等等,其快速“休眠”功能完全就是上面的解法,就是把内存和寄存器状态一并写入磁盘,这个方法非常快,而且不会出错,但是能把教你数据结构的老师气得吐血。
有人说这样产生的文件会很大,大怕什么,压缩一下不就行了?反正里面实际上放置的是一个稀疏矩阵,压缩后的结果可能比楼上产生的文件更小。
J. 链表怎么储存到文件
这个不可以。因为指针的指向空间是有malloc分配的。内存随机。所以即使你把它记录在了文件中。下次依然读不出来。因为地方已经变了。如果还有不懂得地方。可以追加。