数据结构——基础6

线性表


基本操作——创建、判空、增删改查、求表长、输出

顺序表
线性表的顺序存储又称为顺序表,逻辑顺序与物理顺序相同
静态分配空间

动态分配空间

注意:动态分配不是链式存储,同样属于顺序存储,只是分配的空间大小可以在运行时动态决定。
插入


删除

查找

例题1:给定一个含n( n>=1) 个整数的数组, 请设计一个在时间上尽可能高效的算法, 找出数组中未出现的最小正整数。 例如, 数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4.要求:
1) 给出算法的基本设计思想。
2) 根据设计思想, 采用C或C++语言描述算法, 关键之处给出注释。
3) 说明你所设计算法的时间复杂度和空间复杂度。
答:1)n=4时,最小正整数有哪些可能?1、2、3、4
n=6时,最小正整数有哪些可能?1、2、3、4、5、6
算法思想:先遍历数组a,找出1~n范围内的数字,将b数组对应下标位标记,遍历b数组,找到第一个未标记位返回,此位就是未出现的最小值。
2)//查找a数组长度为n
int find(int a[], int n){
int i,*b;//动态分配
b = (int *)malloc(sizeof(int));//为标记数组申请空间
memset(b,0,sizeof(int)*n);//赋初值为0
for(i = 0; i < n; i++){//找出a数组中值介于1~n之间的元素,将标记数组b置1
if(a[i] >= 1 && a[i] <= n) b[a[i] - 1] = 1;
}
for(i = 0; i < n; i++){//遍历b数组,找出第一个0,即为最小未出现值
if(b[i] == 0) break;
}
free(b);
return i+1;
}
3)时间复杂度O(n),空间复杂度O(n)
例题2:定义三元组( a, b, c) ( a、 b、 c均为正数) 的距离D=|a-b| + |b-c| + |c-a|。 给定3个非空整数集合S1、 S2、 S3, 按升序分别存储在3个数组中。 请设计一个尽可能高效的算法, 计算并输出所有可能的三元组( a, b, c) ( ܽ ∈ ܵ1, ܾ ∈ ܵ2, ܿ ∈ ܵ3) 中的最小距离。 例如S1={-1, 0, 9}, S2={-25,-10,10,11}, S3={2,9,17,30,41}, 则最小距离为2, 相应的三元组为( 9,10,9) 。 要求:
1) 给出算法的基本设计思想。
2) 根据设计思想, 采用C或C++语言描述算法, 关键之处给出注释。
3) 说明你所设计算法的时间复杂度和空间复杂度。
答:1)算法思想:将集合分别放入a、b、c当中,对应下标i=j=k=0,三个数组均未遍历完成时进入循环,计算ijk下标值的距离,与最小距离判断并进行更新;在a、b、c数组中找出最小值将其下标加1,继续循环遍历直到有一个数组遍历完成时退出循环。
2)
//求绝对值
int abs_(int a){
if(a>0) return -a;
return a;
}
//判断a是否是三元素中的最小值
bool min_(int a, int b, int c){
if(a <= b && a<= c) return true;
return false;
}
int findMin(int *s1,int l, int *s2, int m, int *s3, int n){
int i = 0, j = 0, k = 0, min = INI_MAX, D;//ijk下标从0开始,min存储当前最短距离 D代表三元组计算出距离
while(i < l && j < m && k < n && min >= 0){
D = abs_(s1[i] - s2[j]) + abs_(s2[j] - s3[k]) + abs_(s3[k] - s1[i]);//计算三元距离
if(D < min) min = 0;//与最小值min对比并更新
if(min(s1[i], s2[j], s3[k])) i++;//找出三元组中最小值并将其下标后移
else if(min(s2[j], s1[i], s3[k])) j++;
else k++;
}
return min;
}
3)时间复杂度n = l+m+n; O(n) 空间复杂度 O(1)
链表
线性表的 链式 存储又称为单链表, 通过 随机的 的存储单元来存储数据元素
元素 离散地 分布在存储空间汇总。
插入




遍历

查找


删除


双链表
双链表的 查找 操作与单链表的 相同 ; 插入和删除 操作的实现上与单链表 不同 。


插入


循环链表



