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;
}

效果

相关推荐
暴力求解8 分钟前
C++类和对象(上)
开发语言·c++·算法
JKHaaa16 分钟前
几种简单的排序算法(C语言)
c语言·算法·排序算法
让我们一起加油好吗22 分钟前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算
FogLetter40 分钟前
微信红包算法揭秘:从随机性到产品思维的完美结合
算法
BUG收容所所长1 小时前
二分查找的「左右为难」:如何优雅地找到数组中元素的首尾位置
前端·javascript·算法
itsuifengerxing2 小时前
python 自定义无符号右移
算法
猎板PCB厚铜专家大族2 小时前
高频 PCB 技术发展趋势与应用解析
人工智能·算法·设计规范
dying_man2 小时前
LeetCode--24.两两交换链表中的结点
算法·leetcode
yours_Gabriel2 小时前
【力扣】2434.使用机器人打印字典序最小的字符串
算法·leetcode·贪心算法
草莓熊Lotso3 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法