从顺序表中删除具有最小值的元素(假设唯一),并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示错误信息并退出
bool Del_Min(SqList &L,int &value){
//删除顺序表L中最小元素的结点,并通过引用型参数value返回其值
//删除成功返回true
if(L.length==0) return false;
value=L.data[0];
int pos=o;//下标
for(int i=1;i<L.length;i++)
if(L.data[i]<value){
value=L.data[i];
pos=i;}
L.data[pos]=L.data[L.Length-1];
L.length--;
return true;
}
设计一个高效的算法,将顺序表的所有元素逆置,要求复杂度O(1)
void Reverse(Sqlist %L){
int temp;
for(i=0;i<L.length/2;i++){
temp=L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]=temp;
}
}
长度为n的顺序表L,编写一个时间复杂度O(n),空间复杂度O(1),删除线性表中所有值为x的数据元素
void del_x_l(Sqlist &L,int x){
int k=0; //记录不等于x的元素个数
for(int i=0;i<L.length;i++)
if(L.data[i]!=x){
L.data[k]=L.data[i];//留下
k++;
}
L.length=l;
}
从有序顺序表中删除其值为定值s与t之间(包含st,要求是s<t)的所有元素,如果s t不合理或顺序表为空则显示错误信息并返回
bool Del_s_t(Sqlist &L,int s,int t){
int i,j;
if(s>=t||L.length==0) return false;
for(i=0,i<L.length&&L.data[i]<s;i++) //寻找值>=s的第一个元素
if(i>=L.length) return false;
for(j=i;j<L.length&&L.data[j]<=t;j++) //寻找值>t的第一个元素
for(;j<L.length;i++,j++)
L.data[i]=L.data[j];
L.length=i+1;
return true;
}
从顺序表中删除其值为定值s与t之间(包含st,要求是s<t)的所有元素即值为st的也要删除,如果s t不合理或顺序表为空则显示错误信息并返回
/**算法思想:从前向后扫描顺序表,用k记录元素值在s-t之间的元素的个数(初始k=0)
对于当前扫描的元素,若其值不在st之间,则前移k个位置,否则执行k++**/
bool del_s_t1(Sqlist &L,int s,int t){
int k,i=0;
if(L.length==0||s>=t) return false;
for(i=0;i<L.length;i++){
if(L.data[i]>=s&&L.data[i]<=t)
k++;
else
L.data[i-k]=L.data[i];
}
L.length-=k;
return true;
}
从有序数组中删除所有其值重复的元素,使表中所有元素的值均不同
bool delete_same(Sqlist &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]) //查找下一个与上个元素值不同的元素
L.data[++i]=L.data[j]; //前移
L.length=i+1;
return true;
}
将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表
bool Merge(Sqlist A,Sqlist B,Sqlist &c){
if(A.length+B.length>C.maxsize) return false;
int i=o,j=o,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+1;
return true;
}