2023年人武學院數(shù)據(jù)結構課后習題答案及期末綜合練習_第1頁
2023年人武學院數(shù)據(jù)結構課后習題答案及期末綜合練習_第2頁
2023年人武學院數(shù)據(jù)結構課后習題答案及期末綜合練習_第3頁
2023年人武學院數(shù)據(jù)結構課后習題答案及期末綜合練習_第4頁
2023年人武學院數(shù)據(jù)結構課后習題答案及期末綜合練習_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十章內(nèi)部排序一、基本知識題答案1.排序:將一組雜亂無序的數(shù)據(jù)按一定的規(guī)律順次排列起來叫做排序。內(nèi)部排序:數(shù)據(jù)存儲在內(nèi)存中,并在內(nèi)存中加以解決的排序方法叫內(nèi)部排序。堆:堆是一個完全二叉樹,它的每個結點相應于原始數(shù)據(jù)的一個元素,且規(guī)定假如一個結點有兒子結點,此結點數(shù)據(jù)必須大于或等于其兒子結點數(shù)據(jù)。穩(wěn)定排序:一種排序方法,若排序后具有相同關鍵字的記錄仍維持本來的相對順序,則稱之為穩(wěn)定的,否則稱為不穩(wěn)定的。2.回答下面問題(1)5000個無序的數(shù)據(jù),希望用最快速度挑選出其中前10個最大的元素,在快速排序、堆排序、歸并排序和基數(shù)排序中采用哪種方法最佳?為什么?(2)大多數(shù)排序算法都有哪兩個基本操作?答:(1)采用堆排序最佳。由于以上幾種算法中,快速排序、歸并排序和基數(shù)排序都是在排序結束后才干擬定數(shù)據(jù)元素的所有順序,而無法知道排序過程中部分元素的有序性。堆排序則每次輸出一個最大(或最小)的元素,然后對堆進行調(diào)整,保證堆頂?shù)脑乜偸怯嘞略刂凶畲螅ɑ蜃钚?的。根據(jù)題意,只要選取前10個最大的元素,故采用堆排序方法是合適的。(2)兩個基本操作:比較兩個關鍵字的大小、改變指向記錄的指針或移動記錄自身。3.3.已知序列{17,25,55,43,3,32,78,67,91},請給出采用冒泡排序法對該序列作遞增排序時每一趟的結果。答:采用冒泡排序法排序時的各趟結果如下:初始:17,25,55,43,3,32,78,67,91第1趟:17,25,43,3,32,55,67,78,91第2趟:17,25,3,32,43,55,67,78,91第3趟:17,3,25,32,43,55,67,78,91第4趟:3,17,25,32,43,55,67,78,91第5趟:3,17,25,32,43,55,67,78,91第5趟無元素互換,排序結束。4.已知序列{491,77,572,16,996,101,863,258,689,325},請分別給出采用快速排序、堆排序和基數(shù)排序法對該序列作遞增排序時每一趟的結果。答:采用快速排序法排序時的各趟結果如下:初始:491,77,572,16,996,101,863,258,689,325第1趟:[325,77,258,16,101]491[863,996,689,572]第2趟:[101,77,258,16]325,491[863,996,689,572]第3趟:[16,77]101[258]325,491[863,996,689,572]第4趟:16[77]101[258]325,491[863,996,689,572]第5趟:16,77,101[258]325,491[863,996,689,572]第6趟:16,77,101,258,325,491[863,996,689,572]第7趟:16,77,101,258,325,491[572,689]863[996]第8趟:16,77,101,258,325,491,572[689]863[996]第9趟:16,77,101,258,325,491,572,689,863[996]第10趟:16,77,101,258,325,491,572,689,863,996采用堆排序法排序時各趟的結果如下圖所示:(a)初始堆(b)建堆(c)互換996和77,輸出996(d)篩選調(diào)整采用基數(shù)排序法排序時各趟的結果如下:初始:491,77,572,16,996,101,863,258,689,325第1趟(按個位排序):491,101,572,863,352,16,996,77,258,689第2趟(按十位排序):101,16,352,258,863,572,77,689,491,996第3趟(按百位排序):16,77,101,258,352,491,572,689,863,9965.已知序列{86,94,138,62,41,54,18,32},請給出采用插入排序法對該序列作遞增排序時,每一趟的結果。答:采用插入排序法排序時各趟的結果如下:初始:(86),94,138,62,41,54,18,32第1趟:(86,94),138,62,41,54,18,32第2趟:(86,94,138),62,41,54,18,32第3趟:(62,86,94,138),41,54,18,32第4趟:(41,62,86,94,138),54,18,32第5趟:(41,54,62,86,94,138),18,32第6趟:(18,41,54,62,86,94,138),32第7趟:(18,32,41,54,62,86,94,138)6.已知序列{27,35,11,9,18,30,3,23,35,20},請給出采用歸并排序法對該序列作遞增排序時的每一趟的結果。答:采用歸并排序法排序時各趟的結果如下:初始:27,35,11,9,18,30,3,23,35,20第1趟:[27,35][9,11][18,30][3,23][20,35]第2趟:[9,11,27,35][3,18,23,30][20,35]第3趟:[9,11,27,35][3,18,20,23,30,35]第4趟:[3,9,11,18,20,23,27,30,35,35]二、算法設計題答案1.二、算法設計題1.一個線性表中的元素為所有為正或者負整數(shù),試設計一算法,在盡也許少的時間內(nèi)重排該表,將正、負整數(shù)分開,使線性表中所有負整數(shù)在正整數(shù)前面。解:本題的算法思想是:設立兩個變量分別指向表的首尾,它們分別向中間移動,指向表首的?假如碰到正整數(shù),指向表尾的假如碰到負整數(shù)則互相互換,然后繼續(xù)移動直至兩者相遇。實現(xiàn)本?題功能的算法如下:voidpart(intarray[],intn){?inti,j;?i=1; j=n;while(i<j) {while(i<j&&array[i]<0) ??i++;? while(i<j&&array[j]>=0)?? j--; ?if(i<j) {array[0]=array[i]; ??array[i]=array[j];???array[j]=array[0];? }?}}2.設計一個用單鏈表作存儲結構的直接插入排序算法。解:實現(xiàn)本題功能的算法如下:voidinsertsort(node*head){?node*p,*q,*pre;?pre=head;?p=head->next;/*p指向待插入的元素*/?while(p!=NULL)?{??q=head; ?if(p->key<q->key)/*插到表首*/{pre->next=p->next;? p->next=head;???head=p;? }? else??{??while(q->next!=p&&q->next->key<p->key) ??q=q->next; ?if(q->next==p) ?{ ??pre=p;p=p->next; }???else? ?{pre->next=p->next;? ?p->next=q->next; ? q->next=p;? ??p=pre->next;???}??}?}}3.試設計一個算法實現(xiàn)雙向冒泡排序。(雙向冒泡排序就是在排序的過程中交替改變掃描方向。)解:實現(xiàn)本題功能的算法如下:voiddbubblesort(sqlistr,intn){ inti,j,flag; flag=1; i=1;?while(flag!=0)?{? flag=0; for(j=i;j<n-i;j++){ ?if(r[j]>r[j+1]) ?{ ? ?flag=1;?? r[0]=r[j]; ?? r[j]=r[j+1];?? r[j+1]=r[0];?? }??}??for(j=n-i;j>i;j--){ ? if(r[j]<r[j-1])?? {flag=1;?? ?r[0]=r[j];????r[j]=r[j-1]; ?r[j-1]=r[0];? ?} }?? i++;?}}4.設一個一維數(shù)組A[n]中存儲了n個互不相同的整數(shù),且這些整數(shù)的值都在0到n-1之間,即A中存儲了從0到n-1這n個整數(shù)。試編寫一算法將A排序,結果存放在數(shù)組B[n]中,規(guī)定算法的時間復雜性為O(n)。解:實現(xiàn)本題功能的算法如下:voidsort(intA[n],intB[n]){?inti; for(i=0;i<n;i++) ?B[A[i]]=A[i];}第九章一、基礎知識題1.(1)查找:查找又稱為查詢或檢索,是在一批記錄中依照某個域的指定域值,找出相應的記錄的操作。(2)樹型查找:將原始數(shù)據(jù)表達成二叉排序樹,樹的每個結點相應一個記錄,運用此二叉排序樹進行類似于二分查找思想的數(shù)據(jù)查找,這種查找方法稱為樹型查找。(3)平衡因子:二叉樹中每一結點的左子樹高度減右子樹高度為該結點的平衡因子。(4)散列函數(shù):根據(jù)關鍵字求存儲地址的函數(shù)稱為散列函數(shù)。(5)兩個不同的關鍵字,其散列函數(shù)值相同,因而被映射到同一個表位置上的現(xiàn)象稱為沖突。2.設有序表為{a,b,c,d,e,f,g},請分別畫出對給定值f,g和h進行拆半查找的過程。答:查找f的過程如下:查找成功,找到k=f值查找g的過程如下:查找成功,找到k=g值查找h的過程如下:試述順序查找法、二分查找法和分塊查找法對被查找表中元素的規(guī)定,每種查找法對長度為n的表的等概率查找長度是多少答:順序查找法:表中元素可以任意存放。查找成功的平均查找長度為(n+1)/2。二分查找法:表中元素必須以關鍵字的值遞增或遞減地存放且只能以順序表存放。查找成功的平均查找長度為log2(n+1)-1。分塊查找法:表中每塊內(nèi)的元素可以任意存放,但塊與塊之間必須按關鍵字的大小遞增或遞減地存放,即前一塊內(nèi)所有元素的關鍵字不能大(或小)于后一塊內(nèi)任意一個元素的關鍵字。若用順序查找擬定所在塊,平均查找長度為1/2(n/s+s)+1;若用二分查找擬定所在塊,平均查找長度為log2(n/s+1)+s/2。4.設散列表長m=14,哈希函數(shù)為H(k)=kmod11,表中一共有8個元素{15,27,50,73,49,61,37,60},試畫出采用二次探測法解決沖突的散列表。答:采用二次探測法解決沖突的散列表如下:5.線性表的關鍵字集合為{113,12,180,138,92,67,94,134,252,6,70,323,60},共有13個元素,已知散列函數(shù)為:H(k)=kmod13,采用鏈接表解決沖突,試設計這種鏈表結構。答:由題意,可得:H(113)=113%13=9H(12)=12%13=12H(180)=180%13=11H(138)=138%13=8H(92)=92%13=1H(67)=67%13=2H(94)=94%13=3H(134)=134%13=4H(252)=252%13=5H(6)=6%13=6H(70)=70%13=5H(323)=323%13=11H(60)=60%13=8鏈接表法的散列表如下圖所示:6.設關鍵字集合為{27,49,79,5,37,1,56,65,83},散列函數(shù)為:H(k)=kmod7,散列表長度m=10,起始地址為0,分別用線性探測和鏈接表法來解決沖突。試畫出相應的散列表。答:線性探測法的散列表如下圖所示:鏈接表法的散列表如下圖所示:二、算法設計題1.從小到大排列的,試寫出對此鏈表的查找算法,并說明是否可以采用折半查找。解:實現(xiàn)本題功能的算法如下,假如查找成功,則返回指向關鍵字為x的結點的指針,否則返回NULL。node*sqsearch(node*head,intx){node*p=head;?while(p!=NULL)? if(x>p->key) ??p=p->link;elseif(x==p->key)? ?returnp;else{p=NULL;returnp;??}}雖然鏈表中的結點是按遞增順序排列的,但是其存儲結構為單鏈表,查找結點時只能從頭指針開始逐步進行搜索,所以不能用折半查找。2.假如線性表中各結點查找概率不等,則可以使用下面的策略提高順序表的查找效率:假如找到指定的結點,則將該結點和其前趨(若存在)結點互換,使得經(jīng)常被查找的結點盡量位于表的前端。試對線性表的順序存儲結構和鏈式存儲結構寫出實現(xiàn)上述策略的順序查找算法(注意查找時必須從表頭開始向后掃描)。解:采用順序存儲結構的算法如下,設記錄存儲在線性表的1~n單元中。假如查找成功,返回關鍵字為k的記錄在線性表中的位置,假如失敗則返回0。intseqsearch(sqlistr,intn,intk){ inti,j;?i=1;?while((r[i].key?。絢)&&(i<=n)) i++;?if(i<=n){ r[0]=r[i]; r[i]=r[i-1];r[i-1]=r[i];??i--; return(i); }?else ?return(0);}采用鏈式存儲結構的算法如下。假如查找成功,則返回指向關鍵字為k的結點的指針,否則返回NULL。node*seqsearch(node*head,intk){?if(head->key==k)return(head);?else{??node*p,*q;intx;p=head; ?q=head->link;? while(q!=NULL&&q->key!=k)??{???p=q;? ?q=q->link; } if(q!=NULL){ ?x=p->key;? ?p->key=q->key; ? q->key=x; ?q=p; ?} return(q);?}}3.試設計一個在用開放地址法解決沖突的散列表上刪除一個指定結點的算法。解:本題的算法思想是:一方面計算要刪除的關鍵字為k的記錄所在的位置,將其置為空(即刪除),然后運用線性探測法查找是否有與k發(fā)生沖突而存儲到下一地址的記錄,假如有則將記錄移到本來k所在的位置,直至表中沒有與k沖突的記錄為止。實現(xiàn)本題功能的算法如下:voiddelete(sqlistr,intn,intk){inth,h0,h1;?h=k%n;?while(r[h].key!=k)? h=(h+1)%n;r[h]=NULL;?h0=h; h1=(h+1)%n;?while(h1!=h)?{while(r[h1].key%n!=h)? h1=(h1+1)%n; r[h0]=r[h1]; r[h1]=NULL; h0=h1; h1=(h1+1)%n;?}}4.設給定的散列表存儲空間為H[1~m],每個單元可存放一個記錄,H[i](1≤i≤m)的初始值為零,選取散列函數(shù)為H(R.key),其中key為記錄R的關鍵字,解決沖突方法為線性探測法,編寫一個函數(shù)將某記錄R填入到散列表H中。解:本題的算法思想:先計算地址H(R.key),假如沒有沖突,則直接填入;否則運用線性探測法求出下一地址,直到找到一個為零的地址,然后填入。實現(xiàn)本題功能的函數(shù)如下:voidinsert(recordH,intm,recordR){ inti;?i=H(R.key);?if(H[i]==NULL)? H[i]=R;else { while(H[i]!=NULL) {?? i=(i+1)%(m+1); }??H[i]=R; }}第七章一、基本知識題1.圖的邏輯結構特點是什么?什么是無向圖和有向圖?什么是子圖?什么是網(wǎng)絡?答:圖是比樹更為復雜的一種非線性數(shù)據(jù)結構,在圖結構中,每個結點都可以和其它任何結點相連接。無向圖:對于一個圖G,若邊集合E(G)為無向邊的集合,則稱該圖為無向圖。有向圖:對于一個圖G,若邊集合E(G)為有向邊的集合,則稱該圖為有向圖。子圖:設有兩個圖G=(V,E)和G’=(V’,E’),若V(G’)是V(G)的子集,且E(G’)是E(G)的子集,則稱G’是G的子圖(Subgraph)。網(wǎng)絡:有些圖,相應每條邊有一相應的數(shù)值,這個數(shù)值叫做該邊的權。邊上帶權的圖稱為帶權圖,也稱為網(wǎng)絡。2.什么是頂點的度?什么是途徑?什么是連通圖和非連通圖?什么是非連通圖的連通分量?答:頂點的度:圖中與每個頂點相連的邊數(shù),叫該頂點的度。在一個圖中,若從某頂點Vp出發(fā),沿一些邊通過頂點V1,V2,…,Vm到達,Vq,則稱頂點序列(Vp,V1,V2,…,Vm,Vq)為從Vp到Vq的途徑。在無向圖中,假如從頂點Vi到頂點Vj之間有途徑,則稱這兩個頂點是連通的。假如圖中任意一對頂點都是連通的,則稱此圖是連通圖。非連通圖的連通分量:非連通圖的每一個連通的部分叫連通分量。3.給出圖6.25所示的無向圖G的鄰接矩陣和鄰接表兩種存儲結構。答:圖G所相應的鄰接矩陣如下:圖G所相應的鄰接表如下:圖254.假設圖的頂點是A、B……請根據(jù)下面的鄰接矩陣畫出相應的無向圖或有向圖。答:(a)所相應的無向圖如下圖(a)所示,(b)所相應的有向圖如下圖(b)所示:5.5.分別給出圖6.26所示G圖的深度優(yōu)先搜索和廣度優(yōu)先搜索得到的頂點訪問序列。圖26答:深度優(yōu)先搜索得到的頂點訪問序列:0、1、3、7、8、4、9、5、6、2;?廣度優(yōu)先搜索得到的頂點訪問序列:0、1、2、3、4、5、6、7、8、9。6.應用prim算法求圖6.27所示帶權連通圖的最小生成樹。答:該圖的最小生成樹如下:????? ? ? ? 圖27?7.寫出圖6.28所示有向圖的拓樸排序序列答:該有向圖的拓樸排序序列為:3、1、4、5、2、6。二、算法設計題 ? ? ? 圖28二、算法設計題答案1.如圖6.29所示圖G,試給出其相應的鄰接表,并寫出深度優(yōu)先算法。解:該圖相應的鄰接表如下:深度優(yōu)先算法:voiddfsgraph(adjlistadj,intn)/*深度優(yōu)先遍歷整個圖*/{ inti; for(i=1;i<=n;i++) ?visited[i]=0; for(i=1;i<=n;i++)??if(!visited[i])?? dfs(adj,i);}voiddfs(adjlistadj,intv)/*以v為出發(fā)點,對圖進行dfs遍歷*/{structedgenode*p;visited[v]=1;printf("%d",v);p=adj[v]→link;while(p!=NULL){if(visited[p→adjvex]==0)?? dfs(adjlist,p→adjvex);??p=p→next;?}}2.如圖6.29所示圖G,試給出其相應的鄰接矩陣,并寫出廣度優(yōu)先算法。解:該圖相應的鄰接矩陣如下:廣度優(yōu)先算法:voidbfsgraph(intadjarray[n][n],intn)/*廣度優(yōu)先遍歷整個圖*/{?inti;?for(i=0;i<n;i++)??visited[i]=0;?for(i=0;i<n;i++) 圖29? if(!visited[i]) bfs(adjarray,i);}voidbfs(intadjarray[][],intv)/*以v為出發(fā)點,對圖進行bfs遍歷*/{ inti,j; queueq;?printf("%d",v);?visited[v]=1;?enqueue(&q,v); while(!queueemty(&q))?{ ?i=dequeue(&q);for(j=0;j<n;j++)? if(adjarray[i][j]==1&&?。鰅sited[j]) ? {??? printf("%d",j);?? ?visited[j]=1;????enqueue(&q,j);? }?}}3.編寫一個函數(shù)通過與用戶交互建立一個有向圖的鄰接表。解:實現(xiàn)本題功能的算法如下:voidcreategraph(adjlistg){?inte,i,s,d,n;structedgenode*p; printf("請輸入結點數(shù)(n)和邊數(shù)(e):\n"); scanf("%d,%d",&n,&e); for(i=1;i<=n;i++){printf("\n請輸入第%d個頂點信息:",i);scanf("%c",&g[i].data);g[i].link=NULL;?} for(i=1;i<=e;i++)?{printf("\n請輸入第%d條邊起點序號,終點序號:",i);??scanf("%d,%d",&s,&d);? p=(structedgenode*)malloc(sizeof(edgenode));? p→adjvex=d; p→next=g[s].link;? g[s].link=p;?}}4.編寫一個無向圖的鄰接矩陣轉換成鄰接表的算法。解:本題的算法思想是:逐個掃描鄰接矩陣的各個元素,如第i行第j列的元素為1,則相應的鄰接表的第i個單鏈表上增長一個j結點。實現(xiàn)本題功能的算法如下:voidtransform(intadjarray[n][n],adjlistadj){?inti,j;?edgenode*p; for(i=0;i<n;i++) {??adj[i].dat(yī)a=i;adj[i].link=NULL;}for(i=0;i<n;i++) for(j=0;j<n;j++) ?{if(adjarray[i][j]==1)???{p=(edgenode*)malloc(sizeof(edgenode));? p→adjvex=j;? ?p→next=adj[i].link; ? adj[i].link=p;?? } }}5.已知一個有n個頂點的有向圖的鄰接表,設計算法分別實現(xiàn)1)求出圖中每個頂點的出度。2)求出圖中每個頂點的入度。3)求出圖中出度最大的一個頂點,輸出其頂點序號。4)計算圖中出度為0的頂點個數(shù)。解:(1)本題的算法思想是:計算出鄰接表中第i個單鏈表的結點數(shù),即為i頂點的出度。求頂點的出度數(shù)的算法如下:intoutdegree(adjlistadj,intv){intdegree=0; edgenode*p; p=adj[v].link;?while(p!=NULL)?{degree++;p=p->next;?}returndegree;}voidprintout(adjlistadj,intn){?inti,degree;?printf("Theoutdegreesare:\n"); for(i=0;i<n;i++)?{?degree=outdegree(adj,i); ?printf("(%d,%d)",i,degree); }}(2)本題的算法思想是:計算出整個鄰接表中所具有的結點為i的結點數(shù),這就是i頂點的入度。求頂點的入度數(shù)的算法:intindegree(adjlistadj,intn,intv){ inti,j,degree;?edgenode*p; for(i=0;i<n;i++)?{ ?p=adj[i].link; ?while(p!=NULL){ ? if(p->adjvex==v) ?degree++;? ?p=p->next;? } }?returndegree;}voidprintin(adjlistadj,intn){ inti,degree; printf("Theindegreesare:\n"); for(i=0;i<n;i++) {?degree=indegree(adj,n,i); printf("(%d,%d)",i,degree); }}(3)求最大出度的算法:voidmaxoutdegree(adjlistadj,intn){ intmaxdegree=0,maxv=0,degree,i;?for(i=0;i<n;i++)?{??degree=outdegree(adj,i);if(degree>maxdegree) {???maxdegree=degree; ? maxv=i; ?} } printf("maxoutdegree=%d,maxvertex=%d",maxdegree,maxv);}(4)求出度數(shù)為0的頂點數(shù)的算法:intoutzero(adjlistadj,intn){ intnum=0,i; for(i=0;i<n;i++) { ?if(outdegree(adj,i)==0)???num++;?} returnnum;}第六章一、基礎知識題1.就如圖5.21所示的樹回答下面問題:1)哪個是根結點?2)哪些是葉子結點?3)哪個是E的父結點?4)哪些是E的子孫結點?5)哪些是E的兄弟結點?哪些是C的兄弟結點?6)結點B和結點I的層數(shù)分別是多少?7)樹的深度是多少?8)以結點G為根的子樹的深度是多少?9)樹的度是多少?答:1)A是根結點2)D、H、I、J、F、G是葉子結點3)B是E的父結點4)H、I、J是E的子孫結點5)D是E的兄弟結點,B是C的兄弟結點6)B的層數(shù)是2,I的層數(shù)是47)樹的深度是48)以結點G為根的子樹的深度是19)樹的度是32.分別畫出含3個結點的樹與二叉樹的所有不同形態(tài)。答:3個結點的樹: 3個結點的二叉樹:3.高度為h的完全二叉樹至少有多少個結點?最多有多少個結點?答:高度為h的完全二叉樹至少有個結點,最多有個結點。4.采用順序存儲方法和鏈式存儲方法分別畫出圖5.22所示二叉樹的存儲結構。答:該二叉樹的順序存儲:該二叉樹的鏈式存儲:5.分別寫出圖5.22所示二叉樹的前序、中序和后序遍歷序列。圖22答:先序遍歷序列:1、2、4、7、3、5、8、6、9中序遍歷序列:7、4、2、1、8、5、3、6、9后序遍歷序列:7、4、2、8、5、9、6、3、16.若二叉樹中各結點值均不相同。1)已知一個二叉樹的中序和后序遍歷序列分別為GDHBAECIF和GHDBEIFCA,請畫出此二叉樹。2)已知一個二叉樹的前序和中序分別為ABCDEFGH和BDCEAFHG,請畫出此二叉樹。答:7.一個二叉樹如圖5.23所示,分別寫出其前序、中序、后序的遍歷序列。答:先序遍歷序列:A、B、D、E、F、C、G中序遍歷序列:D、F、E、B、A、G、C后序遍歷序列:F、E、D、B、G、C、A8.輸入一個正整數(shù)序列{55,34,18,88,119,11,76,9,97,99,46},試構造一個二叉排序樹。9.有一份電文中共使用5個字符:a、b、c、d、e,它們的出現(xiàn)頻率依次為5、2、1、6、4。試畫出相應的哈夫曼樹,并求出每個字符的哈夫曼編碼。第8題 各字符相應的哈夫曼編碼如下:a:10,b:001,c:000,d:11,e:01二、算法設計題答案1.一個二叉樹以鏈式結構存儲,分別給出求二叉樹結點總數(shù)和葉子結點總數(shù)的算法。解:求二叉樹結點總數(shù)的算法如下:intCountNode(btree*t,intnum)/*num初值為0*/{if(t!=NULL)?{num++;??num=CountNode(t->left,num);??num=CountNode(t->right,num); }?returnnum;}求二叉樹葉子結點總數(shù)的算法如下:intCountLeaf(btree*t,intnum)/*num初值為0*/{if(t!=NULL)?{if(t->left==NULL&&t->right==NULL) ? num++;? num=CountLeaf(t->left,num);??num=CountLeaf(t->right,num);?} returnnum;}2.2.一個二叉樹以鏈式結構存儲,寫出在二叉樹中查找值為x的結點的算法。解:本題可以用先序、中序和后序遍歷中的任意一種遍歷,只要將遍歷算法中的訪問根結點改為判斷其值是否等于x。下面是用中序遍歷求解的算法,函數(shù)返回值為x的結點的地址,若沒有找到則返回空。btree*search(btree*t,intx,btreep)/*p的初值為NULL*/{ if(t!=NULL){ p=search(t->left,x,p); ?if(t->dat(yī)a==x)???p=t;/*找到x的地址放在p中*/? p=search(t->right,x,p);?}returnp;}3.設計一個算法將一個以鏈式存儲結構的二叉樹,按順序方式存儲到一維數(shù)組中。解:這是一個遞歸算法,如下:voidcreate(btree*t,inttree[],inti){ if(t!=NULL) { ?tree[i]=t->data; create(t->left,tree,2*i); ?creat(yī)e(t->right,tree,2*i+1); }}4.假設二叉排序樹t的各元素值均不相同,設計一個算法按遞增順序打印各元素值。解:按中序序列遍歷二叉排序樹即按遞增順序遍歷,所以遞增打印二叉排序樹各元素值的函數(shù)如下:voidinorder(btree*t){?if(t!=NULL) {??inorder(t->left); ?printf("%d",t->data);??inorder(t->right); }}5.已知一個中序線索二叉樹,試編寫中序遍歷的非遞歸算法。解:在中序線索二叉樹中進行非遞歸中序遍歷,只要從頭結點出發(fā),反復找到結點的后繼,直至結束即可。在中序線索二叉樹中求結點后繼的算法如下:tbtree*succ(tbtree*p){ btree*q; if(p->rtag==1) return(p->right);else?{ q=p->right;? while(q->ltag==0) ?q=q->left; return(q);?}}由此得到中序遍歷線索二叉樹的非遞歸算法如下:voidthinorder(tbtree*p){if(p!=NULL) {while(p->ltag==0) ??p=p->left;? do{???printf("%d",p->data); ??p=succ(p); }while(p!=NULL);?}}第五章A[10][20]采用列為主序存儲,每個元素占1個單元,A[0][0]的地址為200,則A[6][12]的地址是多少?3262.稀疏矩陣m×n采用三元組順序表存儲結構,非零元個數(shù)tu滿足什么條件時,該存儲結構才故意義?tu<m*n/33.二維數(shù)組A[10..20][5..10]采用行為主序存儲,每個元素占4個單元,A[10][5]的地址為1000,則A[18][9]的地址是多少?(1208)4.稀疏矩陣的三元組順序表存儲結構是隨機存儲結構嗎?為什么?(不是)5.廣義表((a,b,c,d))的表頭和表尾分別是什么?((a,b,c,d);空表)6.廣義表((a),((b),c),(((d))))的長度和深度分別是多少?(3,4)第一章數(shù)據(jù)物理結構算法二、簡答一、名詞解釋數(shù)據(jù):就是一切可以由計算機接受和解決的對象。數(shù)據(jù)項:是數(shù)據(jù)的不可分割的最小單位,在有些場合下,數(shù)據(jù)項又稱為字段或域。數(shù)據(jù)元素:是數(shù)據(jù)的基本單位,在程序中作為一個整體加以考慮和解決,也稱為元素、頂點或記錄。它可以由若干個數(shù)據(jù)項組成。數(shù)據(jù)結構:指的是數(shù)據(jù)之間的互相關系,即數(shù)據(jù)的組織形式,它涉及數(shù)據(jù)的邏輯結構、數(shù)據(jù)的存儲結構和數(shù)據(jù)的運算三個方面的內(nèi)容。數(shù)據(jù)邏輯結構:是指數(shù)據(jù)元素之間的邏輯關系,是從邏輯上描述數(shù)據(jù),與數(shù)據(jù)的存儲無關,獨立于計算機。數(shù)據(jù)物理結構:是指數(shù)據(jù)元素及其關系在計算機存儲器內(nèi)的表達,是數(shù)據(jù)的邏輯結構用計算機語言的實現(xiàn),是依賴于計算機語言的。算法:是對特定問題求解環(huán)節(jié)的一種描述。它是一個有窮的規(guī)則序列,這些規(guī)則決定了解決某一特定問題的一系列運算。由此問題相關的一定輸入,計算機依照這些規(guī)則進行計算和解決,通過有限的計算環(huán)節(jié)后能得到一定的輸出。算法的時間復雜性:是該算法的時間花費,它是該算法所求解問題規(guī)模n的函數(shù)。當n趨向無窮大時,我們把時間復雜性T(n)的數(shù)量級稱為算法的漸進時間復雜性。二、簡答題1.算法分析的目的是什么?答:對算法進行分析的目的有兩個:第一個目的是可以從解決同一問題的不同算法中區(qū)分相對優(yōu)劣,選出較為合用的一種;第二個目的是有助于設計人員考慮對現(xiàn)有算法進行改善或設計出新的算法。2.什么是算法的最壞和平均時間復雜性?答:算法的最壞時間復雜性是研究各種輸入中運算最慢的一種情況下的運算時間;平均時間復雜性是研究同樣的n值時各種也許的輸入,取它們運算時間的平均值。三、答案1.三、分析下列算法的時間復雜性:1.sum=0;for(i=1;i<=n;i++){sum=sum+i;}答:該程序段的時間復雜性為T(n)=O(n)。2.2.i=1;while(i<=n)i=i*10;1*10for(j=0;j<n;j++)答:該程序段的時間復雜性T(n)=O(log10n)。3.3.sum=0;for(i=0;i<n;i++)???sum=sum+Array[i][j];答:該程序段的時間復雜性(n)=O(n2)。第二章一、基礎知識題一、基本知識題答案1.1.試比較順序表與鏈表的優(yōu)缺陷。的操作。答:順序表用結點物理位置的相鄰性來反映結點間的邏輯關系,其優(yōu)點是:節(jié)省存儲、隨機存取,當表長變化較小,重要操作是進行查找時,宜采用順序表。鏈表用附加的指針來反映結點間的邏輯關系,插入和刪除操作相對比較方便,當表長變化較大,重要操作是進行插入和刪除時,宜采用鏈表。2.2.試分析單鏈表與雙鏈表的優(yōu)缺陷。答:雙鏈表比單鏈表多增長了一個指針域以指向結點的直接前趨,它是一種對稱結構,因此在已知某個結點之前或之后插入一個新結點、刪除該結點或其直接后繼都同樣方便,操作的時間復雜度為O(1);而單鏈表是單向結構,對于找一個結點的直接前趨的操作要從開始結點找起,其時間復雜度為O(n)。3.3.為什么在單循環(huán)鏈表中設立尾指針比設立頭指針更好?答:由于對表的操作經(jīng)常在表的兩端進行,所以對單循環(huán)鏈表,當知道尾指針rear后,其另一端的頭指針是rear->next->next(表中帶頭結點)。這會使操作變的更加容易。4.4.寫出在循環(huán)雙鏈表中的p所指結點之后插入一個s所指結點答:s->prior=p;s->next=p->next;p->next->prior=s;p->next=s;5.5.寫出在單鏈表中的p所指結點之前插入一個s所指結點的操作。答:s->next=p->next;p->next=s;temp=p->data;p->data=s->dat(yī)a;s->data=temp;6.6.請運用鏈表來表達下面一元多項式A(x)=4*x^11+9*x^8+11*x^3+8*x+7答:多項式A(x)用鏈表表達如下:head_A-->4,11-->9,8--.11,3-->8,1-->7,0^二、算法設計題答案1.1.有一個有n個結點的單鏈表,設計一個函數(shù)將第i-1個結點與第i個結點互換,但指針不變。解:本題的算法思想是:要使結點互換而指針不變,只要將兩個結點的數(shù)據(jù)進行互換即可。實現(xiàn)本題功能的函數(shù)如下:voidexchange(node*head,inti,n){?node*p,*q;?intdata; if(i>n)? printf("error!\n");else?{ p=head;??for(intj=1;j<i;j++) p=p->next;?q=p->next;?data=q->data;?q->dat(yī)a=p->data; p->dat(yī)a=data; }}2.2.設計一個函數(shù),查找單鏈表中數(shù)值為x的結點。解:實現(xiàn)本題功能的函數(shù)如下:voidsearch(node*head,intx){?node*p;?p=head; while(p->data!=x&&p!=NULL)? p=p->next;?if(p!=NULL)??printf("結點找到了!\n");?else ?printf("結點未找到!\n");}3..已知一個單鏈表,編寫一個刪除其值為x的結點的前趨結點的算法。解:本題的算法思想是:先找到值為x的結點*p和它的前趨結點*q,要刪除*q,只需把*p的值x放到*q的值域中,再刪除結點*p即可。實現(xiàn)本題功能的函數(shù)如下:voiddelete(node*head,intx){node*p,*q; q=head;?p=head->next;?while((p!=NULL)&&(p->data!=x)){q=p;?p=p->next;}?if(p==NULL) ?printf("未找到x!\n");elseif(q==head)? printf("x為第一個結點,無前趨!\n");else{ q->data=x; q->next=p->next; free(p);}}4.4.已知一個單鏈表,編寫一個函數(shù)從此單鏈表中刪除自第i個元素起的length個元素。解:實現(xiàn)本題功能的函數(shù)如下:voiddeletelength(node*head,inti,intlength){node*p,*q;?intj; if(i==1) for(j=1;j<=length;j++)/*刪除前k個元素*/??{p=head;/*p指向要刪除的結點*/ head=head->next;?? free(p);? }?else解:實現(xiàn)本題功能的函數(shù)如下:voiddeletelength(node*head,inti,intlength){node*p,*q;?intj;?if(i==1) ?for(j=1;j<=length;j++)/*刪除前k個元素*/? {p=head;/*p指向要刪除的結點*/ ? head=head->next;???free(p);??} else{p=head; ?for(j=1;j<=i-2;j++) p=p->next;/*p指向要刪除的結點的前一個結點*/??for(j=1;j<=length;j++)? { ?q=p->next;/*q指向要刪除的結點*/?? p->next=q->next; ?free(q);? } }}5.已知一個遞增有序的單鏈表,編寫一個函數(shù)向該單鏈表中插入一個元素為x的結點,使插入后該鏈表仍然遞增有序。解:本題算法的思想是:先建立一個待插入的結點,然后依次與鏈表中的各結點的數(shù)據(jù)域比較大小,找到插入該結點的位置,然后插入該結點。實現(xiàn)本題功能的函數(shù)如下:voidinsert(node*head,intx){ node*s,*p,*q;?s=(node*)malloc(sizeof(node));/*建立一個待插入的結點*/ s->data=x; s->next=NULL;if(head==NULL||x<head->dat(yī)a)/*若單鏈表為空或x小于第一個結點data域*/{ s->next=head;/*插入到表頭后面*/ head=s; } else?{ q=head;? p=q->next; ?while(p!=NULL&&x>p->data){ ??q=p; ??p=p->next; ?}??s->next=p;/*插入結點*/??q->next=s;?}}6.已知一個單鏈表,編寫一個函數(shù)將此單鏈表復制一個拷貝。解:本題算法的思想是依次查找原單鏈表(其頭指針為head1)中的每個結點,對每個結點復制一個新結點并鏈接到新的單鏈表(其頭指針為head2)中。實現(xiàn)本題功能的函數(shù)如下:voidcopy(node*head1,node*head2){?node*p,*q,*s;?head2=(node*)malloc(sizeof(node));?q=head2;q->data=head1->data;p=head1->next; while(p!=NULL) {? s=(node*)malloc(sizeof(node));??s->data=p->data;??q->next=s; q=s;? p=p->next;?} q->next=NULL;}7.有一個共10個結點的單鏈表,試設計一個函數(shù)將此單鏈表分為兩個結點數(shù)相等的單鏈表。解:本題的算法思想是:在原單鏈表一半處將其分開,第5個結點的next域置為空,為第一個單鏈表的表尾。第二個單鏈表的表頭指針指向原單鏈表的第6個結點。實現(xiàn)本題功能的函數(shù)如下,函數(shù)返回生成的第二個單鏈表的表頭指針,第一個單鏈表仍然使用原單鏈表的表頭指針。node*divide(node*head1){ node*head2,*prior; head2=head1;?for(inti=1;i<=5;i++) { prior=head2;?head2=head2->next; } prior->next=NULL;?returnhead2;}8.與上題相同的單鏈表,設計一個函數(shù),將此單鏈表提成兩個單鏈表,規(guī)定其中一個仍以原表頭指針head1作表頭指針,表中順序涉及原線性表的第一、三等奇數(shù)號結點;另一個鏈表以head2為表頭指針,表中順序涉及原單鏈表第二、四等偶數(shù)號結點。解:本題算法的思想是將第一個鏈表中的所有偶數(shù)序號的結點刪除,同時把這些結點鏈接起來構成第二個單鏈表。實現(xiàn)本題功能的函數(shù)如下:voidsplit(node*head1,node*head2){ node*temp,*odd,*even;?odd=head1; head2=head1->next; temp=head2;while(odd!=NULL&&odd->next!=NULL) { ?even=odd->next;/*even指向偶數(shù)序號的結點*/??odd->next=even->next; ?temp->next=even;? temp=even;? odd=odd->next;/*odd指向奇數(shù)序號的結點*/ } even->next=NULL;}9.已知一個指針p指向單循環(huán)鏈表中的一個結點,編寫一個對此單循環(huán)鏈表進行遍歷的算法。解:本題的算法思想是:由于是單循環(huán)鏈表,所以只要另設一指針q指向p用來幫助判斷是否已經(jīng)遍歷一遍即可。實現(xiàn)本題功能的函數(shù)如下:voidtravel(node*p){node*q=p;?while(q->next!=p) { printf("%4d",q->data);? q=q->next; }?printf("%4d",q->data);}10.已知一個單循環(huán)鏈表,編寫一個函數(shù),將所有箭頭方向取反。解:本題算法的思想是:從頭到尾掃描該循環(huán)鏈表,將第一個結點的next域置為NULL,將第二個結點的next域指向第一個結點,如此直到最后一個結點,便用head指向它。由于是循環(huán)鏈表,所以鑒定最后一個結點時不能用p->next=NULL作為條件,而是用q指向第一個結點,以p!=q作為條件。實現(xiàn)本題功能的函數(shù)如下:voidinvert(node*head){?node*p,*q,*r;p=head;q=p->next;?while(p!=q) {??r=head;? while(r->next!=p) ? r=r->next;??p->next=r;? p=p->next;?} q->next=head;}11.在雙鏈表中,若僅知道指針p指向某個結點,不知頭指針,能否根據(jù)p遍歷整個鏈表?若能,試設計算法實現(xiàn)。解:能。本題的算法思想是:分別從p開始沿著next以及prior向右、向左掃描直至各自的鏈為空即可遍歷整個鏈表。實現(xiàn)本題功能的函數(shù)如下:voidtravellist(node*p){node*q;?q=p;?while(q?。絅ULL)?{ printf("%4d",q->data); q=q->next;?}q=p->prior; while(q!=NULL)?{??printf("%4d",q->data);??q=q->prior;?}}12.試編寫一個在循環(huán)雙向鏈表中進行刪除操作的算法,規(guī)定刪除的結點是指定結點p的前趨結點。解:實現(xiàn)本題功能的算法如下:voiddeleteprior(node*p){ node*pri,q;?pri=p->prior;?q=pri->prior;?if(pri==p) ?printf("p結點無前趨!\n");第三章二、算法設計題習題解答(3)一、基本知識題答案1.什么是棧?什么是隊列?它們各自的特點是什么?答:棧是限定在表的一端進行插入或刪除操作的線性表;隊列是元素的添加在表的一端進行,而元素的刪除在表的另一端進行的線性表;棧的特點是后進先出,隊列的特點是先進先出。2.線性表、棧、隊列有什么異同?答:棧和隊列都是線性表,但是是受限的線性表,對插入、刪除運算加以限制。棧是只允許在一端進行插入、刪除運算,因而是后進先出表;而隊列是只允許在一端進行插入、另一端進行刪除運算,因而是先進先出表。3.簡述棧的入棧、出棧操作的過程。答:棧的入棧、出棧操作均在棧頂進行,棧頂指針指向棧頂元素的下一個位置。入棧操作先將入棧元素放到棧頂指針所指示的位置上,然后將棧頂指針加1。出棧操作先將棧頂指針減1,然后從棧頂指針指向位置取值。4.在循環(huán)隊列中簡述入隊、出隊操作的過程。答:在循環(huán)隊列中,設隊首指針指向隊首元素,隊尾指針指向隊尾元素后的一個空閑元素。在隊列不滿時,可執(zhí)行入隊操作,此時先送值到隊尾指針指向的空閑元素,隊尾指針再加1(要取模)。在隊列不空時,可執(zhí)行出隊操作,此時先從隊首指針指向處取值,隊首指針再加1(要取模)。二、算法設計題答案1.設用一維數(shù)組stack[n]表達一個堆棧,若堆棧中一個元素需占用length個數(shù)組單元(length>1),試寫出其入棧、出棧操作的算法。解:用一整型變量top表達棧頂指針,top為0時表達棧為空。假如棧不空,則從stack[1]開始存放元素。實現(xiàn)本題功能的函數(shù)如下:入棧算法:voidPush(EleTypex){ if((top+length)>n) printf("上溢出\n");?else{?if(top==0)/*為空棧*/{ top++;???stack[top]=x;? } else? {?? top=top+length;? ?stack[top]=x; }?}}出棧算法:voidPop(EleTypex){?if(top==0) printf("為空棧\n"); else?{??if(top==1) { x=stack[top];top--;??} else??{ x=stack[top]; ??top=top-length; }?}}2.試編寫一個遍歷及顯示隊列中元素的算法。解:設表達式在字符數(shù)組a[]中,使用一堆棧S來幫助判斷。實現(xiàn)本題功能的函數(shù)如下:intcorrect(chara[]){StackS; InitStack(S);?for(i=0;i<strlen(a);i++)??if(a[i]=='(')?? Push(S,'(');? elseif(a[i]==')'){? ?if(StackEmpty(S)) ??return0; else ??Pop(S);? } if(StackEmpty(S)) return1;/*配對對的*/ ?elsereturn0;/*配對錯誤*/}3.設一循環(huán)隊列Queue,只有頭指針front,不設尾指針,另設一個內(nèi)含元素個數(shù)的計數(shù)器,試寫出相應的入隊、出隊算法。解:實現(xiàn)本題功能的函數(shù)如下:voidtravel(Queue,intfront,rear){?inti; for(i=front;i<=rear;i++){? printf("%4d",Queue[i]);?}}4.設計一算法能判斷一個算術表達式中的圓括號配對是否對的。(提醒:對表達式進行掃描,凡碰到“(”就進棧,碰到“)”就退出棧頂?shù)摹?”,表達式掃描完畢時棧若為空則圓括號配對對的。)解:用一個循環(huán)數(shù)組Queue[0,n-1]表達該循環(huán)隊列,頭指針為front,計數(shù)器count用來記錄隊列中結點的個數(shù)。入隊算法如下:voidenqueue(intx){?inttemp; if(count==n) ?printf("隊列上溢出\n");?else{ ?count++;??temp=(front+count)%n; Queue[temp]=x; }}出隊算法如下:intdequeue(){inttemp;if(count==0) printf("隊列下溢出\n"); else {temp=Queue[front]; front=(front+1)%n;count--; ?returntemp;?}}數(shù)據(jù)結構(本科)期末綜合練習一(單選題)單選題1.一個數(shù)組元素a[i]與(A)的表達等價。A.*(a+i)B.a+iC.*a+iD.&a+i2.若需要運用形參直接訪問實參,則應把形參變量說明為(B)參數(shù)。A.指針B.引用C.傳值D.常值3.下面程序段的時間復雜度為(C)。for(inti=0;i<m;i++)for(intj=0;j<n;j++)a[i][j]=i*j;A.O(m2)B.O(n2)C.O(m*n)D.O(m+n)4.執(zhí)行下面程序段時,執(zhí)行S語句的次數(shù)為(D)。for(inti=1;i<=n;i++)for(intj=1;j<=i;j++)S;A.n2B.n2/2C.n(n+1)D.n(n+1)/25.下面算法的時間復雜度為(B)。intf(unsignedintn){if(n==0||n==1)return1;elsereturnn*f(n-1);}A.O(1)B.O(n)C.O(n2)D.O(n!)6.一種抽象數(shù)據(jù)類型涉及數(shù)據(jù)和(B)部分。A.數(shù)據(jù)類型B.操作C.數(shù)據(jù)抽象D.類型說明7.當一個作為實際傳遞的對象占用的存儲空間較大并也許被修改時,應最佳說明為(B),以節(jié)省參數(shù)值的傳輸時間和存儲參數(shù)的空間。A.基本類型B.引用型C.指針型D.常值引用型8.當需要進行標準I/O操作時,則應在程序文獻中包含iostream.h頭文獻,當需要進行文獻I/O操作時,則應在程序文獻中包含(A)頭文獻。A.fstream.hB.stdlib.hC.iomanip.hD.string.h9.一個記錄r理論上占有的存儲空間的大小等于所有域類型長度之和,事實上占有的存儲空間的大小即記錄長度為(D)。A.所有域長度之和B.最大域所占字節(jié)長度C.任意一個域長度D.sizeof(r)的值10.輸出一個二維數(shù)組b[m][n]中所有元素值的時間復雜度為(D)。A.O(n)B.O(m+n)C.O(n2)D.O(m*n)11.一個算法的時間復雜度為(3n2+2nlog2n+4n-7)/(5n),其數(shù)量級形式的復雜度表達為(A)。A.O(n)B.O(nlog2n)C.O(n2)D.O(log2n)12.某算法的時間代價為T(n)=100n+10nlog2n+n2+10,其時間復雜度為(C)。A.O(n)B.O(nlog2n)C.O(n2)D.O(1)13.某算法僅含程序段1和程序段2,程序段1的執(zhí)行次數(shù)3n2,程序段2的執(zhí)行次數(shù)為0.01n3,則該算法的時間復雜度為(C)。A.O(n)B.O(n2)C.O(n3)D.O(1)14.以下說法錯誤的是(C)。A.抽象數(shù)據(jù)類型具有封裝性。B.抽象數(shù)據(jù)類型具有信息隱蔽性。C.使用抽象數(shù)據(jù)類型的用戶可以自己定義對抽象數(shù)據(jù)類型中數(shù)據(jù)的各種操作。D.抽象數(shù)據(jù)類型的一個特點是使用與實現(xiàn)分離。15.在二維數(shù)組中,每個數(shù)組元素同時處在(C)個向量中。A.0個? B.1個??C.2個 D.n個16.多維數(shù)組事實上是由嵌套的(A)實現(xiàn)的。A.一維數(shù)組B.多項式C.三元組表D.簡樸變量17.在一個長度為n的順序表中順序搜索一個值為x的元素時,在等概率的情況下,搜索成功時的數(shù)據(jù)平均比較次數(shù)為(C)。A.nB.n/2C.(n+1)/2D.(n-1)/218.在一個長度為n的順序表中向第i個元素(0≤i≤n-1)位置插入一個新元素時,需要從后向前依次后移(A)個元素。A.n-iB.n-i+1C.n-i-1D.i19.在一個長度為n的順序表中刪除第i個元素(0≤i≤n-1)時,需要從前向后依次前移(C)個元素。

溫馨提示

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

評論

0/150

提交評論