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);
}
基础算法需要掌握