數(shù)據(jù)結構課后習題及解析第二章_第1頁
數(shù)據(jù)結構課后習題及解析第二章_第2頁
數(shù)據(jù)結構課后習題及解析第二章_第3頁
數(shù)據(jù)結構課后習題及解析第二章_第4頁
數(shù)據(jù)結構課后習題及解析第二章_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、數(shù)據(jù)結構課后習題及解析第二章第二章習題1. 描述以下三個概念的區(qū)別:頭指針,頭結點,首元素結點。2. 填空:(1) 在順序表中插入或刪除一個元素,需要平均移動 元素,具體移動的元素個數(shù)與 有關。(2) 在順序表中,邏輯上相鄰的元素,其物理位置 相鄰。在單鏈表中,邏輯上相鄰的元素,其物理位置 相鄰。(3) 在帶頭結點的非空單鏈表中,頭結點的存儲位置由 指示,首元素結點的存儲位置由 指示,除首元素結點外,其它任一元素結點的存儲位置由 指示。3已知L是無表頭結點的單鏈表,且P結點既不是首元素結點,也不是尾元素結點。按要求從下列語句中選擇合適的語句序列。a. 在P結點后插入S結點的語句序列是: 。b.

2、 在P結點前插入S結點的語句序列是: 。c. 在表首插入S結點的語句序列是: 。d. 在表尾插入S結點的語句序列是: 。供選擇的語句有:(1)P-next=S;(2)P-next= P-next-next;(3)P-next= S-next;(4)S-next= P-next;(5)S-next= L;(6)S-next= NULL;(7)Q= P;(8)while(P-next!=Q) P=P-next;(9)while(P-next!=NULL) P=P-next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;4. 設線性表存于a(1:arrsize)的前elen

3、um個分量中且遞增有序。試寫一算法,將X插入到線性表的適當位置上,以保持線性表的有序性。5. 寫一算法,從順序表中刪除自第i個元素開始的k個元素。6. 已知線性表中的元素(整數(shù))以值遞增有序排列,并以單鏈表作存儲結構。試寫一高效算法,刪除表中所有大于mink且小于maxk的元素(若表中存在這樣的元素),分析你的算法的時間復雜度(注意:mink和maxk是給定的兩個參變量,它們的值為任意的整數(shù))。 7. 試分別以不同的存儲結構實現(xiàn)線性表的就地逆置算法,即在原表的存儲空間將線性表(a1, a2., an)逆置為(an, an-1,., a1)。(1) 以一維數(shù)組作存儲結構,設線性表存于a(1:ar

4、rsize)的前elenum個分量中。(2) 以單鏈表作存儲結構。8. 假設兩個按元素值遞增有序排列的線性表A和B,均以單鏈表作為存儲結構,請編寫算法,將A表和B表歸并成一個按元素值遞減有序排列的線性表C,并要求利用原表(即A表和B表的)結點空間存放表C。9. 假設有一個循環(huán)鏈表的長度大于1,且表中既無頭結點也無頭指針。已知s為指向鏈表某個結點的指針,試編寫算法在鏈表中刪除指針s所指結點的前趨結點。10. 已知有單鏈表表示的線性表中含有三類字符的數(shù)據(jù)元素(如字母字符、數(shù)字字符和其它字符),試編寫算法來構造三個以循環(huán)鏈表表示的線性表,使每個表中只含同一類的字符,且利用原表中的結點空間作為這三個表

5、的結點空間,頭結點可另辟空間。11. 設線性表A=(a1, a2,am),B=(b1, b2,bn),試寫一個按下列規(guī)則合并A、B為線性表C的算法,使得: C= (a1, b1,am, bm, bm+1, ,bn) 當mn時;或者 C= (a1, b1,an, bn, an+1, ,am) 當mn時。線性表A、B、C均以單鏈表作為存儲結構,且C表利用A表和B表中的結點空間構成。注意:單鏈表的長度值m和n均未顯式存儲。12. 將一個用循環(huán)鏈表表示的稀疏多項式分解成兩個多項式,使這兩個多項式中各自僅含奇次項或偶次項,并要求利用原鏈表中的結點空間來構成這兩個鏈表。13. 建立一個帶頭結點的線性鏈表,

6、用以存放輸入的二進制數(shù),鏈表中每個結點的data域存放一個二進制位。并在此鏈表上實現(xiàn)對二進制數(shù)加1的運算 。14. 設多項式P(x)采用課本中所述鏈接方法存儲。寫一算法,對給定的x值,求P(x)的值。實習題1 將若干城市的信息存入一個帶頭結點的單鏈表,結點中的城市信息包括城市名、城市的位置坐標。要求:(1) 給定一個城市名,返回其位置坐標;(2) 給定一個位置坐標P和一個距離D,返回所有與P的距離小于等于D的城市。2 約瑟夫環(huán)問題。約瑟夫問題的一種描述是:編號為1,2,n 的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數(shù))。一開始任選一個整數(shù)作為報數(shù)上限值m,從第一個人開始順時針自1開始

