持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
1.删除最小值
题目
从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
代码
bool Delet_Min(SqList &L, ElemType &e){
if(L.length == 0){
return false;
}
int minIdx = 0;
ElemType minElem = L.data[0];
for(int i=1; i < L.length; i++){
if(L.data[i] < minElem){
minElem = L.data[i];
minIdx = i;
}
}
e = minElem;
L.data[i] = L.data[L.length-1];
L.length--;
return true;
}
2.逆置
题目
设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)
代码
bool ListReverse(SqList &L){
for(int i=0; i < L.length / 2; i++){
ElemType tmp = L.data[i];
L.data[i] = L.data[L.length-1-i];
L.data[L.length-1-i] = tmp;
}
return true;
}
3.删除值为x的元素
题目
对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
代码
void Delet_X(SqList &L, ElemType x){
int pos=0;
int length=0;
for(int i=0; i < L.length; i++){
if(L.data[i] != x){
L.data[pos++] = L.data[i];
length++;
}
}
L.length = length;
}
4.有序表范围删除
题目
从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
代码
bool Delet_S2t(SqList &L, Elemtype s, ElemType t){
if(s >= t || L.length == 0){
return false;
}
int pos=0;
while(pos < L.length && L.data[pos] < s){
pos++;
}
if(pos >= L.length){
return false;
}
int pos1 = pos;
while(pos1 < L.length && L.data[pos1] <= t){
pos1++;
}
int length = pos;
for(int i=pos1; i < L.length && pos < pos1; i++){
L.data[pos++] = L.data[i];
length++;
}
L.length = length;
return true;
}
5.顺序表范围删除
题目
从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
代码
void Delet_S2t(SqList &L, Elemtype s, ElemType t){
int pos=0;
int length=0;
for(int i=0; i < L.length; i++){
if(L.data[i] < s || L.data[i] > t){
L.data[pos++] = L.data[i];
length++;
}
}
L.length = length;
}