寫在前面:
因爲書上不能寫代碼題,所以開個博客記錄一下寫代碼題的過程。改正部分會用標註。
所以這只是我個人的一個做題記錄,並非標準答案,歡迎交流。
2.2.3綜合應用題p19
1.從順序表中刪除具有最小值的元素(假設唯一)並由函數返回被刪元素的值。空出的位置由最後一個元素填補,若順序表爲空則顯示出錯信息並退出運行。
算法思想:查找+替換
bool Del_min(SeqList &L, int &e)
{
int t = 100000;
int k = 0;
for (int i = 0; i < L.length; i++)
{
if (L.data[i] < t) {
t = L.data[i];
k = i + 1;
}
}
if (k<1 || k>L.length)
return false;
e = L.data[k - 1];
L.data[k - 1] = L.data[L.length - 1];
L.length--;//這裏之前漏了
return true;
}
2.設計一個高效算法,將順序表L的所有元素逆置,要求算法的空間複雜度爲O(1)。
算法思想:把值取出來然後倒着賦值。
void SL_inverse(SeqList &L)
{
int a[1000];
int j = 0;
for (int i = L.length - 1; i >= 0; i--)
{
a[j] = L.data[i];
j++;
}
for (int i = 0; i < L.length; i++)
{
L.data[i] = a[j - 1];
j--;
}
}
參考答案:
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-i-1];
L.data[L.length-i-1]=temp;
}
}
3.對長度爲n的順序表L,編寫一個時間複雜度爲O(n)、空間複雜度爲O(1)的算法,該算法刪除線性表中所有值爲x的數據元素。
算法思想:按值查找、刪除
bool DeleteX(SeqList &L, Elemtype &x)
{
int k[MaxSize];
int j = 0;
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == x) {
k[j] = i;
j++;
}
}
int g = j - 1;
if (j==0)
return false;
for (j = 0; j < g; j++) {
x = L.data[k[j]];
for (int p = 0; p < L.length; p++)
{
L.data[p - 1] = L.data[p];
}
L.length--;
}
return true;
}
參考答案:這個答案太優秀了
void del_x(SeqList &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++;
}
L.length = k;
}
4.從有序順序表中刪除其值在給定值s與t之間(要求s<t)的所有元素,如果s或t不合理或順序表爲空,則顯示出錯信息並退出運行。
算法思想:刪除
bool del_s_t(SeqList &L, int s, int t, int &e)
{
if (L.length<1 || s>t)return false;//應該改爲s>=t
int k = 0;
for (int i = 0; i < L.length; i++)
{
if (L.data[i]<=s) {
L.data[k] = L.data[i];
k++;
}
else if (L.data[i] >= t) {
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
return true;
}
emmm我感覺我這題比答案ok一些。
5.從順序表中刪除其值在給定值s與t之間(包含s和t,要求s<t)的所有元素,如果s或t不合理或順序表爲空,則顯示出錯信息並退出運行。
算法思想:和上一題一樣,然後去掉等於s和等於t的等於。
bool del_s_t(SeqList &L, int s, int t, int &e)
{
if (L.length<1 || s>=t)return false;
int k = 0;
for (int i = 0; i < L.length; i++)
{
if (L.data[i]<s) {
L.data[k] = L.data[i];
k++;
}
else if (L.data[i] > t) {
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
return true;
}
(先寫到這裏)