线性表—链式存储结构

链式存储结构就是一环扣一环的线性结构,好像链条中的每一个人都只知道下一个人的地址,只有从前往后顺序查找才能找到第 j 个人。

链式结构的好处是在插入和删除时不需要移动插入位置后面的元素,但要找到要插入和删除的元素的位置还是得像顺序存储结构一样查找,但这个查找还有所不同,顺序存储结构支持我们使用二分查找之类的方法进行查找插入以及删除的位置,至于链式结构感觉似乎没法使用二分法类似的方法(充分利用有序这一条件进行查找)

链式存储结构适合于插入删除操作比较多的场合,比如飞机航班的乘客信息,至于学校的学生信息就不适合了,后者查询操作多于插入或者删除操作。

单链表数据结构的构建如下:

① LNode.h:单链表节点类模板,就是一个链表最基本的组成元素,是一个struct LNode,里面存储着 【希望节点拥有的数据部分】+【下一个节点的地址 LNode * next 】因为是单链表,只存储了下一个元素的地址。

② Alist.h :也就是我们定义的线性表所应该拥有的最基础的一组操作,里面有纯虚函数,所以是抽象基类,不能实例化。我们在不同类型的线性表里面继承这个类,然后重载其定义的基本操作。

③ LinkList.h :主人公,我们的单向链表类,他public继承了抽象基类Alist.h,且把一个算法MergeList函数模板 声明成了它的友元,因为这个函数要操作Linklist的私有成员,所以必须是友元才行。

下面是LinkList的成员介绍:

基本函数:   

【构造函数】:创建一个空的链表,注意,这里的空是有一个 Head 节点的,但是这个Head节点是隐含的,他不算是链表的成员,它的存在只是方便了我们对链表进行各种操作,这样构造函数创建了一个Head节点,数据成员部分没有具体的值,指针 next =NULL;毕竟只是创建一个空表。

【析构函数】:让整个链表分崩离析,注意里面每个节点都要在内存中释放掉 ,析构完成后表应该是空的,我们delete 每一个节点的地址,这个顺序应该从前往后进行,因为只能从前往后进行,先把头结点和后面的部分断开,在获得第一个元素的地址(即Head->next )后,就把Head->next=NULL,然后从前往后依次delete每一个元素,最后把Head delete掉,其实也可以在分开后就把Head释放掉。

查询函数: (大多为const的)

【是否为空:bool】

【链表长度:int 】

【获取第 i 个元素:bool】:通过一个引用参数返回找到的数据;bool 来表示操作成功与否。

【与更定元素满足eq关系的元素位序:int】:元素位序不是从0开始的,返回0表示操作失败。

【与更定元素满足eq关系的元素前驱:bool】:这个前驱就是data了,通过引用参数返回,bool表示操作成功与否。

【与更定元素满足eq关系的元素后继:bool】

处理函数:

【插入操作:bool 】插入到第i个位置,先判断合不合法(1  —>Length+1)可以插到最后,可以查到第一个位置。如果空表插到第一个位置,要记得其也是最后一个元素,所以地址部分要为NULL,如果不是最后一个位置就好说了,只需接到Head节点就可以了,如果是最后一个节点要记得NULL,如果在中间就不说了。

【删除操作:bool 】删除第 i个元素,先判断合法性,先把要删除的元素排除在序列之外,然后delete地址,如果删掉只有一个元素的链表记得要Head的next=NULL,总之要想到删完后尾元素要为NULL。

【遍历操作:void 】这个函数接受一个函数(函数的格式有要求),接受的函数处理每一个节点的要处理的数据,循环部分存在于遍历函数中,直到对链表中的每一个元素都进行了这种操作为止。

---------------------------------------------------------------------------------------------------------------------------------

归并函数:归并之后有一个变成了空的,这就要把一个链表元素有规则的插入进另一个链表里面,归并完后有一个为空可以通过清空操作来完成,我的做法是并不是真的每一个元素都插入,在la到了NULL之后就把lb的剩下部分都直接连过来了,这样最后要求lb应该是空的,我通过clearlist清空操作来完成,结果由于lb的末尾没有变,造成了内存读写错误。算是指针越界。

