鏈表存儲文件
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分配的。內存隨機。所以即使你把它記錄在了文件中。下次依然讀不出來。因為地方已經變了。如果還有不懂得地方。可以追加。