如何将该链表中的数据以文件形式保存在磁盘上

如何将该链表中的数据以文件形式保存在磁盘上,第1张

楼上的思路是正解,你要是喜欢,我还可以教你一点旁门左道的东西。

其实也简单,就是自定义malloc函数,使得链表在分配空间时在一个限定区段内(比如0000~FFFF)进行分配,即你已经知道了链表可能存在的最大空间,然后保存时,直接用指针:

fwrite()把整个区段写进去,然后再记录根地址即可;

调用时,先把整个区段读进去,然后把根地址读出来作为根,这样整个链表一共用两个指令就完成读写 *** 作了。

不要觉得有多无赖可笑,现代 *** 作系统:WINXP

/

VISTA

/

WIN7

/

LINUX

/

OS

X等等,其快速“休眠”功能完全就是上面的解法,就是把内存和寄存器状态一并写入磁盘,这个方法非常快,而且不会出错,但是能把教你数据结构的老师气得吐血。

有人说这样产生的文件会很大,大怕什么,压缩一下不就行了?反正里面实际上放置的是一个稀疏矩阵,压缩后的结果可能比楼上产生的文件更小。

/*要点:把数据内容和链表结构分开,存盘的时候,只存数据,不存指针,这样你明白了吧?*/

#include

<stdio.h>

#include

<stdlib.h>

#include

<string.h>

#define

szSTR

32

struct

TBook

{

int

number

/*书代号*/

char

title[szSTR]

/*书名*/

char

author[szSTR]/*作者*/

int

year/*出版时间*/

float

price

/*单价*/

int

storage

/*库存*/

int

export

/*借出*/

int

total

/*总量*/

}

struct

TLink

{

struct

TBook

book

struct

TLink

*

next

}

struct

TLink

*

Load(char

*

file)

{

FILE

*

f

=

0

struct

TBook

book

int

r

=

0

struct

TLink

*

n

=

0,

*

data

=

0

if(!file

||

!data)

return

0

f

=

fopen(file,

"rb")

if(!f)

return

0

while(!feof(f))

{

r

=

fread(&book,

sizeof(book),

1,

f)

if

(r

<

1)

break

n

=

(struct

TLink

*)malloc(sizeof(*n))

memset(n,

0,

sizeof(*n))

memcpy(n,

&book,

sizeof(book))

n->next

=

data

data

=

n

}

fclose(f)

return

data

}

void

Save(char

*

file,

struct

TLink

*

data)

{

FILE

*

f

=

0

struct

TLink

*

n

=

0

if(!file

||

!data)

return

f

=

fopen(file,

"wb")

if(!f)

return

n

=

data

while(n)

{

fwrite(n,

sizeof(struct

TBook),

1,

f)

n

=

n->next

}

fclose(f)

}

int

main(void)

{

struct

TLink

*

books

=

0

books

=

Load("books.txt")

Save("books.bak",

books)

return

0

}

当把链表已经确定的时候,就可以依次存入文件。

和平时链表的遍历一样,每读取一个节点内容就进行一次存入 *** 作。

不过要注意几个部分的检查:

内存空间是否分配成功

是否成功存入到文件中

在工作完成之后,是否将以后不会用到的变量清空和删除。

按照问题要求的代码如下:

Consumer* read_list()

{

FILE *fp

if ((fp = fopen("CONSUMER.dat", "rb")) == NULL)

{

printf("无法读取 CONSUMER.dat\n")

return NULL

}

int sign

Consumer *s,*p,*head

head= (Consumer*)malloc(SIZE_C)

if (head == NULL)

{

printf("读取失败!内存空间申请不足!\n")

return NULL

}

fseek(fp, 0, SEEK_END)

if (ftell(fp) == 0)

{

return NULL

}

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)

return head

}//读取文件到链表

int save_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!\n")

return -1

}

while (p != NULL)

{

//fwrite(p, SIZE_C, 1, fp)

fwrite(p, sizeof(char), SIZE_C, fp)

p = p->next

}

fclose(fp)

return 1

}//储存链表到文件


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11762276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存