---------------------------------------------------------------------------------------------------------------------------------

二基础,六查询,三操作!

----------------------------------------------------------------------------------------------------------------------------------

对const函数有了新的理解,见另一篇关于const成员函数的介绍。

时间: 2024-10-26 02:40:04

线性表—链式存储结构的相关文章

(源代码见大话数据结构)线性表—链式存储结构->单链表的删除ListDelet(*L,i,*e)

Status ListDelet(LinkList *L,int i,ElemType *e) { int j=1; LinkList p,s; p=*L; while(p&&j<i) { p=p->next; j++; } if(!p||j>i) return ERROR; s=p->next; *e=s->data; p->next=s->next; free(s); return OK; } 个人理解:建立一个新结点可以作为(i-1)个结点的

线性表—链式存储结构—单链表的创建CreasteListHead(*L,int n)-&gt;头插法

void CreasteListHead(LinkList *L,int n) { int i; LinkList p; srand(time(0)); *L=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL;//优先级->大于* !!!!!!!!!!!!! for(i=0;i<n;i++) { p=(Node *)malloc(sizeof(Node)); p->data=rand()%100+1;//1~100之间的数包括一百所以+

数据结构之线性表——链式存储结构之单链表(php代码实现)

<?php /**  *  * 1. 类LNode用作创建单链表时,生成新的节点.  * 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表)  * 3. CreateListHead: 具有$num个数据元素的单链表的创建--头插法  * 4. CreateListTail: 具有$num个数据元素的单链表的创建--尾插法  * 5. DestroyList: 销毁单链表  * 6. ClearList:清空单链表  * 7. Li

第三章 线性表---链式存储结构(双向链表)

双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.结点都有两个指针域,一个指向直接后继,另一个指向直接前驱. 实例: 链表--双向链表 现在分析添加的情况已经有1号英雄和5号英雄,现在要添加3号英雄此时cur指向了1号英雄,hero指向3号英雄cur指向1号英雄,发现cur的下一个是5号英雄,大于要添加的3号英雄分析图过程 (1)让3号英雄指向5号英雄,即把这个①号线搭起来$hero->next=$cur->next; //$cur指向1

第三章 线性表---链式存储结构(循环链表)

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list) 结构模型

线性表-&gt;链式存储-&gt;循环链表

文字描述 循环链表是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环.由此,从表中任一结点出发均可找到表中其他结点. 示意图 算法分析 插入.删除.查找等同单链表. 代码实现 1 // 2 // Created by lady on 19-1-27. 3 // 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 8 //线性表的单向循环链表存储结构 9 typedef struct ElemType

数据结构-线性表-链式存储

由于顺序表的插入.删除操作需要移动大量的元素,影响了运行效率,由此引入了线性表的链式存储. 链式存储线性表时,不需要使用地址连续的存储单元,即它不要求逻辑上相邻的两个元素在物理位置上也相邻,它是通过“链”建立起数据元素之间的逻辑关系. 因此,对线性表的插入.删除不需要移动元素,而只需要修改指针. 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后继的指针.单链表结

数据结构之线性表-链式存储之单链表(一)

本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述 1.1 单链表简介 线性表的最大的缺点就是插入和删除操作需要移动大量的元素,这是它在内存中的连续存储结构造成的.为了弥补这2个缺点,就出现了链表,即线性表的链式存储. 链表是由一系列的几点组成,这些节点不必在内存中相连.这就意味着元素可以存在内存未被占用的任意位置.如图 这个存储可以想象成元素在内存中成三维空间存储,他们之间可没有像数组那样的下标标

数据结构之线性表-链式存储之静态链表(二)

本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述>.<大话数据结构> 1.1 静态链表简介 用数组描述的链表叫静态链表.官方是这么给的定义.另一种描述方法叫游标实现法.先不管这些无聊的定义.先按我个人理解描述,再来个Java版的实现比较符合我的风格.另有一些树上说早期存在其他的高级语言没有对象,引用或者指针这样的东西,但是需要对于快插快删等批量操作的这种链式存储,这时候静态链表就起了