線性表的順序存儲類型爲:
typedef struct
{
int data[MaxSize];
int length;
}SqList;
1 . 從順序表中刪除具有最小值的元素(假設唯一)並由函數返回被刪除元素的值,空出的位置由最後一個元素填補,若順序表爲空則顯示出錯信息並退出。
- 算法思想:記錄最小元素所在的位置,搜索結束後將最後一個元素賦予最小元素所在的位置。
bool Del_Min(SqList &L,int &value)
{
if (L.length == 0)
return false;
value = L.data[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];
L.length--;
return true;
}
2 . 設計一個高效的算法,將順序表中所有元素逆置,要求算法的空間複雜度爲O(1)。
- 算法思想:用循環將第i個元素和第length-1-i個元素的值交換。
void Reverse(SqList &L)
{
int temp;
for (int i = 0; i <= L.length/2; i++)
{
temp = L.data[i];
L.data[i] = L.data[L.length-1-i];
L.data[L.length - 1 - i] = temp;
}
}
開始犯了一個很嚴重的錯誤:L.data={1,2,3,4,5,6,7,8,9};
error C2440: “=”: 無法從“initializer-list”轉換爲“int”
百度了一下:只有定義時纔可以用花括號擴起來的列表進行初始化。
定義變量int L[10] = {1,2,3,4,5,6,7,8,9};
實際上是先分配10個內存,同時將內存初始化。而定義SqList L;
實際上是先分配sizof(SqList)
個內存,然後調用默認構造函數初始化LL.data={1,2,3,4,5,6,7,8,9};
編譯通不過是因爲L已經初始化了,不能再初始化一次了。
int main()
{
SqList A;
A.length = 10;
for (int i = 0; i<A.length; i++)
A.data[i] = i;
Reverse(A);
for (int i = 0; i < A.length; i++)
{
cout << A.data[i]<<" ";
}
return 0;
}
3 . 長度爲n的順序表L。編寫一個時間複雜度爲O(n),空間複雜度爲O(1)的算法該算法刪除線性表中所有值爲x的元素。
- 算法思想:用count記錄表A中等於x的元素個數,將不等於x的向前移動count個位置。
void Del_X(SqList &L, int x)
{
int count = 0, i = 0;
while (i < L.length)
{
if (L.data[i] == x)
{
count++;
}
else
{
L.data[i - count] = L.data[i];
}
i++;
}
L.length -= count;
}
4 .從有序順序表中刪除其值在給定值s與t之間(要求s小於t)的所有元素,如果s或t不合理或者順序表爲空則顯示出錯誤信息並退出運行。
- 算法思想:只需要在上一題的思路上稍加改進就可以了,因爲是有序表所以可以直接找到與s值相同的第一個元素和與t相同的最後一個元素,直接刪除一整塊。
bool Del_S_T(SqList &L, int x, int t)
{
int pos1, pos2;
if (x > t)
return false;
int i = 0;
while (i < L.length)
{
if (L.data[i] >= x&&L.data[i] < t)
{
pos1 = i;
break;
}
i++;
}
while (i < L.length)
{
if (L.data[i + 1]>t)
{
pos2 = i + 1;
break;
}
i++;
}
while (pos2 < L.length)
{
L.data[pos1++] = L.data[pos2++];
}
L.length = L.length - pos2 + pos1;
return true;
}
5 .從順序表中刪除所有其值在給定值s與t之間的元素(包含s與t,要求s小於t)的所有元素,如果s與t不合理或者順序表爲空則顯示錯誤信息並退出。
- 算法思想:跟上一題思路一樣,上一題同樣也可以用這個思路來做。
bool Del_S_T_Du(SqList &L, int x, int t)
{
if (x > t)
return false;
int count = 0, i = 0;
while (i < L.length)
{
if (L.data[i] >= x&&L.data[i] <= t)
{
count++;
}
else
{
L.data[i - count] = L.data[i];
}
i++;
}
L.length -= count;
return true;
}
完整的代碼貼在:https://github.com/shuailishasls/git_share/tree/master/linear_list_question_1-5