日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

王道计算机考研 数据结构 课后编程习题代码(绪论、线性表)

發(fā)布時(shí)間:2025/3/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 王道计算机考研 数据结构 课后编程习题代码(绪论、线性表) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第二章、線性表

2.2.3

1.

  • 題意 :從順序表中刪除具有最小值的元素(假設(shè)唯一)并由函數(shù)返回被刪函數(shù)的值,空出的位置由最后一個(gè)元素填補(bǔ),若順序表為空,則顯示出錯(cuò)信息并退出運(yùn)行。
  • 思路 :搜索整個(gè)順序表,查找最小值元素并記住其位置,搜索結(jié)束后用最后一個(gè)元素填補(bǔ)空出的原最小值元素的位置。
bool Del_Min(SqList &L, ElemType &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.

  • 題意 :設(shè)計(jì)一個(gè)高效算法,將順序表L的所有元素逆置,要求算法的空間復(fù)雜度為O(1)O(1)O(1)
  • 思路 :掃描順序表L的前半部分元素,對(duì)于元素L.data[i](0<=i<L.length/2)L.data[i](0<=i<L.length/2)L.data[i](0<=i<L.length/2),將其與后半部分的對(duì)應(yīng)元素L.data[L.length?i?1]L.data[L.length - i - 1]L.data[L.length?i?1]進(jìn)行交換。
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.

  • 題意 :對(duì)長度為n的順序表L,編寫一個(gè)時(shí)間復(fù)雜度為O(n)O(n)O(n),空間復(fù)雜度為O(1)O(1)O(1)的算法,該算法刪除線性表中所有值為x的數(shù)據(jù)元素。
  • 解法一 :用k記錄順序表L中不等于x的元素個(gè)數(shù),并將不等于x的元素向前移動(dòng)k個(gè)位置,最后修改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 ++ ;}L.length = k; }
  • 解法二 :用k記錄順序表L中等于x的元素個(gè)數(shù),并將不等于x的元素往前移k個(gè)位置,最后修改L的長度。
void del_x_2(SqList &L, ElemType x) {int i = 0, k = 0;while (i < L.length){if (L.data[i] == x) k ++ ;else L.data[i - k] = L.data[i];i ++ ;}L.length -= k; }

4.

  • 題意 :從有序順序表中刪除其值在給定s與t之間(要求s<t)的所有元素,若s或t不合理或順序表為空,則顯示出錯(cuò)信息并退出運(yùn)行。
  • 思路 :本題與上一題存在區(qū)別。因?yàn)槭怯行虮?#xff0c;所以刪除的元素必然是相連的整體。先尋找值大于等于s的第一個(gè)元素(第一個(gè)刪除的元素),然后尋找值大于t的第一個(gè)元素(最后一個(gè)刪除的元素的下一個(gè)元素),要將這段元素刪除,只需直接將后面的元素前移。
bool Del_s_t2(SqList &L, ElemType s, ElemType t) {if (s >= t || L.length == 0) return false;int i, j;for (i = 0; i < L.length && L.data[i] < s; i ++ );if (i >= L.length) return false;for (j = i; j < L.length && L.data[j] <= t; j ++ );for (; j < L.length; i ++ , j ++ )L.data[i] = L.data[j];L.length = i;return true; }

5.

  • 題意 :從順序表中刪除其值在給定值s與t之間(包含s和t,要求s<t)的所有元素,若s或t不合理或順序表為空…
  • 思路 :由于這樣每個(gè)不在s到t之間的元素僅移動(dòng)一次,因此算法效率高。
bool Del_s_t(SqList &L, ElemType s, ElemType t) {if (s >= t || L.length == 0) return false;int i, k = 0;for (i = 0; i < L.length; i ++ ){if (L.data[i] >= s && L.data[i] <= t)k ++ ;elseL.data[i - k] = L.data[i];}L.length -= k;return true; }

6.

  • 題意 :從有序順序表中刪除所有值重復(fù)的元素,使表中所有元素的值均不同。
  • 思路 :注意是有序順序表,值相同的元素一定在連續(xù)的位置上,用類似于直接插入排序的思想,初始時(shí)將第一個(gè)元素視為非重復(fù)的有序表。之后依次判斷后面的元素是否與前面非重復(fù)有序表的最后一個(gè)元素相同,若相同,則繼續(xù)向后判斷,若不同,則插入前面的非重復(fù)有序表的最后,直至判斷到表尾為止。
