求双链表用磁盘资料储存的函数和加载函数,如果成功分数全给你,绝不含糊,求高手帮忙!

求双链表用磁盘文件储存的函数和加载函数,如果成功分数全给你,绝不含糊,急急急!!!求高手帮忙!!!
下面给出了类型定义,链表的初始化,创建链表的函数以及输出函数;
要求:在创建双链表之后能把数据保存在磁盘文件中,加载后能成功显示在屏幕上,请大家继续写
#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 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(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;
}