呼,老师公布这学期要线上考试了…
50道客观题,鉴于下周就要考试,我的博客中的C++代码实现部分可能有一些会被砍去,后续会继续补的
争取一天能过一章
冲了!奥利给
有关线性表的定义
首先看线性结构的特点
- 存在惟一一个被称为“第一个”的数据元素
- 存在惟一一个被称为“最后一个”的数据元素
- 除第一个数据元素外,集合中每个数据元素均只有一个直接前驱
- 除最后一个数据元素外,集合中每个数据元素均只有一个后继
嗯,有离散数学那味了
线性表的定义及特点
线性表是由 n (n>0)个数据元素组成的有限序列
记作(a1,a2,…,an)
特点
1.同一线性表中元素具有相同的特性
2.相邻数据元素之间存在着序偶关系
3. 除第一个数据元素外,集合中每个数据元素均只有一个直接前驱
4. 除最后一个数据元素外,集合中每个数据元素均只有一个后继
和之前线性结构重复了
在稍复杂的线性表中,一个数据元素可由多个数据项组成
这时,常把数据元素称为记录, 含有大量记录的线性表又称文件
线性表的顺序表示——顺序表
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素
存储结构:数组
存储特点:顺序存储,随机存取
LOC(ai+1)=LOC( a1)+(i-1) X L ( L 是每个数据元素占用的存储单元数)
顺序表的一些操作
定义
const int List_Init_size=100;
const int List_increment=10;
typedef int elemtype;
typedef struct
{
elemtype* mylist; //线性表基地址
int length; //线性表长
int list_size;//当前分配的存储空间
}Sqlist;
初始化
空着先溜了,回来补
插入和删除
我又溜了,有时间补
从上面的算法可见假装看见
线性表中进行插入和删除操作时,其时间耗费在移动元素上
移动元素的个数与插入位置有关
Ep插入=【1/(n+1)】(n+0)*(n+1)/2=n/2
Ep删除=1/n X (n-1)*n/2 =(n-1)/2
所以插入和删除的时间复杂度都为O(n)
而求表长,和取第i个元素的时间复杂度为O(1)
而将所有在Lb而不再La中的元素插入到La的Union操作的基础操作为对两个元素进行比较
其时间复杂度为O(La.lenght X Lb.length)
而对顺序表合并的Merge操作(合并后仍为有序)
其时间复杂度为O(La.lenght + Lb.length)
线性表的链式表示——链表
链表虽然能解决线性表插入删除时大量移动的问题,却失去了随机存储的能力
线性链表(单链表)
定义:用一组地址任意的存储单元存放线性表中的数据元素
每个数据元素除了本身信息之外,还需要存储指向其直接后继的信息
这两部分信息组成数据元素的存储映像称为 结点
包括了数据域和指针域
整个链表的存储必须从头指针开始 所以存储方式为 顺序存取
取元素操作
int Get_elem(Link_List L,int i, Elemtype &e)
{
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
{
return -1;
}
e=p->data;
return 1;
}
可见该操作时间复杂度为 O(n)
插入删除操作
在插入删除之前,必须先创造出一个新的结点,并分配空间
假如现在abc关系如下图22,77,89所示
则插入操作
newnode->next=a->next;
a->next=newnode;
删除操作
a->next=a->next->next;
delete newnode;
可见单链表是一种动态结构,整个存储空间可被多个单链表共同使用
每个链表使用的空间在需要时随时生成
静态链表
即使用一维数组的形式来描述线性链表
静态链表中的数据元素需要包括一个指向下一个元素位置的cur位
这样的结构需要提前分配空间
定义
const int Max_size=100;
typedef int Data_type;
typedef struct
{
Data_type data;
int link;
}Node;
typedef struct
{
Node nodes[Max_size];
int newptr; //可分配新空间的首地址
}Static_link_list;
操作
先溜了
循环链表
特点:
循环链表中最后一个结点的指针域指向头结点。
只要知道表中任何一个结点的地址,就可搜寻所有结点的地址
循环链表的操作和线性表操作基本一致
但while循环的终止条件为p->next != head
双向链表
双向链表的表结点有两个指针域
prior指向直接前驱,next指向直接后继
操作
插入
假设在 * p后插入newnode 结点
newnode->prior=p;
newnode->next=p->next;
p->next=newnode;
newnode->next->prior=newnode;
删除操作
删除newnode结点
newnode->prior->next=newnode->next;
newnode->next->prior=newnode->prior;
顺序表和链表的比较
基于空间的比较
1. 存储分配的方式
- 顺序表的存储空间是静态分配的。
- 链表的存储空间是动态分配的。
2. 存储密度
存储密度=结点数据所占空间 / 结点结构所占的存储总量 - 顺序表的存储密度==1
- 链表的存储密度 < 1
基于时间的比较
1. 存取方式
- 顺序表为随机存取,时间复杂度为 O(1);
- 链表为顺序存取,时间复杂度为 O(n);
2. 插入 / 删除操作
- 顺序表执行时需要移动近一半的元素,时间复杂度为 O(n)
- 链表执行时只需要修改指针,时间复杂度为O(1);