链表基础部分可以看我以前写的:
链表基础1(超简单)–创建一个长度为n的单链表
链表基础2(超简单)–单链表的插入和删除
链表基础3(超简单)–单链表的逆序
链表基础4(超简单)–创建一个长度为n的双向链表(代码可运行)
#include "stdio.h"
#include "stdlib.h"
typedef struct linked_list
{
int data;
struct linked_list *pnext;
}link;
link *pnew;
link *ptmp;
link *phead;
int count=1;
void creat_head(void);
void add_link(int num);
void sav_link(void);
void red_link(void);
void pri_link(void);
int main(void)
{
int list_long;
int del_num;
int add_num,n;
red_link();
while(1)
{
int flag=0;
printf("***************************\n");
printf("1、增加节点 2、保存\n");
printf("3、打印链表\n");
printf("***************************\n");
scanf("%d",&flag);
if(flag==1)
{
printf("请输入需要创建的链表长度(>1)\n");
scanf("%d",&list_long);
creat_head();
add_link(list_long);
}
if(flag==2)
{
sav_link();
}
if(flag==3)
{
printf("链表为:\n");
pri_link();
}
if(flag==4)
{
return 0;
}
}
return 0;
}
//头节点的创建
void creat_head(void)
{
phead=(link *)malloc(sizeof(link));
phead->data=0;
phead->pnext=NULL;
}
//链表节点的添加
void add_link(int num)
{
int i;
for(i=0;i<=num;i++)
{
pnew=(link *)malloc(sizeof(link));
pnew->data=count;
ptmp=phead;
while(ptmp->pnext!=NULL)
{
ptmp=ptmp->pnext;
}
ptmp->pnext=pnew;
count++;
}
}
void sav_link(void)
{
FILE *fp;
fp=fopen("./data_save.txt","w+");
ptmp=phead->pnext;
while(ptmp->pnext!=NULL)
{
fwrite(ptmp,sizeof(link),1,fp);
ptmp=ptmp->pnext;
}
fclose(fp);
}
void red_link(void)
{
FILE *fp;
fp=fopen("./data_save.txt","r+");
if(fp==NULL)
{
return;
}
creat_head();
ptmp=phead;
for(int i=0;i<=9;i++)
{
pnew=(link *)malloc(sizeof(link));
fread(pnew,sizeof(link),1,fp);
ptmp->pnext=pnew;
pnew->pnext=NULL;
ptmp=ptmp->pnext;
}
fclose(fp);
}
void pri_link(void)
{
for(ptmp=phead->pnext;ptmp->pnext!=NULL;ptmp=ptmp->pnext)
{
printf("%d ", ptmp->data);
}
printf("\n");
}
运行实测:
查看保存的文件:
为什么是乱码这个我没想明白…
还有写保存的时候,从链表头开始写入文件,读取的时候应该先读的是链表尾,为何输出还是顺序的。