bool Delete_Same(SqList &L) {if (L.length == 0) return false;int i, j; // i為第一個(gè)不相同的元素,j為工作指針for (i = 0, j = 1; j < L.length; j ++ )if (L.data[i] != L.data[j])L.data[ ++ i] = L.data[j];L.length = i + 1;return true; }

7.

  • 題意 :將兩個(gè)有序順序表合并為一個(gè)新的有序順序表,并由函數(shù)返回結(jié)果順序表。
  • 思路 :首先,按順序不斷取下兩個(gè)順序表表頭較小的結(jié)點(diǎn)存入新的順序表中,然后,看哪個(gè)表還有剩余,將剩下的部分加到新的順序表后面。
bool Merge(SqList A, SqList B, SqList &C) {if (A.length + B.length > C.MaxSize) return false;int i = 0, j = 0, k = 0;while (i < A.length && j < B.length){if (A.data[i] <= B.data[j])C.data[k ++ ] = A.data[i ++ ];elseC.data[k ++ ] = B.data[j ++ ];}while (i < A.length)C.data[k ++ ] = A.data[i ++ ];while (j < B.length)C.data[k ++ ] = B.data[j ++ ];C.length = k;return true; }

8.

  • 題意 :已知在一維數(shù)組A[m+n]A[m+n]A[m+n]中依次存放兩個(gè)線性表(a1,a2,...,am)(a_1,a_2,...,a_m)(a1?,a2?,...,am?)(b1,b2,...,bn)(b_1,b_2,...,b_n)(b1?,b2?,...,bn?)。試編寫一個(gè)函數(shù),將數(shù)組中兩個(gè)順序表的位置互換,即將(b1,b2,...,bn)(b_1,b_2,...,b_n)(b1?,b2?,...,bn?)放在(a1,a2,...,am)(a_1,a_2,...,a_m)(a1?,a2?,...,am?)的前面。
  • 思路 :先將數(shù)組A[n+m]A[n+m]A[n+m]中的全部元素(a1,a2,...,am,b1,b2,...,bn)(a_1,a_2,...,a_m,b_1,b_2,...,b_n)(a1?,a2?,...,am?,b1?,b2?,...,bn?)原地逆置為(bn,..,b1,am,...,a1)(b_n,..,b_1,a_m,...,a_1)(bn?,..,b1?,am?,...,a1?),再對(duì)前n個(gè)元素和后m個(gè)元素分別使用逆置算法,即可實(shí)現(xiàn)順序表的位置互換。
typedef int DataType;void Reverse(DataType A[], int left, int right, int arraySize) {if (right <= left || right >= arraySize) return ;int mid = (left + right) / 2;for (int i = 0; i <= mid - left; i ++ ){DataType temp = A[left + i];A[left + i] = A[right - i];A[right - i] = temp;} }void Exchange(DataType A[], int m, int n, int arraySize) {Reverse(A, 0, m + n - 1, arraySize);Reverse(A, 0, n - 1, arraySize);Reverse(A, n, m + n - 1, arraySize); }

9.

  • 題意 :線性表(a1,a2,...,an)(a_1,a_2,...,a_n)(a1?,a2?,...,an?)中的元素遞增有序且按順序存儲(chǔ)于計(jì)算機(jī)內(nèi)。要求設(shè)計(jì)一個(gè)算法,完成用最少時(shí)間在表中查找數(shù)值為x的元素,若找到,則將其與后繼元素位置相交換,若找不到,則將其插入表中并使表中元素仍遞增有序。
  • 思路 :順序存儲(chǔ)的線性表遞增有序,可以順序查找,也可以折半查找。題目要求”用最少的時(shí)間在表中查找值為x的元素“,這里應(yīng)該使用折半查找法。
void SearchExchangeInsert(ElemType A[], ElemType x) {int low = 0, high = n - 1, mid;while (low <= high){mid = (low + high) / 2;if (A[mid] == x) break;if (A[mid] < x) low = mid + 1;else high = mid - 1;}if (A[mid] == x && mid != n - 1){t = A[mid], A[mid] = A[mid + 1], A[mid + 1] = t;}if (low > high){for (i = n - 1; i > high; i -- )A[i + 1] = A[i];A[i + 1] = x; // A[high + 1] = x;} }

10.

  • 2010統(tǒng)考真題
  • 題意 :設(shè)將n(n>1)n(n>1)n(n>1)個(gè)整數(shù)存放到一維數(shù)組R中。設(shè)計(jì)一個(gè)在時(shí)間和空間兩方面都盡可能高效的算法。將R中保存的序列循環(huán)左移p(0<p<n)p(0<p<n)p(0<p<n)個(gè)位置,即將R中的數(shù)據(jù)由(X0,X1,...,Xn?1)(X_0,X_1,...,X_{n-1})(X0?,X1?,...,Xn?1?)變換為(Xp,Xp+1,...,Xn?1,X0,X1,...,Xp?1)(X_p,X_{p+1},...,X_{n-1},X_0,X_1,...,X_{p-1})(Xp?,Xp+1?,...,Xn?1?,X0?,X1?,...,Xp?1?)。要求:
  • 算法的基本設(shè)計(jì)思想 :可將這個(gè)問題視為把數(shù)組ab轉(zhuǎn)換成數(shù)組ba(a代表數(shù)組的前p個(gè)元素,b代表數(shù)組中余下的n-p個(gè)元素),先將a逆置得到a?1ba^{-1}ba?1b,然后將b逆置得到a?1b?1a^{-1}b^{-1}a?1b?1,最后將整個(gè)逆置得到(a?1b?1)?1=ba(a^{-1}b^{-1})^{-1}=ba(a?1b?1)?1=ba。設(shè)Reverse函數(shù)執(zhí)行將數(shù)組元素逆置的操作,且兩個(gè)參數(shù)分別表示數(shù)組中待轉(zhuǎn)換元素的始末位置。
  • 使用C語言描述算法如下 :
void Reverse(int R[], int from, int to) {int i, temp;for (i = 0; i < (to - from + 1) / 2; i ++ ){temp = R[from + i];R[from + i] = R[to - i];R[to - i] = temp;} }void Converse(int R[], int n, int p) {Reverse(R, 0, p - 1);Reverse(R, p, n - 1);Reverse(R, 0, n - 1); }
  • 上述算法中三個(gè)Reverse函數(shù)的時(shí)間復(fù)雜度分別為O(p/2),O((n?p)/2),O(n/2)O(p/2),O((n-p)/2),O(n/2)O(p/2),O((n?p)/2),O(n/2),故所設(shè)計(jì)的算法的時(shí)間復(fù)雜度為O(n)O(n)O(n),空間復(fù)雜度為O(1)O(1)O(1)

11.

  • 2011統(tǒng)考真題
  • 題意 :一個(gè)長度為L(L>=1)(L>=1)(L>=1)的升序序列S,處在第[L/2][L/2][L/2]個(gè)位置的數(shù)稱為S的中位數(shù)。例如,若序列S1=(11,13,15,17,19)S_1=(11,13,15,17,19)S1?=(11,13,15,17,19),則S1S_1S1?的中位數(shù)是15,兩個(gè)序列的中位數(shù)是含它們所有元素的升序序列的中位數(shù)。現(xiàn)在有兩個(gè)等長升序序列A和B,試設(shè)計(jì)一個(gè)在時(shí)間和空間兩方面都盡可能高效的算法,找出兩個(gè)序列A和B的中位數(shù)。要求:

12.

  • 2013統(tǒng)考真題
  • 題意 :已知一個(gè)整數(shù)序列A=(a0,a1,...,an?1)A=(a_0,a_1,...,a_{n-1})A=(a0?,a1?,...,an?1?),其中0<=an<n(0<=i<n)0<=a_n<n(0<=i<n)0<=an?<n(0<=i<n)。若存在ap1=ap2==...=apm=xa_{p1}=a_{p2}==...=a_{pm}=xap1?=ap2?==...=apm?=x且m>n/2(0,=pk<n,1<=k<=m)(0,=p_k<n,1<=k<=m)(0,=pk?<n,1<=k<=m),則稱x為A的主元素。例如…。假設(shè)A中的n個(gè)元素保存在一個(gè)一維數(shù)組中,請(qǐng)?jiān)O(shè)計(jì)一個(gè)盡可能高效的算法,找出A的主嚴(yán)肅,若存在則輸出,否則輸出-1。要求:

13.

  • 2018統(tǒng)考真題
  • 題意 :給定一個(gè)含n(n>=1)個(gè)整數(shù)的數(shù)組,請(qǐng)?jiān)O(shè)計(jì)一個(gè)在時(shí)間上盡可能高效的算法,找出數(shù)組中未出現(xiàn)的最小正整數(shù)。要求 :

14.

  • 2020統(tǒng)考真題
  • 題意 :定義三元組(a,b,c)(a,b,c)(a,b,c)(a,b,c均為正數(shù))的距離D=∣a?b∣+∣b?c∣+∣c?a∣D=|a-b|+|b-c|+|c-a|D=a?b+b?c+c?a。給定三個(gè)非空整數(shù)集合S1,S2,S3S_1,S_2,S_3S1?,S2?,S3?,按升序分別存儲(chǔ)在3個(gè)數(shù)組中,請(qǐng)?jiān)O(shè)計(jì)一個(gè)盡可能高效的算法,計(jì)算并輸出所有可能的三元組(a,b,c)(a屬于S1,b屬于S2,c屬于S3)(a,b,c)(a屬于S_1,b屬于S_2,c屬于S_3)(a,b,c)(aS1?bS2?cS3?)中的最小距離。要求 :

總結(jié)

以上是生活随笔為你收集整理的王道计算机考研 数据结构 课后编程习题代码(绪论、线性表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。