线性表:由n个数据元素所组成的有限序列,n为线性表的长度。
特点:存在唯一一个被称为第一个数据的元素,同理也存在唯一一个被称为最后一个数据的元素(有限序列);
除最后一个(第一个)元素外都有直接后继(直接前驱);
线性表:L=(a1,a2,......,an);实质上相当于数组,长度为n的数组。
所以我们在定义线性表的时候,可以根据他的特点及我们日常工作所需要的参数来定义;
首先长为n的有限序列,我们就要开辟一块大小为n的空间,并且分配给线性表,其次,我们用线性表来存储什么类型的数据,再者线性表的使用率(已经用了多少,还剩下多少),最后就是其最大的容量;
所以我们常规定义线性表为:
typedef elemtype; 存储的数据类型
#define maxsize 10 线性表的长度(最大容量)
typedef struct
{
elemtype *data; 存储空间的基地址,后面使用malloc函数进行分配空间,并且为动态开辟空间, 后期可以更改线性表的容量,使用完需要手动释放
elemtype data[]; 静态的方式开辟空间,后期不能再对容量进行更改,用完由系统自动释放
int length; 当前表的使用率,已经存储的长度
int max; 表最大容量
}sqlist;
根据定义的内容,我们对线性表进行一些操作的时候,实质上只是在改变成员的数值罢了,我们在写代码的时候,注意表中的各个成员之间的联系,算法就不在是我们的难点。
优点:随机存取,可以直接取出 需要的元素。
缺点:插入和删除需要移动大量的数据元素;(因为一个数据元素对应一个数组下标,存储到x位置时,原本x所存储的数据就要変更,为了保存原有的数据,就会往后移动一个位置来存储,依次类推,后面都后退一个位置,同理删除也是如此)
顺序表,队列,栈,串,以及链表都是线性表的应用,只是每种应用都带有一定的限制。
顺序表:顾名思义,逻辑上相邻接的数据元素存储在物理地址上也相邻的存储单元中;
插入和删除受限制的有栈和队列;
栈:只能在同一端进行插入和删除。实质上就是线性表,定义也是一样,只是 栈只能在栈顶(可以理解为线性表的表尾)进行插入删除,所以定义一个栈顶指针(书中一般为top),其实 也能用我们线性表中的length+1来表示栈顶位置。
队列:只能一端插入,另一端删除。(两端都能进行插入和删除的双端队列等等)实质上也是线性表,跟栈一样插入删除操作受限,为了方便操作,我们定义了一个队头指针和一个队尾指针(栈同一端插入和删除,只定义一个),队尾进行插入操作,队头进行删除操作。
串:通常又称为字符串;S=“abcdefg”;S为串名,双引号中的字符为串值,字符个数为串长。
链表:(单)拥有多个节点,一个节点由一个数据域和一个指针域组成,指针域始终指向其直接后继。
(双),每个节点拥有一个数据域和两个指针域,(指针域)一个指向直接前驱,一个指向直接后继。
循环链表:(单)让表尾节点由指向NULL改为指向 第一个节点(带头节点就指向头结点)
(双)表尾节点指向NULL的指针改为指向第一个节点(带头节点就指向头结点),第一个节点(头结点) 指向NULL的指针改为指向表尾节点。
优点:插入删除不用移动大量数据元素;
缺点:查找元素只能从头开始 ,不能随机存取数据元素。
链栈,链队列 ,链串 ,只是把三种可以随机存储的线性表转变成了不能随机存取的链表类型,也可以理解成操作受限制的链表。定义和链表一样,只是为了操作方便加了一些不同的成员;