线性表课后题王道

本文介绍了几种针对顺序表的操作算法,包括空间复杂度为O(1)的顺序表元素逆置,时间复杂度为O(n)删除指定元素,删除有序表中指定范围元素,消除有序表中重复元素以及两个有序表的合并。这些基础算法对于理解数据结构和算法至关重要。
摘要由CSDN通过智能技术生成

1.设计一个算法将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)

void Reverse(SqList &L){
	Elemtype temp;
	for(int i=0;i<L.length/2;i++){
		temp=L.data[i];
		L.data[i]=L.data[L.length-r-1];
		L.data[L.length-r-1]=temp;
	}
}

2.对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有元素为x的元素

//解法1:统计所有元素不等于k的元素,然后将元素向前移动k个单位
void del_x(SqList &L,Elemtype x){
	int k=0,i;
	for(int i=0;i<L.Length;i++){
		if(L.data[i]!=x){
			L.data[k]=L.data[i];
			k++;
		}
	}
	L.length=x;
}
//解法二:统计所有元素等于k的元素,然后将不等于k的元素向前移动k个单位
void del_x1(SqList &L,Elemtype x){
	int k=0,i=0;
	while(i<L.length){
		if(L.data[i]==x){
			k++;
		}else{
			L.data[i-k]=L.data[i];
		}
		i++}
	L.length=L.length-k;
}

3.删除有序顺序表L中值在s与t之间的所有元素

bool del(SqList &L,Elemtype s,Elemtype t){
	int i,j;
	if(s>=t||L.length==0){
		return false;
	}
	for(i=0;i<L.length&&L.data[i]<s;i++);
	if(i>=L.Length) return false;
	for(j=i;L.data[j]<=t&&j<L.length;j++);
	for(;j<L.length;j++,i++){
		L.data[i]=L.data[j];
	}
	L.length=i+1;
	return true;
}

4.从有序表中删除所有元素相同的元素,使之所有元素均不相同

bool Delete_Same(SeqList&L){ 
	if(L.length==0) return false; 
	int i j;
	for(i=0,j=1;j<L.length;j++) 
		if(L.data[i]!=L.data[j]){
			L.data[++i]=L.data[j]; 
		} 																			
		L.length=i+1 
		return true;

5.两个有序顺序表合并成新的有序顺序表

bool Merge(SeqList A,SeqList B,SeqList &C){ 
	if(A.length+B.length>C.maxSize) return false; 
	int i=0,j=0,k=0;
	while(i<A.length&&j<B.length){ 
	if(A.data[i]<=B.data[j]) 
		C.data[k++]=A.data[i++]; 
	else 
		C.data[k++]=B.data[j++];
	while(i<A.length)
		C.data[k++]=A.data[i++]; 
	while(j<B.length) 
		C.data[k++]=B.data[j++];
	C.length=k;
	return true;

6.已知在一维数组 A[m+n]中依次存放两个线性表(a1, a2,a3…am)和(b1, b2,b3…bn)编写— 个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3,…, bn,)放在(a1,a2,a3,…,am)的前面。

typedef int DataType;
void Reverse(DataType A[],int left,int right,int arraySize){
	if(left>=right||right>=arraySize) return;
	int mid=(left+right)/2; 
	for(int i=0;i<=mid-left;i++){ 
		DataType temp=A[left+i]; 
		A[left+i]=A[right-i]; 
		A[right-i]=temp;
	} 
} 
void Exchange(DataType A[],int m,int n,int arraySize){ 
	Reverse(A,0,m+n-1,arraySize);
	Reverse(A,0,n-1,arraySize);
	Reverse(A,n,m+n-1,arraySize);
}

基础算法需要掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值