C语言中链表的存储、读取、修改问题
我已经知道链表内的数据如何保存到文件中去了,现在有几个东西有点乱,请哪位达人给教下。先说一下我自己的办法。首先要读取一个用链表存储成的文件,先建立一个与之相对应的结构体,...
我已经知道链表内的数据如何保存到文件中去了,现在有几个东西有点乱,请哪位达人给教下。
先说一下我自己的办法。
首先要读取一个用链表存储成的文件,先建立一个与之相对应的结构体,然后以"r"模式下打开文件,一个一个把结构体读出来,再用malloc分配至堆中去,直至EOF.然后对堆中的数据进行相应的修改操作.全部修改完后,再将堆中的数据一个一个存回文件中去?然后我有这么几个问题.
1、链表存到文件中去后,再取出来是不是要再次对各个元素进行链表的关联(就是下一个元素地址赋予前一个元素中的地址变量中)?有没有更简单的方法让其自动恢复原先的链表关系?
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊? 展开
先说一下我自己的办法。
首先要读取一个用链表存储成的文件,先建立一个与之相对应的结构体,然后以"r"模式下打开文件,一个一个把结构体读出来,再用malloc分配至堆中去,直至EOF.然后对堆中的数据进行相应的修改操作.全部修改完后,再将堆中的数据一个一个存回文件中去?然后我有这么几个问题.
1、链表存到文件中去后,再取出来是不是要再次对各个元素进行链表的关联(就是下一个元素地址赋予前一个元素中的地址变量中)?有没有更简单的方法让其自动恢复原先的链表关系?
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊? 展开
2个回答
展开全部
1、链表存到文件中去后,再取出来是不是要再次对各个元素进行链表的关联(就是下一个元素地址赋予前一个元素中的地址变量中)?有没有更简单的方法让其自动恢复原先的链表关系?
答:链表的关系的却需要重新建立,没有别的方法,这里只需要重新设置,因为链表是存储在内存中的,每次malloc出来的指针地址不一致,无法存储到文件中,下次继续使用。
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
答:文件中存储的是整个链表的信息,你只需要每次读出一个struct就可以了。这个malloc出来的struct中你需要读取一个index的值,然后以这个index的值再建立一个链表,将原来那个malloc出来的struct可以释放,这样就可以不用担心文件很大,怕内存不足的情况。因为即使你的链表再长,一个int值足以表示。如果怕int(4字节)不够,可以用double类型,甚至可以用链表嵌套。
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊?
答:这里写文件就看你自己是怎么打开文件了。(存储的时候是不是按照struct大小存储还是按照实际数据大小存储)最好的方式是可以随便修改,这种方式最难,因为要考虑到更改的是第几个字节。最简单的方式,直接将文件删除,重新建立,但是这样就必须要将所有数据读取到内存中。
如果你要实现问题2中的方法,则问题3即要做大量的修改。
答:链表的关系的却需要重新建立,没有别的方法,这里只需要重新设置,因为链表是存储在内存中的,每次malloc出来的指针地址不一致,无法存储到文件中,下次继续使用。
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
答:文件中存储的是整个链表的信息,你只需要每次读出一个struct就可以了。这个malloc出来的struct中你需要读取一个index的值,然后以这个index的值再建立一个链表,将原来那个malloc出来的struct可以释放,这样就可以不用担心文件很大,怕内存不足的情况。因为即使你的链表再长,一个int值足以表示。如果怕int(4字节)不够,可以用double类型,甚至可以用链表嵌套。
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊?
答:这里写文件就看你自己是怎么打开文件了。(存储的时候是不是按照struct大小存储还是按照实际数据大小存储)最好的方式是可以随便修改,这种方式最难,因为要考虑到更改的是第几个字节。最简单的方式,直接将文件删除,重新建立,但是这样就必须要将所有数据读取到内存中。
如果你要实现问题2中的方法,则问题3即要做大量的修改。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询