关于C语言中,链表数据的文件储存和提取。
发布时间:2025-05-13 05:35:49 发布人:远客网络
一、关于C语言中,链表数据的文件储存和提取。
1、 fwrite(pinput,sizeof(struct fac),1,fp);
2、 while(pinput->next!=NULL);
3、这个理解了,你那个就不难解决了啊。现在你要写最后一个结点信息,加入执行
4、pinput=pinput->next;这句后pinput就指向了最后一个结点,此时你还没写它。可是接下来的
5、while判断就让你退出了循环,你可以将while改成while(pinput==NULL);
6、第二个问题,可以用while循环啊,判断条件就是读到文件尾部就退出。
7、fscanf();//你从磁盘读数据,fp会自动移动
二、麻烦讲解一下C语言中的链表
1、链表的最基本组成和功能,以单链表为例
2、首先单链表最基本要有一个数据区和一个指向区如下
3、每个这样的结构称之为一个节点。每个节点又指向区连接。
4、这样通过链表的第一个几点地址就可以找到整个链表的节点从而获取节点中的数据了。
5、上面说的是最基本的链表,也称之为裸链表
6、双向链表和单链表类似,就是多了一个指向区,指向当前节点的上一个节点,好处是,因为单链表只能顺序向下读取,而不能你想读取,双项链就可以任意方向读取数据了。
7、一般链表在应用时,会额外建立一个链表头。在链表头里会有一些方便对链表操作的东西。
8、比如你说的free指针,链表的第一节点地址,链表的尾地址,甚至一些控制变量如链表容量等
9、至于链表的具体应用很复杂,但其根本不会改变,并且链表的数据区可以是任何类型的数据,甚至可以是子链表。
三、c语言 链表操作:建立,显示及节点的插入,删除
先写个头文件,包含链表的各种操作。具体代码如下:
typedef LNode*LinkList;//另一种定义LinkList的方法
//单链表线性表的基本操作(12个)
//操作结果:构造一个空的线性表L
L=(LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点
void CreateList_L(LinkList&L, int n)//算法2.11
//逆位序输入(随机产生)n个元素的值,建立带表头结点的单链线性表L
L=(LinkList)malloc(sizeof(LNode));
L->next= NULL;//先建立一个带头结点的单链表
p=(LinkList)malloc(sizeof(LNode));//生成新结点
p->data= rand()%200;//改为一个随机生成的数字(200以内)
//初始条件:线性表L已存在。操作结果:销毁线性表L
int ClearList(LinkList L)//不改变L
//初始条件:线性表L已存在。操作结果:将L重置为空表
p=L->next;// p指向第一个结点
L->next=NULL;//头结点指针域为空
//初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
//初始条件:线性表L已存在。操作结果:返回L中数据元素个数
LinkList p=L->next;// p指向第一个结点
int GetElem(LinkList L,int i,ElemType&e)//算法2.8
// L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回-1
LinkList p=L->next;// p指向第一个结点
while(p&&j<i)//顺指针向后查找,直到p指向第i个元素或p为空
if(!p||j>i)//第i个元素不存在
int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType))
//初始条件:线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
//操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
//若这样的数据元素不存在,则返回值为0
if(compare(p->data,e))//找到这样的数据元素
int PriorElem(LinkList L,ElemType cur_e,ElemType&pre_e)
//操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
//返回1;否则操作失败,pre_e无定义,返回-1
LinkList q,p=L->next;// p指向第一个结点
while(p->next)// p所指结点有后继
int NextElem(LinkList L,ElemType cur_e,ElemType&next_e)
//操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
//返回1;否则操作失败,next_e无定义,返回-1
LinkList p=L->next;// p指向第一个结点
while(p->next)// p所指结点有后继
int ListInsert(LinkList L,int i,ElemType e)//算法2.9。不改变L
//在带头结点的单链线性表L中第i个位置之前插入元素e
while(p&&j<i-1)//寻找第i-1个结点
if(!p||j>i-1)// i小于1或者大于表长
s=(LinkList)malloc(sizeof(LNode));//生成新结点
int ListDelete(LinkList L,int i,ElemType&e)//算法2.10。不改变L
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
while(p->next&&j<i-1)//寻找第i个结点,并令p指向其前趋
if(!p->next||j>i-1)//删除位置不合理
q=p->next;//删除并释放结点
int ListTraverse(LinkList L,void(*vi)(ElemType))
// vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同
//操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
LinkList ReverseList(LinkList phead)//实现链表的逆置
#endif// LINKEDLIST_H_INCLUDED
int compare(ElemType c1,ElemType c2)
void MergeList_L(LinkList&La, LinkList&Lb, LinkList&Lc)
//已知单链线性表La和Lb的元素按值非递减排列。
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
Lc= pc= La;//用La的头结点作为Lc的头结点
if(pa->data<= pb->data)
pc->next= pa? pa: pb;//插入剩余段
printf("在L的表尾依次插入10个数据后:L=");
printf("第4个元素的值为:%d\n",e);
ListDelete(L,4,e);//删除第4个数据
printf("删除第4个数据后:L=");