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

效果

相关推荐
江畔柳前堤6 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore7 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考8 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX9 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面10 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号10 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽10 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI10 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者12 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者12 小时前
【征程6】校准量化中HistogramObserver解析
算法