欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > DAY5, 使用read 和 write 实现链表保存到文件,以及从文件加载数据到链表中的功能

DAY5, 使用read 和 write 实现链表保存到文件,以及从文件加载数据到链表中的功能

2025/4/18 20:45:07 来源:https://blog.csdn.net/qq_53627084/article/details/145334720  浏览:    关键词:DAY5, 使用read 和 write 实现链表保存到文件,以及从文件加载数据到链表中的功能

题目

        使用read 和 write 实现链表保存到文件,以及从文件加载数据到链表中的功能

代码

link.h文件

typedef int DataType;typedef struct linklist
{struct {DataType data;				//普通节点数据域struct linklist *tail;		//头节点数据域};struct linklist *next;			//指针域,指向下一个节点// struct linklist *perr;		//指针域,指针本节点
}linklist,*linklistPtr;void TextInit(const char* ch);			//文件初始化
linklistPtr load(const char* ch,const linklistPtr H);		//从文件中载入数据到链表
linklistPtr CreatLinkList(void);		//创建头节点
linklistPtr CreatNode(DataType e);		//申请节点 封装数据
void AddData(linklistPtr H,DataType e);	//添加数据
void ShowData(const linklistPtr H);		//显示链表上的数据
void unload(const char* ch,const linklistPtr H);

link.c文件

#include "link.h"void TextInit(const char* ch)
{if(access(ch,F_OK))		//文件不存在{int wfp=open(ch,O_WRONLY|O_CREAT,0666);		//创建文件并打开if(-1==wfp){perror("tips:文件不存在,并且文件创建失败\n\n");		//打开失败,则返回return;}int len=0;write(wfp,&len,sizeof(int));	//写入一个int字节大小数据,记录数据个数close(wfp);		//打开文件,一定要关闭文件printf("tips:文件不存在,文件新建成功\n\n");return;}printf("tips:文件 %s 存在,无需处理\n\n",ch);
}linklistPtr load(const char* ch,const linklistPtr H)
{int rfp=open(ch,O_RDONLY);if(-1==rfp||NULL==H){return NULL;}      //打开文件失败,返回int len;DataType e;read(rfp,&len,sizeof(int));     //读取一个int字节大小数据for(int i=0;i<len;i++){e=0;read(rfp,&e,sizeof(DataType));      //循环读取 DataType 字节大小数据AddData(H,e);       //数据载入当前链表}close(rfp);     //打开文件,一定要关闭文件printf("tips:文本数据,已载入链表\n\n");return NULL;
}void unload(const char* ch,const linklistPtr H)
{int wfp=open(ch,O_RDWR);if(-1==wfp||NULL==H){return;}int len=0;lseek(wfp,0,SEEK_SET);			//光标偏移到文件开头read(wfp,&len,sizeof(int));     //读取一个int字节大小数据lseek(wfp,0,SEEK_END);			//光标偏移到文件末尾linklistPtr temp=H;				//临时节点,用于遍历链表while(temp->next!=NULL){temp=temp->next;							//成为下一个节点write(wfp,&temp->data,sizeof(DataType));	//写入数据len++;										//计数}lseek(wfp,0,SEEK_SET);			//光标偏移到文件开头write(wfp,&len,sizeof(int));close(wfp);     //打开文件,一定要关闭文件printf("tips:链表数据,已写入文本\n\n");
}linklistPtr CreatLinkList(void)
{//堆区申请linklistPtr H=(linklistPtr)malloc(sizeof(linklist));if(NULL==H){return NULL;}//指针域 赋值 初始值H->next=NULL;//数据域 赋值 初始值H->tail=H;return H;
}
//申请节点 封装数据
linklistPtr CreatNode(DataType e)
{//堆区申请linklistPtr newnode=(linklistPtr)malloc(sizeof(linklist));if(NULL==newnode){return NULL;}//指针域 赋值 初始值newnode->next=NULL;//数据域 赋值 初始值newnode->data=e;return newnode;
}void AddData(linklistPtr H,DataType e)
{linklistPtr newnode=CreatNode(e);if(NULL==newnode||NULL==H){return;}//原尾节点 指向 本节点H->tail->next=newnode;//原尾指针 指向 本节点H->tail=newnode;
}void ShowData(const linklistPtr H)
{if(NULL==H){return;}linklistPtr temp=H;printf("tips:当前链表中数据为:");	while(temp->next!=NULL)			//下一个节点不为空{temp=temp->next;			//成为下一个节点printf("%d ",temp->data);	//输出节点内容}printf("\n\n");	
}

main.c文件

int main(int argc, const char *argv[])
{//文件初始化char *ch="link";TextInit(ch);//创建链表 头节点linklistPtr H=CreatLinkList();//手动添加数据AddData(H,11);AddData(H,22);AddData(H,33);//显示当前链表上数据ShowData(H);// //写入到文件中unload(ch,H);// 从文件中载入到链表load(ch,H);ShowData(H);return 0;
}

效果

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词