【王道數據結構做題記錄】2.2.3順序表代碼部分(更新中)

寫在前面:

因爲書上不能寫代碼題,所以開個博客記錄一下寫代碼題的過程。改正部分會用標註。

所以這只是我個人的一個做題記錄,並非標準答案,歡迎交流。

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;
}

(先寫到這裏)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章