1.定义:零个或多个数据元素的有限序列,打比方,幼儿园小朋友放学回家,他们只记得前一个和后一个小朋友是谁。
除第一个元素a1之外,每一个元素有且仅有一个直接前驱元素,除最后一个元素a,每个元素有且只有一个直接后继者。
2.顺序存储定义:通过占位的形式,把一定内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地上。C语言中的一位数组可以实现顺序存储结构。想想傻子图书馆占座的故事。
数组长度是存放线性表的存储空间的长度,是不变的。线性表的长度是线性表中数据元素的个数,是可以变化的。
顺序存储的插入和删除:插入或者删除一个元素,后面所有的元素都要改变。
存/读数据的时候不管什么位子,(它的下标就是位子)时间复杂度都是o(1),而插入和删除时,时间复杂度就是o(n)。
3.线性表链式存储:除了要存数据元素信息外,还要存储它后继元素的存储地址。最后一个结点指针为空。
结点由存放数据元素的数据域和存放后继结点地址的指针域组成,数据域可以用p->data表示,指针域可以用p->next来表示
单链表的读取:声明一个指针P指向链表第一个结点,初始化j=1,当j<i时,遍历链表,让p的指针向后移动,不断指向下一结点。
单链表插入:s->next=p->next;p->next=s;
单链表删除:实际上就是p->next=p->next->next,用q来代替p->next,就是q=p->next;p->next=q->next
插入和删除都由两部分组成:第一部分就是遍历查找第i个结点,第二部分就是插入和删除结点,遍历结点的时候,因为不知道这个结点在哪里,平均下来(n+2)/2,所以时间复杂度是o(n),而后面的插入和删除时间复杂度为o(1)
4.1创建:顺序存储结构的创建就是一个数组的初始化。
而单链表的创建所占用的空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求及时生成。
两种创建方法,一种是先到先排,一种是先到后排。
4.2单链表的整表删除:也是一个一个的删除。
5.单链表结构和顺序存储结构的优缺点对比:
5.1存储分配方式:顺序存储结构用连续的存储单元依次存储线性表中的数据元素,而单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。
5.2时间性能:查找:顺序存储结构o(1),单链表o(n)。插入和删除:顺序存储结构需要平均移动表长一半的元素,时间为o(n)。单链表在遍历出某位置之后,插入和删除时间仅为o(1)。
5.3空间性能:顺序存储结构需要分配存储空间,分大浪费分小溢出,而单链表不需要分配存储空间,有就可以分配,元素个数不受限制。
所以游戏账号注册用顺序列表,因为只是读取,装备技能用单链表,因为要经常插入删除。知道固定长度大小用顺序比较好。
6.静态链表:用数组描述的链表叫做静态链表,数组的元素由两个数据域组成,data和cur。数据域和游标。有点类似单链表,不过这个是静态那个是动态。
插入的时候,如果是动态链表中,结点的申请和释放分别可以借用malloc()和free()。但是静态链表中,操作的是数组。
静态链表里面有奇怪的for循环
for (l-1:l<i-1;l++) k=l[k].cur
因为静态链表的下标和游标是和单链表有很大的差别的。具体看P75。
优点:在插入和删除操作的时候,不需要移动元素。
7.循环链表:将单链表中终端结点的指针端由空指针改成指向头结点,使整个单链表形成一个环,头尾相接。
用尾指针代rear替头指针,因为这样不光是查找终端结点是o(1),查找开始结点,rear->next->next,其时间复杂度也是o(1)。合并两个循环链表也比较简单,P80
8.双向链表:有两个指针域,一个指向后继,一个指向前驱。插入和删除复杂了点,用空间换时间。
9.总结:
线性表:1,顺序存储结构。2,链式存储结构。2.1单链表。2.2静态链表。2.3循环链表。2.4双向链表。
线性表是零个或多个具有相同类型的数据元素的有限序列。
顺序存储是用一段地址连续的存储单元依次存储线性表的数据元素。通常用数组来实现
由于顺序存储的插入和删除不方便。引出链式存储结构。它不受固定的存储空间限制,可以比较快捷的插入和删除
它有三种不同的形态,就是单链表,循环链表和双向链表
over
(数据结构开始的第一天,感觉并不是很难的样子,静下心来肯定能学进去)