#includestdio.h
我们提供的服务有:成都网站建设、网站制作、微信公众号开发、网站优化、网站认证、于都ssl等。为上千多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的于都网站制作公司
#includestdlib.h
//链表定义
typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*************************************
* 链表函数 *
*************************************/
//链表初始化
void InitLink(LinkList L);
//创建函数,尾插法
void CreateLink_T(LinkList L,int n);
//创建函数,头插法
void CreateLink_H(LinkList L,int n);
//销毁函数
void DestroyLink(LinkList L);
//判断是否为空函数
bool EmptyLink(LinkList L);
//获取函数
bool GetLink(LinkList L,int i,int e);
//插入函数
void InsertLink(LinkList L,int i,int e);
//删除函数
void DeleteLink(LinkList L,int i,int e);
//遍历函数
void TraverseLink(LinkList L);
//链表长度函数
int LengthLink(LinkList L);
//合并函数
void MergeLink(LinkList L1,LinkList L2);
void main()
{
LinkList L1,L2;
InitLink(L1);
InitLink(L2);
CreateLink_H(L1,2);
CreateLink_T(L2,2);
TraverseLink(L1);
printf("\n");
TraverseLink(L2);
printf("\n");
MergeLink(L1,L2);
TraverseLink(L1);
TraverseLink(L2);
}
//创建函数,尾插法
void InitLink(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
if (!L)
{
printf("Init error\n");
return;
}
L-next=NULL;
}
void CreateLink_T(LinkList L,int n)
{
if(n1)
{
printf("n must =1\n");
return ;
}
else
{
// L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));// the lower letter p
printf("enter the data :\t");
scanf("%d",(p-data));
p-next=L-next;
L-next=p;
}
}
}
//创建函数,头插法
void CreateLink_H(LinkList L,int n)
{
if (n1)
{
printf("n must =1\n ");
return;
}
else
{
//L=(LinkList)malloc(sizeof(LNode));
LinkList pre=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
pre=L;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
printf("enter the data:\t");
scanf("%d",(p-data));
pre-next=p;
pre=p;
}
pre-next=NULL;
}
}
//销毁函数
void DestroyLink(LinkList L)
{
LinkList q=L,p=L;
while (p)
{
q=p;
p=p-next;
free(q);
}
L-next=NULL;
}
//判断是否为空函数
bool EmptyLink(LinkList L)
{
if (NULL==L-next)
{
return true;
}
else
{
return false;
}
}
//获取函数
bool GetLink(LinkList L,int i,int e)
{
if (i1)
{
return false;
}
else
{
if (EmptyLink(L))
{
return false;
}
LinkList p=L-next;
int j=1;
while(pji)
{
p=p-next;
j++;
}
if (!p||ji)
{
return false;
}
else
{
e=p-data;
return true;
}
}
}
//插入函数
void InsertLink(LinkList L,int i,int e)
{
if (i0||iLengthLink(L))
{
printf("Insert error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p(ji))
{
p=p-next;
j++;
}
if (!p||ji)
{
printf("Insert error\n");
return;
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode));
q-data=e;
q-next=p-next;
p-next=q;
}
}
}
//删除函数
void DeleteLink(LinkList L,int i,int e)
{
if(i=0||iLengthLink(L))
{
printf("delete error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(pji-1)
{
p=p-next;
j++;
}
if(!p||ji)
{
printf("please enter i again\n");
return;
}
else
{
LinkList q=p-next;
e=p-next-data;
p-next=p-next-next;
free(q);
}
}
}
//遍历函数
void TraverseLink(LinkList L)
{
LinkList p=L-next;
if(!p)
{
printf("the Link L is empty\n");
}
while(p)
{
printf("%d\n",p-data);
p=p-next;
}
}
//链表长度函数
int LengthLink(LinkList L)
{
int i=0;
LinkList p=L-next;
while(p)
{
p=p-next;
i++;
}
return i;
}
//合并函数
void MergeLink(LinkList L1,LinkList L2)
{
int i=0,flag=0;
LinkList p1=L1-next,p2=L2-next;
LinkList p=(LinkList)malloc ((LengthLink(L1)+LengthLink(L2)+2)*sizeof(LNode));
LinkList pre=p;
if (!p)
{
printf("MergeLink error\n");
return;
}
p-next=NULL;
while (p1p2)
{
if (p1-data=p2-data)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
else
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
}
while (p1)
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
while(p2)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
while(pre)
{
pre=pre-next;
}
LinkList q=L1;
L1=p;
DestroyLink(q);
DestroyLink(L2);
}
第一步:创建文件 比如说 file *fp=fopen(……);
第二步:写一个循环,把链表的节点一个一个写进文件里。
第三部:记得关闭文件- -
保存指针是没有任何意义的,因为每次程序动态分配内存的位置都不一样,所以保存了的指针下次也不会指向正确的地方。想要保存链表的话只需要保存链表里有用的内容把每个链表里有用的东西按顺序写入文件,读取的时候重新通过动态分配内存来建立新的链表,然后读入对应的内容。不需要知道链表的长度,C里面的输入函数可以返回成功读入的内容的长度,如果失败或者是文件到了结尾就会返回-1。所以只需要看看每次返回的值。如果不是-1,继续读取下一个,否则停止读取,链表终止。
比如:
struct list{
int i;
float f;
char c;
struct list *next;
};
输出:
struct list *l;
fprintf(fp,"%d %f %c\n",l-i,l-f,l-c);
输入:
struct list *l=0,*p;
while(1){
if(l=0){
l=(struct list *)malloc(sizeof(struct list));
l-next=0;
p=l;
}
else{
p-next=(struct list *)malloc(sizeof(struct list));
p=p-next;
p-next=0;
}
int m=fscanf(fp,"%d %f %c",(p-i),(p-f),(p-c));
if(m==-1) break;
}
head=(node*)malloc(sizeof(node));/ /创建头结点
head-next=NULL;
while(n--)
{
printf("\n请输入单链表第%d个结点的值:",i++);
scanf("%d",a);
p=(node*)malloc(sizeof(node));
p-info=a;
p-next=head-next;
head-next=p;
}
追问
能不能详细一点呢
追答
#include "stdio.h"
typedef int datatype;
typedef struct link_node
{
datatype info;
struct link_node *next;
}node;
main()
{
int i=1,n,a;
node *head,*p,*q;
printf("\n本程序建立带头结点的单链表:\n");
printf("请输入你所需要建立带头结点的单链表的结点数:");
scanf("%d",a);
head=(node*)malloc(sizeof(node));
head-next=NULL;
while(a)
{
printf("\n请输入单链表第%d个结点的值:",i++);
scanf("%d",n);
if(n==0)
break;
p=(node*)malloc(sizeof(node));
p-info=n;
p-next=head-next;
head-next=p;
a--;
}
if(!head-next) printf("\n单链表是空的!\n");
else
{
printf("\n单链表各个结点的值分别为:\n");
q=head-next;
while(q)
{
printf("%5d",q-info);/*输出非空表中第一个结点的值*/
q=q-next;/*p指向第一个结点的下一个结点*/
}
}
printf("\n");
}