![第2章線性表習(xí)題解答_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/12/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea1.gif)
![第2章線性表習(xí)題解答_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/12/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea2.gif)
![第2章線性表習(xí)題解答_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/12/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea3.gif)
![第2章線性表習(xí)題解答_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/12/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea4.gif)
![第2章線性表習(xí)題解答_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/12/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea/b3f8fefa-6e61-4b4f-b808-91dfca2e19ea5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 第2章習(xí)題1第2章習(xí)題2.1若將順序表中記錄其長度的分量listlen改為指向最后一個元素的位置last,在實現(xiàn)各基本運算時需要做那些修改?【解】/用線性表最后一個元素的下標(biāo)last代替listLen實現(xiàn)順序表#define MAXLEN 100typedef int elementType;typedef struct sllLastelementType dataMAXLEN;int last;seqList;/初始化void initialList(seqList &S)S.last=-1;/求表長度int listLength(seqList S)return S.last+
2、1;/按序號取元素bool getElement(seqList S,int i,elementType &x) if(i<1 | i>S.last+1) /i為元素編號,有效范圍在1-S.last+1之間return false;elsex=S.datai-1;return true;/查找元素x,成功:返回元素編號;失?。悍祷?int listLocate(seqList S,elementType x)int i;for(i=0;i<=S.last;i+)if(S.datai=x)return i+1; /找到,轉(zhuǎn)換為元素編號輸出return 0;/插入元素in
3、t listInsert(seqList &S,elementType x, int i)int k;if(S.last>MAXLEN-1)return 0; /表滿,返回0else if(i<1 | i>S.last+2)return 1; /插入位置查處范圍,返回1elsefor(k=S.last;k>=i-1;k-)S.datak+1=S.datak;S.datai-1=x;S.last+;return 2;/刪除元素int listDelete(seqList &S,int i)int k;if(S.last=-1)return 0; /空表,返
4、回0else if(i<1 | i>S.last+1)return 1; /刪除元素編號超出范圍,返回1elsefor(k=i;k<=S.last;k+)S.datak-1=S.datak;S.last-;return 2;/7. 打印表中所有元素void printList(seqList L)int i;for(i=0;i<=L.last;i+)cout<<L.datai<<"t" /元素之間以制表符分割cout<<endl;/8. 交互輸入數(shù)據(jù)元素-特殊輸入結(jié)束void listInputC(seqList
5、&L)if(L.last>=0)cout<<"順序表已經(jīng)存在,請先初始化,再輸入元素。"<<endl;return;elementType x;cout<<"請輸入數(shù)據(jù)元素(整數(shù),-9999退出):"<<endl;cout<<"x="cin>>x;while(x!=-9999)L.last+;L.dataL.last=x;cout<<"x="cin>>x;/隨機(jī)數(shù)創(chuàng)建順序表void rndCList(seq
6、List &L)int i;int n,m;L.last=-1;cout<<"請輸入要產(chǎn)生的隨機(jī)數(shù)個數(shù),n="cin>>n;if(n>MAXLEN-1)cout<<"您要求產(chǎn)生的隨機(jī)數(shù)個數(shù)超出了查找表長度"<<MAXLEN-1<<",創(chuàng)建順序表失敗。"<<endl;return;cout<<"請輸入控制隨機(jī)數(shù)大小參數(shù),比如100以內(nèi)數(shù),請輸入100,m="cin>>m; srand(unsigned)tim
7、e(NULL);/產(chǎn)生隨機(jī)數(shù)種子/srand(unsigned)GetTickCount();/產(chǎn)生隨機(jī)數(shù)種子for(i=0;i<n;i+) /隨機(jī)數(shù)寫入排序表AL.datai=rand()%m; L.last=n-1; /表長度為ncout<<endl;2.2試用順序表表示較多位數(shù)的大整數(shù),以便于這類數(shù)據(jù)的存儲。請選擇合適的存放次序,并分別寫出這類大數(shù)的比較、加、減、乘、除等運算,并分析算法的時間性能。【解】順序表0單元存放操作數(shù)的符號,區(qū)分操作數(shù)是正數(shù)還是負(fù)數(shù);為方便處理運算時進(jìn)位和借位,數(shù)據(jù)的低位存放數(shù)組低位,高位存放數(shù)組高位?!緯r間性能】加減法:O(max(m,n)乘
8、除法:O(m´n)2.3試用順序表表示集合,并確定合適的約定,在此基礎(chǔ)上編寫算法以實現(xiàn)集合的交、并、差等運算,并分析各算法的時間性能。【解】/求C=AB依次讀取A的元素,檢查次元素是否在B中,若在B中,則為交集元素,插入C中。void interSet(seqList A, seqList B, seqList &C)int i;for(i=0;i<A.listLen;i+)if(listLocate(B,A.datai)!=0) /A.datai在B中出現(xiàn),是交集元素,插入C中l(wèi)istInsert(&C,A.datai,C.listLen+1);/求C=AB現(xiàn)
9、將A中元素全部插入C中。依次讀取B中元素,檢查是否出現(xiàn)在A中,若不在A中,則為并集元素,插入C中。void mergeSet(seqList A, seqList B, seqList &C)int i;for(i=0;i<A.listLen;i+) /A中元素全部插入C中l(wèi)istInsert(&C,A.datai,C.listLen+1); for(i=0;i<B.listLen;i+)if(listLocate(A,B.datai)=0) /B.datai不在A中,插入ClistInsert(&C,B.datai,C.listLen+1);/求C=A-B
10、依次讀取A中元素,檢查是否在B中出現(xiàn),若不在B中,則為差集元素,插入C中。void differenceSet(seqList A,seqList B,seqList &C)int i;for(i=0;i<A.listLen;i+)if(listLocate(B,A.datai)=0)listInsert(&C,A.datai,C.listLen+1); /A.datai不在B中,插入C【算法分析】時間復(fù)雜度:O( |A| ´ |B| )2.4假設(shè)順序表L中的元素遞增有序,設(shè)計算法在順序表中插入元素x,要求插入后仍保持其遞增有序特性,并要求時間盡可能少?!窘狻咳?/p>
11、果表空間滿,插入失敗,返回-1;否則,從L最后一個元素開始,與x比較,若大于x,元素后移,直到L中元素小于或等于x,這個元素的后面的單元即為x的插入位置,插入成功返回插入位置。/空間滿:返回值-1;正確插入:返回表中的插入位置int incInsert(seqList &L,elementType x)int i=L.listLen-1;if(L.listLen=MAXLEN)return -1; /表空間已滿,不能插入新的元素else while(i>=0 && L.datai>x)L.datai+1=L.datai;i-;L.datai+1=x; /插入
12、xL.listLen+; /修改表長度return i+2; /成功插入,返回x在順序表中的插入位置(元素編號)【算法分析】時間復(fù)雜度:O(n)2.5假設(shè)順序表L中的元素遞增有序,設(shè)計算法在順序表中插入元素x,并要求在插入后也沒有相同的元素,即若表中存在相同的元素,則不執(zhí)行插入操作?!窘狻颗c上題相似,只是在移動插入元素之前,檢查L中是否已經(jīng)存在值x,若存在,插入失敗,返回-2。/空間滿:返回值-1;x已經(jīng)存在返回-2;正確插入:返回表中的插入位置int incInsert(seqList &L,elementType x)int i;if(L.listLen=MAXLEN)return
13、 -1; /表空間已滿,不能插入新的元素else for(i=0;i<L.listLen;i+) if(L.datai=x) return -2; /元素x已經(jīng)存在,插入失敗,返回-2i=L.listLen-1;while(i>=0 && L.datai>x) /后移元素L.datai+1=L.datai;i-;L.datai+1=x; /插入xL.listLen+; /修改表長度return i+2; /成功插入,返回x在順序表中的插入位置(元素編號)2.6設(shè)計算法以刪除順序表中重復(fù)的元素,并分析算法的時間性能?!窘狻俊痉治觥咳匮h(huán)實現(xiàn)。第一層循環(huán),從左往
14、右依次取出L元素,用i指示;第二層循環(huán),對i元素在L中循環(huán)查重,用下標(biāo)j指示;第三重循環(huán),刪除重復(fù)元素。查重和刪除從j=L.listLen-1開始,效率稍微好一點,因為這樣重復(fù)元素本身不需重復(fù)移動。如果從i+1開始查重、刪除,則j+1以后的重復(fù)元素會被移動?!舅惴枋觥縱oid DeleteRepeatData(seqList & L)int i,j;if(L.listLen=0)cout<<"當(dāng)前順序表空!"<<endl;return;if(L.listLen=1)cout<<"當(dāng)前順序表只有一個元素!"&l
15、t;<endl;return;i=0;while(i<L.listLen-1)for(j=L.listLen-1; j>i; j-) /從后往前刪除,效率較高if(L.datai=L.dataj) /元素重復(fù),調(diào)用刪除listDelete(&L,j+1); /調(diào)用刪除函數(shù),下標(biāo)差1,所以+1 /以下部分代碼是直接刪除,沒有調(diào)用刪除函數(shù)/int k;/for(k=j; k<L.listLen-1; k+)/L.datak=L.datak+1;/L.listLen-;i+; 【算法分析】時間性能:O(n3)2.7假設(shè)順序表L中的元素按從小到大的次序排列,設(shè)計算法以刪
16、除表中重復(fù)的元素, 并要求時間盡可能少。要求:(1)對順序表(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9)模擬執(zhí)行本算法,并統(tǒng)計移動元素的次數(shù)。(2)分析算法的時間性能?!窘狻俊痉治觥繉⒃胤殖蓛蓚€部分:已經(jīng)處理元素和待處理元素。已經(jīng)處理部分返回L中,用下標(biāo)i指示最后一個元素,初始化i=0。待處理部分用下標(biāo)j指示第一個元素,初始化j=1.左邊下標(biāo)小于i的元素已經(jīng)處理好重復(fù),等于i是當(dāng)前正在處理的元素,將datai與dataj進(jìn)行比較,會出現(xiàn)下列情況: datai=dataj,說明j指示的是i的重復(fù)元素,繼續(xù)處理j的下一個元素,即執(zhí)行j+。 datai<data
17、j, 說明j指示元素與i的元素不同,如果i+1!=j,將j元素復(fù)制到i+1,即:L.datai+1=L.dataj,再執(zhí)行j+,i+;若i+1=j,說明j是i的直接后繼,無需復(fù)制,直接執(zhí)行i+,j+。循環(huán)執(zhí)行上述操作,直到表尾。修改L的長度為i+1?!舅惴枋觥縱oid DeleteRepeatData(seqList & L)int i,j; /分別指向已處理部分最后元素和未處理部分第一個元素,皆為數(shù)組下標(biāo)if(L.listLen<2)return; /少于2個元素,直接退出i=0; /初始化i指向第一個元素j=1; /j指向第二個元素while(j<L.listLen)
18、if(L.datai=L.dataj) /j為重復(fù)元素,j后移j+;else /因為L遞增,所以剩下情況即L.datai<L.dataj,j為目標(biāo)元素 /如果j=i+1,說明j緊隨i,無需移動元素,直接i+、j+即可if(i+1)!=j)L.datai+1=L.dataj; /j元素復(fù)制到i+1i+; /無論那種情況,都需要同時后移i、jj+;L.listLen=i+1; /修改表的實際長度【算法分析】時間復(fù)雜度O(n)。上例中只需移動8個元素。2.8若遞增有序順序表A、B分別表示一個集合,設(shè)計算法求解A=AÇB,并分析其時間性能?!窘狻俊痉治觥繉忣}:A、B為集合,說明兩個表中
19、都沒有重復(fù)元素 A=AB,即要求交集元素就放在A表中,而不是創(chuàng)建一個新表來存放。設(shè)置兩個指針ia、ib分別指向A、B表當(dāng)前處理的元素;設(shè)置一個指針i指示已經(jīng)求取的交集元素在A的表中的最后元素位置;比較A、B表當(dāng)前元素,會出現(xiàn)以下三種情況(1) A.dataia=B.dataib,則ia或ib是交集元素,如果ia!=i+1,將ia元素復(fù)制到i+1,即:A.datai+1=A.dataia;否則,若ia=i+1,說明ia就在i的后面,無需復(fù)制元素。最后,無論那種情況,修改指針:ia+,ib+,i+(2) A.dataia<B.dataib,當(dāng)前元素為非交集元素,只需移動ia,即ia+(3)
20、A.dataia>B.dataib,當(dāng)前元素為非交集元素,只需移動ib,即ib+重復(fù)以上過程,直至A、B中至少一個表結(jié)束。修改A表長度為i+1?!舅惴枋觥縱oid InterSet(seqList &A, seqList &B)int i=-1; /為了最后更新交集元素表長度操作一致,初始化為-1int ia=0, ib=0; /A、B表當(dāng)前元素的數(shù)組下標(biāo)while(ia<A.listLen && ib<B.listLen)if(A.dataia=B.dataib) /ia和ib指示的是交集元素if(ia!=i+1) /ia元素復(fù)制到i+1,
21、否則ia位置即目標(biāo)位置,不需復(fù)制元素A.datai+1=A.dataia;i+;ia+;ib+;else if(A.dataia<B.dataib) /以下為非交集元素處理ia+;elseib+;A.listLen=i+1; /更新A表長度,使等于交集元素個數(shù)。2.9遞增有序順序表A、B分別表示一個集合,設(shè)計算法求解A=AB,并分析其時間性能?!窘狻俊痉治觥繉忣}:A=A-B,即要求要利用A表的空間保存差集元素,而不是創(chuàng)建一個新表。設(shè)置兩個指針ia、ib分別指向A、B表當(dāng)前處理的元素;設(shè)置一個指針i指示已經(jīng)求取的差集元素在A的表中的最后元素位置;比較A、B表當(dāng)前元素,會出現(xiàn)以下三種情況(1
22、) A.dataia=B.dataib,則ia或ib是交集元素,不是A-B中元素,直接跳過,修改指針:ia+,ib+。(2) A.dataia>B.dataib,ia指示的元素可能在B表ib指示的元素后面,ia不動,移動ib,即ib+。(3) A.dataia<B.dataib,ia指示的元素不可能在B中出現(xiàn),故比為A-B中元素。需要的話遷移到目標(biāo)位置,即 (i+1)!=ia時,執(zhí)行A.datai+1=A.dataia。若(i+1)=ia,ia即為目標(biāo)位置,無需復(fù)制遷移。遷移完成,移動指示器:i+,ia+。重復(fù)以上過程,直至A、B中至少一個表結(jié)束。還有一種情況:B表已結(jié)束,但A表尚
23、未結(jié)束,說明A剩下元素不在B中,全為A-B中元素,全部遷移到目標(biāo)位置。最后,修改A表長度為i+1?!舅惴枋觥縱oid SetSubtraction(seqList & A, seqList & B)int i=-1; /指示A中已經(jīng)處理的最后元素int ia=0, ib=0; /指示A、B中,當(dāng)前待處理的元素,初始指向第一個元素while( ia<A.listLen && ib<B.listLen )if(A.dataia=B.dataib) /非A-B中元素,ia、ib同時后移ia+;ib+;else if(A.dataia>B.dataib) ib+; /此時,ia指示元素可能在B中ib指示的元素后面,移動ib。else /此為,A.dataia<B.dataib,因為遞增性,i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度市政道路施工人工費結(jié)算合同
- 2025年度建筑工程施工安全生產(chǎn)監(jiān)督返費合同
- 2025年度文化創(chuàng)意產(chǎn)品開發(fā)借款借據(jù)合同范本
- 欽州2025年廣西欽州市事業(yè)單位招聘893人筆試歷年參考題庫附帶答案詳解
- 莆田2025年福建莆田市涵江區(qū)區(qū)直事業(yè)單位招聘研究生5人筆試歷年參考題庫附帶答案詳解
- 安全生產(chǎn)三項制度
- 漯河2024年河南漯河市城市管理局所屬事業(yè)單位人才引進(jìn)13人筆試歷年參考題庫附帶答案詳解
- 昆明云南昆明市晉寧區(qū)六街鎮(zhèn)中心幼兒園招聘編外工作人員筆試歷年參考題庫附帶答案詳解
- 2025年中國雙眼脈沖爐市場調(diào)查研究報告
- 2025年中國三字扣市場調(diào)查研究報告
- 《社會主義市場經(jīng)濟(jì)理論(第三版)》第一章社會主義市場經(jīng)濟(jì)基礎(chǔ)論
- 銀行授信盡職調(diào)查課件
- 河北省縣市鄉(xiāng)鎮(zhèn)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心基本公共衛(wèi)生服務(wù)醫(yī)療機(jī)構(gòu)名單目錄地址2415家
- 視頻號精細(xì)化運營培訓(xùn)課件
- 土木工程專業(yè)畢業(yè)論文任務(wù)書 土木工程專業(yè)電大畢業(yè)論文
- (完整版)漢密爾頓焦慮量表(HAMA)
- 電力電子技術(shù)全套課件
- 編外人員錄用審批表
- 倪海廈《天紀(jì)》講義
- 建設(shè)年飼養(yǎng)240萬只蛋雛雞培育基地項目可行性研究報告
- 黃金太陽漆黑的黎明金手指
評論
0/150
提交評論