7、順序報數(shù),報到m時停止 報數(shù)。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數(shù),如此下去,直至所有的人全部出列為止。試設計一個程序,求 出出列順序。利用單向循環(huán)鏈表作為存儲結構模擬此過程,按照出列順序打印出各人的編號。例如m的初值為20;n=7,7個人的密碼依次是:3,1,7,2,4,8,4,出列的順序為6,1,4,7,2,3,5。第二章答案約瑟夫環(huán)問題約瑟夫問題的一種描述為:編號1,2,n的n個人按順時針方向圍坐一圈,每個人持有一個密碼(正整數(shù))。一開始任選一個報數(shù)上限值m,從第一個人開始順時針自1開始順序報數(shù),報到m時停止報數(shù)。報m的人出列,將他的密碼作為

8、新的m值,從他在順時針方向上的下一個人開始重新從1報數(shù),如此下去,直至所有的人全部出列為止。試設計一個程序,求出出列順序。利用單向循環(huán)鏈表作為存儲結構模擬此過程,按照出列順序打印出各人的編號。例如m的初值為20;n=7,7個人的密碼依次是:3,1,7,2,4,8,4,出列順序為6,1,4,7,2,3,5?!窘獯稹克惴ㄈ缦拢簍ypedef struct Nodeint password;int num;struct Node *next; Node,*Linklist;void Josephus() Linklist L; Node *p,*r,*q; int m,n,C,j; L=(Node*

9、)malloc(sizeof(Node); /*初始化單向循環(huán)鏈表*/ if(L=NULL) printf(n鏈表申請不到空間!);return; L-next=NULL; r=L; printf(請輸入數(shù)據(jù)n的值(n0):); scanf(%d,&n); for(j=1;jpassword=C; p-num=j; r-next=p; r=p; r-next=L-next;printf(請輸入第一個報數(shù)上限值m(m0):); scanf(%d,&m); printf(*n); printf(出列的順序為:n); q=L; p=L-next; while(n!=1) /*計算出列的順序*/ j=

10、1; while(jnext; j+; printf(%d-,p-num); m=p-password; /*獲得新密碼*/ n-; q-next=p-next; /*p出列*/ r=p; p=p-next; free(r); printf(%dn,p-num);2.7試分別以不同的存儲結構實現(xiàn)單線表的就地逆置算法,即在原表的存儲空間將線性表(a1,a2,an)逆置為(an,an-1,a1)?!窘獯稹浚?)用一維數(shù)組作為存儲結構 void invert(SeqList *L, int *num) int j; ElemType tmp;for(j=0;jnext =NULL) return;

11、/*鏈表為空*/ p=L-next; q=p-next; p-next=NULL; /* 摘下第一個結點,生成初始逆置表 */while(q!=NULL) /* 從第二個結點起依次頭插入當前逆置表 */ r=q-next;q-next=L-next;L-next=q;q=r; 2.11將線性表A=(a1,a2,am), B=(b1,b2,bn)合并成線性表C, C=(a1,b1,am,bm,bm+1,.bn) 當mn時,線性表A、B、C以單鏈表作為存儲結構,且C表利用A表和B表中的結點空間構成。注意:單鏈表的長度值m和n均未顯式存儲?!窘獯稹克惴ㄈ缦拢篖inkList merge(LinkLi

12、st A, LinkList B, LinkList C) Node *pa, *qa, *pb, *qb, *p; pa=A-next; /*pa表示A的當前結點*/ pb=B-next; p=A; / *利用p來指向新連接的表的表尾,初始值指向表A的頭結點*/ while(pa!=NULL & pb!=NULL) /*利用尾插法建立連接之后的鏈表*/ qa=pa-next; qb=qb-next; p-next=pa; /*交替選擇表A和表B中的結點連接到新鏈表中;*/p=pa;p-next=pb;p=pb; pa=qa;pb=qb;if(pa!=NULL) p-next=pa; /*A的

13、長度大于B的長度*/ if(pb!=NULL) p-next=pb; /*B的長度大于A的長度*/C=A; Return(C);提示:第2章 線性表習 題2.1 描述以下三個概念的區(qū)別:頭指針,頭結點,首元素結點。2.2 填空:(1) 在順序表中插入或刪除一個元素,需要平均移動一半元素,具體移動的元素個數(shù)與插入或刪除的位置有關。(2) 在順序表中,邏輯上相鄰的元素,其物理位置相鄰。在單鏈表中,邏輯上相鄰的元素,其物理位置相鄰。(3) 在帶頭結點的非空單鏈表中,頭結點的存儲位置由指示,首元素結點的存儲位置由指示,除首元素結點外,其它任一元素結點的存儲位置由其直接前趨的next域指示。2.3 已知

14、L是無表頭結點的單鏈表,且P結點既不是首元素結點,也不是尾元素結點。按要求從下列語句中選擇合適的語句序列。a. 在P結點后插入S結點的語句序列是:(4)、(1)。b. 在P結點前插入S結點的語句序列是:(7)、(11)、(8)、(4)、(1)。c. 在表首插入S結點的語句序列是:(5)、(12)。d. 在表尾插入S結點的語句序列是:(11)、(9)、(1)、(6)。供選擇的語句有:(1)P-next=S;(2)P-next= P-next-next;(3)P-next= S-next;(4)S-next= P-next;(5)S-next= L;(6)S-next= NULL;(7)Q= P;

15、(8)while(P-next!=Q) P=P-next;(9)while(P-next!=NULL) P=P-next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;2.4 已知線性表L遞增有序。試寫一算法,將X插入到L的適當位置上,以保持線性表L的有序性。提示:void insert(SeqList *L; ElemType x) (1)找出應插入位置i,(2)移位,(3) 參P. 2292.5 寫一算法,從順序表中刪除自第i個元素開始的k個元素。提示:注意檢查i和k的合法性。 (集體搬遷,“新房”、“舊房”) 以待移動元素下標m(“舊房號”)為中心,計算應移入位

16、置(“新房號”): for ( m= i1+k; mlast; m+) Lelem mk = Lelem m ; 同時以待移動元素下標m和應移入位置j為中心: 以應移入位置j為中心,計算待移動元素下標:2.6已知線性表中的元素(整數(shù))以值遞增有序排列,并以單鏈表作存儲結構。試寫一高效算法,刪除表中所有大于mink且小于maxk的元素(若表中存在這樣的元素),分析你的算法的時間復雜度(注意:mink和maxk是給定的兩個參變量,它們的值為任意的整數(shù))。 提示:注意檢查mink和maxk的合法性:mink next;while (p!=NULL & pdata next; (2) 找到最后一個應刪

17、結點的后繼s,邊找邊釋放應刪結點s=p;while (s!=NULL & sdata next; free(t); (3) prenext = s;2.7試分別以不同的存儲結構實現(xiàn)線性表的就地逆置算法,即在原表的存儲空間將線性表(a1, a2., an)逆置為(an, an-1,., a1)。(1) 以一維數(shù)組作存儲結構,設線性表存于a(1:arrsize)的前elenum個分量中。(2) 以單鏈表作存儲結構。方法1:在原頭結點后重新頭插一遍方法2:可設三個同步移動的指針p, q, r,將q的后繼r改為p2.8 假設兩個按元素值遞增有序排列的線性表A和B,均以單鏈表作為存儲結構,請編寫算法,將

18、A表和B表歸并成一個按元素值遞減有序的排列的線性表C,并要求利用原表(即A表和B表的)結點空間存放表C.提示:參P.28 例2-1void merge(LinkList A; LinkList B; LinkList *C) pa=Anext; pb=Bnext; *C=A; (*C)next=NULL;while ( pa!=NULL & pb!=NULL ) if ( padata data ) smaller=pa; pa=panext; smallernext = (*C)next; /* 頭插法 */(*C)next = smaller;else smaller=pb; pb=pbn

19、ext; smallernext = (*C)next;(*C)next = smaller;while ( pa!=NULL) smaller=pa; pa=panext; smallernext = (*C)next; (*C)next = smaller;while ( pb!=NULL) smaller=pb; pb=pbnext; smallernext = (*C)next; (*C)next = smaller;LinkList merge(LinkList A; LinkList B) LinkList C;pa=Anext; pb=Bnext; C=A; Cnext=NULL

20、; return C;2.9 假設有一個循環(huán)鏈表的長度大于1,且表中既無頭結點也無頭指針。已知s為指向鏈表某個結點的指針,試編寫算法在鏈表中刪除指針s所指結點的前趨結點。提示:設指針p指向s結點的前趨的前趨,則p與s有何關系?2.10 已知有單鏈表表示的線性表中含有三類字符的數(shù)據(jù)元素(如字母字符、數(shù)字字符和其它字符),試編寫算法來構造三個以循環(huán)鏈表表示的線性表,使每個表中只含同一類的字符,且利用原表中的結點空間作為這三個表的結點空間,頭結點可另辟空間。2.11 設線性表A=(a1, a2,am),B=(b1, b2,bn),試寫一個按下列規(guī)則合并A、B為線性表C的算法,使得: C= (a1, b1,am, bm, bm+1, ,bn) 當mn時;或者 C= (a1, b1,an, bn, an+1, ,am) 當mn時。線性表A、B、C均以單鏈表作為存儲結構,且C表利用A表和B表中的結點空間構成。注意:單鏈表的長度值m和n均未顯式存儲。提示:void merge(LinkList A; LinkList B; LinkList *C) 或:Lin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論