一、线性表概念
1、定义
线性表是由n(n>=0)个类型相同的数据元素组成的有限序列,n=0表示为空表,线性表从第1到第n+1个位置,共有n个元素,其中0位置不用。数据元素之间为线性关系,每个数据元素最多有一个直接前驱和直接后继。
2、特点
(1.)同一性:线性表由同类数据元素构成;
(2.)有穷性:有限个数据元素;
(3.)序偶性:线性表中相邻元素之间存在序偶关系<ai,ai+1>(离散数学中告诉我们序偶关系特点:成对、有序)
二、线性表的顺序存储
定义
用一组地址连续的存储单元依次存储线性表中的各个元素,则逻辑结构中相邻位置的数据元素的物理存储单元也是相邻的。
采用顺序存储结构的线性表通常称为顺序表。
若线性表中每个元素占k个单位,第一个元素的地址为loc(a1),则第i个元素的地址为:loc(a1)+(i-1)*k;由此可见:只要已知线性表的第一个元素位置,那么线性表中任意位置元素都可以随机存取(顺序表是一种随机存储结构)
其C语言定义: 线性表初始化:
三、线性表的基本运算(查找、插入、删除)
1、查找操作
(1.)按序号查找GetData(L,i)
查找线性表L中的第i个数据元素,其结果是L.elem[i];
(2.)按内容查找Locate(L,x)
查找线性表中与数据x相同的数据元素,其结果是:若找到与x相等的元素,返回该元素在表中的序号;若找不到,返回false或其他无意义的序号,如:-1;
时间复杂度为O(n)
2、插入操作
在线性表的第i(1<=i<=n+1)个位置,插入一个新元素e,使长度为n的线性表长度变为n+1。
操作思路:
①把an到ai之间的所有元素按照从后向前的顺序依次向后挪动一个位置,为新元素让出位置;
②将元素x放入空出的第i个位置;
③修改表长。
时间复杂度O(n)
3、删除操作
将表中第i(1<=i<=n)个元素删去,使长度为n的线性表变成长度为n-1的线性表
操作思路:
①把a(i+1)到an之间的元素依次向前挪动;
②表长减一
时间复杂度为O(n)
四、典型例题(两顺序表合并)
有两个顺序表LA和LB,其元素均为非递减有序数列,编写一个算法,将他们合并成一个顺序表LC,要求LC也是非递减有序排列。
算法思路:
设LC为一个空表,要求LC也是非递减有序排列,设两个指针i,j分别指向表LA和LB的元素LA.elem[i]、LB.elem[j],若LA.elem[i] <=L.elem[j],即:A中的元素小于B中的元素,所以要先将LA.elem[i]插入到LC,直到其中一个表被扫描完毕,然后将未扫描完的表中剩余的元素放到LC之后。
在敲上面代码的过程中我对打?那一行有了疑问“为什么是[k++],[j++]?”
本人表示很抱歉。。。。C语言学艺不精啊,这就相当于++i与i++的区别。