读书人

求双链表用磁盘资料储存的函数和加载函

发布时间: 2012-11-19 10:18:51 作者: rapoo

求双链表用磁盘文件储存的函数和加载函数,如果成功分数全给你,绝不含糊,急急急!!!求高手帮忙!!!
下面给出了类型定义,链表的初始化,创建链表的函数以及输出函数;
要求:在创建双链表之后能把数据保存在磁盘文件中,加载后能成功显示在屏幕上,请大家继续写
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 20
typedef struct dnode
{
int Number;
char Name[max];
int Counter;
struct dnode *prior,*next;
}dlnode,*dlinklist;
void init_linklist(dlinklist *l)
{
*l=(dlinklist)malloc(sizeof(dnode));
(*l)->prior=NULL;
(*l)->next=NULL;
}
void CreateDLinkList(dlinklist L)
{
dlnode *r,*s;
int number,counter;
char flag,name[max];
r=L;
while(flag!='n'&&flag!='N')
{
printf("请输入货物编号:");
scanf("%d",&number);getchar();
printf("请输入货物名称:");
scanf("%s",name);
printf("请输入货物的数量:");
scanf("%d",&counter);getchar();
s=(dlnode*)malloc(sizeof(dnode));
s->Number=number;
strcpy(s->Name,name);
s->Counter=counter;
r->next=s;
s->prior=r;
r=s;
printf("是否还要输入?(Y/N):");
scanf("%c",&flag);getchar();
}
r->next=NULL;
}
void print(dlinklist L)
{
dlinklist p;
p=L->next;
while(p!=NULL)
{
printf("%d %s %d\n",p->Number,p->Name,p->Counter);
p=p->next;
}
}

[解决办法]
链在内存中是内存地址,在文件中是文件偏移量。
[解决办法]
保存:每个dlnode实例保存为文件的一行,按照链表顺序遍历依次保存。
加载:每读取文件一行,malloc一个dlnode对象,memcpy文件行内容到对象。
记录本行的前一行获得的dlnode实例
本行的dlnode实例的prior指向前行的dlnode实例(没有则为NULL)。本行dlnode->prior->next = 本行

[解决办法]
从来写文件直接写内存数据,必须写文本文件时才专门转换成字符串写到文件里
[解决办法]
文件里面存放的是node的数据,从文件导入的时候只导入数据成员,指针变量没有任何意义,重新设置指针的值
[解决办法]

C/C++ code
/* savelist.c */#include<stdio.h>#include<stdlib.h>#include<string.h>#include <stddef.h>#define MAX 20typedef struct dnode  {    int Number;      char Name[MAX];      int Counter;      struct dnode *prior,*next;}dlnode,*dlinklist;void init_linklist(dlinklist *l){    *l=(dlinklist)malloc(sizeof(dlnode));    (*l)->prior=NULL;    (*l)->next=NULL;   }void CreateDLinkList(dlinklist L){      dlnode *r,*s;    int number,counter;    char flag,name[MAX];      r=L;    while(flag!='n'&&flag!='N')       {           printf("请输入货物编号:");        scanf("%d",&number);getchar();        printf("请输入货物名称:");        scanf("%s",name);        printf("请输入货物的数量:");        scanf("%d",&counter);getchar();        s=(dlnode*)malloc(sizeof(dlnode));        memset(s, 0, sizeof(dlnode));        s->Number=number;            strcpy(s->Name,name);        s->Counter=counter;        r->next=s;        s->prior=r;        r=s;        printf("是否还要输入?(Y/N):");        scanf("%c",&flag);getchar();    }    r->next=NULL;}void print(dlinklist L){    dlinklist p;    p=L->next;    while(p!=NULL)    {        printf("%d %s %d\n",p->Number,p->Name,p->Counter);        p=p->next;    }}int save_list(dlinklist L, const char *filename){    dlinklist p;    FILE *fp;    fp = fopen(filename, "wb");    if (fp != NULL) {        p = L->next;        while(p != NULL) {            if (fwrite(p, offsetof(dlnode, prior), 1, fp) < 1) {                fclose(fp);                return -1;            }            p = p->next;        }        fclose(fp);        return 0;    }    return -1;}int load_list(dlinklist L, const char *filename){    dlnode *r,*s;    dlnode node;    FILE *fp;    fp = fopen(filename, "rb");    if (fp != NULL) {        memset(&node, 0, sizeof(node));        r = L;        while (fread(&node, offsetof(dlnode, prior), 1, fp) == 1) {            s = (dlnode *)malloc(sizeof(dlnode));            if (s == NULL) {                fclose(fp);                return -1;            }            memset(s, 0, sizeof(dlnode));            *s = node;            r->next = s;            s->prior = r;            r = s;        }        fclose(fp);        return 0;    }    return -1;} 


[解决办法]
需要先调用init_linklist()函数再调用load_list()
[解决办法]
搜“序列化”

读书人网 >C语言

热点推荐