1.1.從順序表中刪除具有最小值的元素(假設(shè)唯一)并由函數(shù)返回被刪除的元素的值,空出的位置由最后一個元素填補(bǔ),若順序表為空則顯示出錯信息并退出運(yùn)行 。 bool Del_Min(SqList &L, ElemType &value) {
if (L.length == NULL)
return false;
value = L.data[0]; //假設(shè)0號元素的值最小
int pos = 0;
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]; //空出的位置由最后一個元素填補(bǔ)
L.length--;
return true;
}
1.2.設(shè)計一個高效的算法,將順序表的所有元素逆置,要求算法的空間復(fù)雜度為O(1) 算法思想:掃描順序表L的前半部分元素,對于元素L.data[i],將其余后半部分對應(yīng)元素L.data[L.length-i-1]進(jìn)行交換。 void Reverse(SqList &L) {
ElemType temp;
for (int i = 0;i < L.length;i ) {
temp = L.data[i];
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = temp;
}
}
1.3長度為n的順序表L,編寫一個時間復(fù)雜度為O(n),空間復(fù)雜度為O(1)的算法,該算法刪除線性表中所有值為x的數(shù)據(jù)元素 //解法一:用k標(biāo)記不等于x的元素,將不等于x的元素向前放到k的位置上,修改L的長度
void del_x_1(SqList &L, ElemType x) {
int k = 0;
for (int i = 0;i < L.length;i ) {
if (L.data[i] != x) {
L.data[k] = L.data[i];
k ; //用k記錄不等于x的元素的個數(shù)
}
}
L.length = k; //順序表長度等于k
}
//解法二:用k記錄順序表中等于x的元素個數(shù),邊掃描邊統(tǒng)計k,并將不等于k的元素向前移動k個位置。
void del_x_2(SqList &L, ElemType x) {
int k = 0;
for (int i = 0;i < L.length;i ) {
if (L.data[i] == x)
k ;
else
L.data[i - k] = L.data[i]; //當(dāng)前元素前移k個位置
i ;
}
L.length = L.length - k; //順序表長度遞減
}
1.4. 從有序順序表中刪除其值在給定值s與t之間(要求s<t)的所有元素,如果s或t不合理或者順序表為空則顯示出錯信息并退出運(yùn)行 //先找出>=s的第一個元素,再找出>t的第一個元素,將后面元素前移
bool del_s_t2(SqList &L, ElemType s, ElemType t) {
int i, j;
if (i > L.length || s >= t)
return false;
for (i = 0; i < L.length&&L.data[i] < s;i ); //尋找>=s的第一個元素
if (i >= L.length) return false; //所有元素值都小于s則返回
for (j = i;j <= L.length&&L.data[j] <= t;j ); //尋找>t的第一個元素
for (;j < L.length;i ,j ) //前移,填補(bǔ)被刪除元素位置
L.data[i] = L.data[j];
L.length = i 1;
return true;
} 來源:https://www./content-4-393351.html
|