首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-11-19 
求双链表用磁盘文件储存的函数和加载函数,如果成功分数全给你,绝不含糊,急急急!!!求高手帮忙!!!下面给出了

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

热点排行
Bad Request.