求双链表用磁盘资料储存的函数和加载函数,如果成功分数全给你,绝不含糊,求高手帮忙!
求双链表用磁盘文件储存的函数和加载函数,如果成功分数全给你,绝不含糊,急急急!!!求高手帮忙!!!
下面给出了类型定义,链表的初始化,创建链表的函数以及输出函数;
要求:在创建双链表之后能把数据保存在磁盘文件中,加载后能成功显示在屏幕上,请大家继续写
#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的数据,从文件导入的时候只导入数据成员,指针变量没有任何意义,重新设置指针的值
------解决方案--------------------
下面给出了类型定义,链表的初始化,创建链表的函数以及输出函数;
要求:在创建双链表之后能把数据保存在磁盘文件中,加载后能成功显示在屏幕上,请大家继续写
#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; }