线性表——顺序表(知识及题型总结)

一、相关知识点

1.顺序表的特点:表中元素的逻辑顺序和物理顺序相同。
2.线性表的顺序存储结构是一种随机存取的存储结构。
3.线性表中的标号从1开始,对应数组从0开始
4.插入、删除、顺序查找的时间复杂度为O(n)

二、综合应用题

参考王道考研数据结构

1.对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,删除线性表中所有值为x的元素。
算法思想:用k记录顺序表中不等于x的元素的个数。扫描L,遇到不等于x的元素,data[k]=data[i],k++

void delete_x(List &L,ElementType x){
	int k=0;//记录值不等于x的元素的个数
	for(int i=0;i<L.length;i++){
		if(L.data[i]!=x){
			L.data[k]=L.data[i];
		}
	}
	L.length=k;
}

2.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值都不相同。
算法思想:初始时将第一个元素视为非重复的有序表。依次判断后面的元素是否与前面非重复有序表的最后一个元素相同。若相同,继续向后判断;若不同,则插入前面的非重复有序表的最后。直到判断到表尾。

bool deleteSame(List &L){
	if(L.Length==0)
		return false;
	int i,j; //i存储最后一个不相同的元素,j为工作指针
	for(i=0,j=1;j<L.Length;j++){
		if(L.data[i]!=L.data[j]){ //找到下一个不相同的
			i++;
			L.data[i]=L.data[j]; //更新i
		}
	}
	L.Length=i+1;
	return true;
}

3.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
算法思想:按顺序不断取两个顺序表表头较小的节点存入新的顺序表。看哪个表有剩余,将剩下部分添加到后面。

bool Merge(List &l1,List &L2,List &L){
	if(L1.Length+L2.Length>L.Length)
		return false;
	int i=0,j=0,k=0;
	while(i<L1.Length&&j<L2.Length){
		if(L1.data[i]<L2.data[j])
			L.data[k++]=L1.data[i++];
		else
			L.data[k++]=L2.data[j++];
	}
	while(i<L1.Length)
		L.data[k++]=L1.data[i++];
	while(j<L2.Length)
		L.data[k++]=L2.data[j++];
	L.Length=k;
	return true;
}

4.已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3,…,am)和(b1,b2,b3,…,bn)。试编写一个函数,将数组中的两个顺序表的位置互换。
算法思想:利用空间复杂度为O(1)的逆置算法
先将数组中的全部元素(a1,a2,…,am,b1,b2,…,bn)原地逆置为(bn,bn-1,…,b1,am,…a1),再对前n个元素和后m个元素分别使用逆置算法,即可得到(b1,b2,…,bn,a1,a2,…,am)

void reverse(ElementType data[],int left,int right,int arraySize){
	if(left>=right||right>=arraySize)
		return false;
	int mid=(left+right)/2;
	for(int i=0;i<=mid-left;i++){
		ElementType temp=data[left+i];
		data[left+i]=data[right-i];
		data[right-i]=temp;
	}
}
void exchange(ElementType data[],int left,int right,int arraySize){
	reverse(data,0,m+n-1,arraySize);
	reverse(data,0,n-1,arraySize);
	reverse(data,n,m+n-1,araySize);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值