版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目錄
第1章緒論....................................................................2
第2章線性表...................................................................8
第3章特殊線性表——棧、隊列和串............................................16
第4章廣義線性表——多維數(shù)組和廣義表........................................23
第5章樹和二叉樹.............................................................27
第6章圖......................................................................37
第7章查找技術(shù)...............................................................45
第8章排序技術(shù)...............................................................53
第9章索引技術(shù)...............................................................61
第1章緒論
課后習(xí)題講解
1.填空
(1)()是數(shù)據(jù)的基本單位,在計算機(jī)程序中通常作為一個整體進(jìn)行考慮和處理。
【解答】數(shù)據(jù)元素
⑵()是數(shù)據(jù)的最小單位,()是討論數(shù)據(jù)結(jié)構(gòu)時涉及的最小數(shù)據(jù)單位。
【解答】數(shù)據(jù)項,數(shù)據(jù)元素
【分析】數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)元素以及數(shù)據(jù)元素之間的關(guān)系。
⑶從邏輯關(guān)系上講,數(shù)據(jù)結(jié)構(gòu)主要分為()、()、()和()。
【解答】集合,線性結(jié)構(gòu),樹結(jié)構(gòu),圖結(jié)構(gòu)
(4)數(shù)據(jù)的存儲結(jié)構(gòu)主要有()和()兩種基本方法,不論哪種存儲結(jié)構(gòu),都要存儲兩方
面的內(nèi)容:()
和(),
【解答】順序存儲結(jié)構(gòu),鏈接存儲結(jié)構(gòu),數(shù)據(jù)元素,數(shù)據(jù)元素之間的關(guān)系
⑸算法具有五個特性,分別是()、()、()、()、()。
【解答】有零個或多個輸入,有一個或多個輸出,有窮性,確定性,可行性
(6)算法的描述方法通常有()、()、()和()四種,其中,()被稱為算法語言。
【解答】自然語言,程序設(shè)計語言,流程圖,偽代碼,偽代碼
⑺在一般情況下,一個算法的時間復(fù)雜度是()的函數(shù)。
【解答】問題規(guī)模
⑻設(shè)待處理問題的規(guī)模為n,若一個算法的時間復(fù)雜度為一個常數(shù),則表示成數(shù)量級的形
式為(),若
為n*log25n,則表示成數(shù)量級的形式為()。
【解答】0(1),O(nlog2n)
【分析】用大0記號表示算法的時間復(fù)雜度,需要將低次第去掉,將最高次嘉的系數(shù)去掉。
2.選擇題
(1)順序存儲結(jié)構(gòu)中數(shù)據(jù)元素之間的邏輯關(guān)系是由()表示的,鏈接存儲結(jié)構(gòu)中的數(shù)據(jù)元素
之間的邏輯關(guān)
系是由()表示的。
A線性結(jié)構(gòu)B非線性結(jié)構(gòu)C存儲位置D指針
【解答】C,D
【分析】順序存儲結(jié)構(gòu)就是用一維數(shù)組存儲數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)元素,其邏輯關(guān)系由存儲位置
(即元素在數(shù)
組中的下標(biāo))表示;鏈接存儲結(jié)構(gòu)中個數(shù)據(jù)元素對應(yīng)鏈表中的一個結(jié)點(diǎn),元素之間的邏輯
關(guān)系由結(jié)點(diǎn)中
的指針表示。
⑵假設(shè)有如下遺產(chǎn)繼承規(guī)則:丈夫和妻子可以相互繼承遺產(chǎn);子女可以繼承父親或母親的
遺產(chǎn);子女間不
能相互繼承。則表示該遺產(chǎn)繼承關(guān)系的最合適的數(shù)據(jù)結(jié)構(gòu)應(yīng)該是()。
A樹B圖C線性表D集合
【解答】B
【分析】將丈夫、妻子和子女分別作為數(shù)據(jù)元素,根據(jù)題意畫出邏輯結(jié)構(gòu)圖。
⑶算法指的是()。
A對特定問題求解步驟的一種描述,是指令的有限序列。
B計算機(jī)程序C解決問題的計算方法D數(shù)據(jù)處理
【解答】A
【分析】計算機(jī)程序是對算法的具體實現(xiàn);簡單地說,算法是解決問題的方法;數(shù)據(jù)處理是
通過算法完成
的。所以,只有A是算法的準(zhǔn)確定義。
(4)下面()不是算法所必須具備的特性。
A有窮性B確切性C高效性D可行性
【解答】C
【分析】高效性是好算法應(yīng)具備的特性。
⑸算法分析的目的是(),算法分析的兩個主要方面是()。
A找出數(shù)據(jù)結(jié)構(gòu)的合理性B研究算法中輸入和輸出的關(guān)系
C分析算法的效率以求改進(jìn)D分析算法的易讀性和文檔性
E空間性能和時間性能F正確性和簡明性
G可讀性和文檔性H數(shù)據(jù)復(fù)雜性和程序復(fù)雜性
【解答】C,E
3.判斷題
⑴算法的時間復(fù)雜度都要通過算法中的基本語句的執(zhí)行次數(shù)來確定。
【解答】錯。時間復(fù)雜度要通過算法中基本語句執(zhí)行次數(shù)的數(shù)量級來確定。
⑵每種數(shù)據(jù)結(jié)構(gòu)都具備三個基本操作:插入、刪除和查找。
【解答】錯。如數(shù)組就沒有插入和刪除操作。此題注意是每種數(shù)據(jù)結(jié)構(gòu)。
⑶所謂數(shù)據(jù)的邏輯結(jié)構(gòu)指的是數(shù)據(jù)之間的邏輯關(guān)系。
【解答】錯。是數(shù)據(jù)之間的邏輯關(guān)系的整體。
(4)邏輯結(jié)構(gòu)與數(shù)據(jù)元素本身的內(nèi)容和形式無關(guān)。
【解答】對。因此邏輯結(jié)構(gòu)是數(shù)據(jù)組織的主要方面。
⑸基于某種邏輯結(jié)構(gòu)之上的基本操作,其實現(xiàn)是唯一的。
【解答】錯?;静僮鞯膶崿F(xiàn)是基于某種存儲結(jié)構(gòu)設(shè)計的,因而不是唯一-的。
4.分析以下各程序段,并用大0記號表示其執(zhí)行時間。
【解答】⑴基本語句是k=基本*i,共執(zhí)行了n-2次,所以T(n)=O(n).
⑵基本語句是k=k+10*i,共執(zhí)行了n次,所以T(n)=O(n)。
⑶分析條件語句,每循環(huán)一次,i+j整體加1,共循環(huán)n次,所以T(n)=O(n)。
(4)設(shè)循環(huán)體共執(zhí)行T(n)次,每循環(huán)一次,循環(huán)變量y加1,最終T(n)=v,即:
(T(n)+l)2Wn,所以T(n)=O(n1/2)。
⑸x++是基本語句,所以
5.設(shè)有數(shù)據(jù)結(jié)構(gòu)(D,R),其中D={1,2,3,4,5,6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。
試畫出其邏輯結(jié)構(gòu)圖并指出屬于何種結(jié)構(gòu)。
【解答】其邏輯結(jié)構(gòu)圖如圖1-3所示,它是一種圖結(jié)構(gòu)。
6.為整數(shù)定義?個抽象數(shù)據(jù)類型,包含整數(shù)的常見運(yùn)算,每個運(yùn)算對應(yīng)?個基本操作,每
個基本操作的接
口需定義前置條件、輸入、功能、輸出和后置條件。
【解答】整數(shù)的抽象數(shù)據(jù)類型定義如下:
ADTinteger
Data
整數(shù)a:可以是正整數(shù)(1,2,3,…)、負(fù)整數(shù)(口23…)和零
Operation
Constructor
前置條件:整數(shù)a不存在
輸入:一個整數(shù)b
功能:構(gòu)造一個與輸入值相同的整數(shù)
輸出:無
后置條件:整數(shù)a具有輸入的值
Set
前置條件:存在一個整數(shù)a
輸入:一個整數(shù)b
功能:修改整數(shù)a的值,使之與輸入的整數(shù)值相同
輸出:無
后置條件:整數(shù)a的值發(fā)生改變
Add
前置條件:存在一個整數(shù)a
輸入:一個整數(shù)b
功能:將整數(shù)a與輸入的整數(shù)b相加
輸出:相加后的結(jié)果
后置條件:整數(shù)a的值發(fā)生改變
Sub
前置條件:存在一個整數(shù)a
輸入:一個整數(shù)b
功能:將整數(shù)a與輸入的整數(shù)b相減
輸出:相減的結(jié)果
后置條件:整數(shù)a的值發(fā)生改變
Multi
前置條件:存在一個整數(shù)a
輸入:一個整數(shù)b
功能:將整數(shù)a與輸入的整數(shù)b相乘
輸出:相乘的結(jié)果
后置條件:整數(shù)a的值發(fā)生改變
Div
前置條件:存在一個整數(shù)a
輸入:一個整數(shù)b
功能:將整數(shù)a與輸入的整數(shù)b相除
輸出:若整數(shù)b為零,則拋出除零異常,否則輸出相除的結(jié)果
后置條件:整數(shù)a的值發(fā)生改變
Mod
前置條件:存在一個整數(shù)a
輸入:一個整數(shù)b
功能:求當(dāng)前整數(shù)與輸入整數(shù)的模,即正的余數(shù)
輸出:若整數(shù)b為零,則拋出除零異常,否則輸出取模的結(jié)果
后置條件:整數(shù)a的值發(fā)生改變
Equal
前置條件:存在一個整數(shù)a
輸入:一個整數(shù)b
功能:判斷整數(shù)a與輸入的整數(shù)b是否相等
輸出:若相等返回1,否則返回0
后置條件:整數(shù)a的值不發(fā)生改變
endADT
7.求多項式A(x)的算法可根據(jù)下列兩個公式之一來設(shè)計:
⑴A(x)=anxn+an-lxn-l+"-+alx+aO
(2)A(x)=(…(anx+an-l)x+…+al)x)+aO
根據(jù)算法的時間復(fù)雜度分析比較這兩種算法的優(yōu)劣。
【解答】第二種算法的時間性能要好些。第種算法需執(zhí)行大量的乘法運(yùn)算,而第二種算法
進(jìn)行了優(yōu)化,
減少了不必要的乘法運(yùn)算。
8.算法設(shè)計(要求:算法用偽代碼和C++描述,并分析最壞情況下的時間復(fù)雜度)
⑴對一個整型數(shù)組A[nJ設(shè)計一個排序算法。
【解答】卜面是簡單選擇排序算法的偽代碼描述。
下面是簡單選擇排序算法的C++描述。
分析算法,有兩層嵌套的for循環(huán),所以,。
⑵找出整型數(shù)組A[n]中元素的最大值和次最大值。
【解答】算法的偽代碼描述如下:
算法的C++描述如下:
分析算法,只有一層循環(huán),共執(zhí)行n-2次,所以,T(n)=O(n)?
學(xué)習(xí)自測及答案
1.順序存儲結(jié)構(gòu)的特點(diǎn)是(),鏈接存儲結(jié)構(gòu)的特點(diǎn)是()。
【解答】用元素在存儲器中的相對位置來表示數(shù)據(jù)元素之間的邏輯關(guān)系,用指示元素存儲地
址的指針表示
數(shù)據(jù)元素之間的邏輯關(guān)系。
2.算法在發(fā)生非法操作時可以作出處理的特性稱為()。
【解答】健壯性
3.常見的算法時間復(fù)雜度用大0記號表示為:常數(shù)階()、對數(shù)階()、線性階()、平方階()
和指數(shù)階()。
【解答】0(1),O(log2n),0(n),0(n2),0(2n)
4.將下列函數(shù)按它們在n時的無窮大階數(shù),從小到大排列。
n,n-n3+7n5,nlogn,2n/2,n3,Iog2n,nl/2+log2n,(3/2)n,n!,n2+log2n
【解答】Iog2n,nl/2+log2n,n,nlog2n,n2+log2n,n3,n-n3+7n5,2n/2,(3/2)n,n!
5.試描述數(shù)據(jù)結(jié)構(gòu)和抽象數(shù)據(jù)類型的概念與程序設(shè)計語言中數(shù)據(jù)類型概念的區(qū)別。
【解答】數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一定關(guān)系的數(shù)據(jù)元素的集合。而抽象數(shù)據(jù)類型是指一個
數(shù)據(jù)結(jié)構(gòu)以及
定義在該結(jié)構(gòu)上的一組操作。程序設(shè)計語言中的數(shù)據(jù)類型是一個值的集合和定義在這個值集
上一組操作的
總稱。抽象數(shù)據(jù)類型可以看成是對數(shù)據(jù)類型的一?種抽象。
6.對下列用二元組表示的數(shù)據(jù)結(jié)構(gòu),試分別畫出對應(yīng)的邏輯結(jié)構(gòu)圖,并指出屬于何種結(jié)構(gòu)。
(1)A=(D,R),其中D={al,a2,a3,a4},R={}
⑵B=(D,R),其中D={a,b,c,d,e,f},R={??}
⑶C=(D,R),其中D={a,b,c,d,e,f},R={,,,,,}
(4)D=(D,R),其中D={1,2,3,4,5,6},
R={(1,2),(1,4),(2,3),(2,4),(3,4),(3,5),(3,6),(4,6)}
【解答】⑴屬于集合,其邏輯結(jié)構(gòu)圖如圖l-4(a)所示;⑵屬于線性結(jié)構(gòu),其邏輯結(jié)構(gòu)圖如
圖l-4(b)所示;
⑶屬于樹結(jié)構(gòu),其邏輯結(jié)構(gòu)圖如圖L4(c)所示;(4)屬于圖結(jié)構(gòu),其邏輯結(jié)構(gòu)圖如圖l-4(d)
所示。
7.求下列算法的時間復(fù)雜度。
count=0;x=l;
while(x{
x*=2;
count++;
)
returncount;
【解答】O(log2n)
第2章線性表
課后習(xí)題講解
1.填空
(1)在順序表中,等概率情況下,插入和刪除一個元素平均需移動()個元素,具體移動元
素的個數(shù)與()
和()有關(guān)。
【解答】表長的一半,表長,該元素在表中的位置
⑵順序表中第一個元素的存儲地址是100,每個元素的長度為2,則第5個元素的存儲地址
是()。
【解答】108
【分析】第5個元素的存儲地如:=第1個元素的存儲地址+(5-1)X2=108
⑶設(shè)單鏈表中指針p指向結(jié)點(diǎn)A,若要刪除A的后繼結(jié)點(diǎn)(假設(shè)A存在后繼結(jié)點(diǎn)),則需
修改指針的操
作為()?
【龜帛答】p->next=(p->next)->next
(4)單鏈表中設(shè)置頭結(jié)點(diǎn)的作用是()。
【解答】為了運(yùn)算方便
【分析】例如在插入和刪除操作時不必對表頭的情況進(jìn)行特殊處理。
⑸非空的單循環(huán)鏈表由頭指針head指示,則其尾結(jié)點(diǎn)(由指針p所指)滿足()。
【解答】p->next=head
【分析】如圖2-8所示。
⑹在由尾指針rear指示的單循環(huán)鏈表中,在表尾插入?個結(jié)點(diǎn)s的操作序列是();刪除
開始結(jié)點(diǎn)的操
作序列為()。
【解答】s->next=rear->next;rear->next=s;rear=s;
q=rear->next->next;rear->next->next=q->next;deleteq;
【分析】操作示意圖如圖2-9所示:
⑺一個具有n個結(jié)點(diǎn)的單鏈表,在指針p所指結(jié)點(diǎn)后插入一個新結(jié)點(diǎn)的時間復(fù)雜度為();
在給定值為
X的結(jié)點(diǎn)后插入?個新結(jié)點(diǎn)的時間復(fù)雜度為()。
【解答】0(1),0(n)
【分析】在P所指結(jié)點(diǎn)后插入一個新結(jié)點(diǎn)只需修改指針,所以時間復(fù)雜度為??冢憾诮o
定值為x的結(jié)點(diǎn)
后插入一個新結(jié)點(diǎn)需要先查找值為x的結(jié)點(diǎn),所以時間復(fù)雜度為0(n)。
(8)可由一個尾指針唯一確定的鏈表有()、()、()。
【解答】循環(huán)鏈表,循環(huán)雙鏈表,雙鏈表
2.選擇題
⑴線性表的順序存儲結(jié)構(gòu)是一種()的存儲結(jié)構(gòu),線性表的鏈接存儲結(jié)構(gòu)是一種()的
存儲結(jié)構(gòu)。
A隨機(jī)存取B順序存取C索引存取D散列存取
【解答】A,B
【分析】參見221。
⑵線性表采用鏈接存儲時,其地址()。
A必須是連續(xù)的B部分地址必須是連續(xù)的
C?定是不連續(xù)的D連續(xù)與否均可以
【解答】D
【分析】線性表的鏈接存儲是用一組任意的存儲單元存儲線性表的數(shù)據(jù)元素,這組存儲單元
可以連續(xù),也
可以不連續(xù),甚至可以零散分布在內(nèi)存中任意位置。
⑶單循環(huán)鏈表的主要優(yōu)點(diǎn)是()。
A不再需要頭指針了
B從表中任一結(jié)點(diǎn)出發(fā)都能掃描到整個鏈表;
C已知某個結(jié)點(diǎn)的位置后,能夠容易找到它的直接前趨;
D在進(jìn)行插入、刪除操作時,能更好地保證鏈表不斷開。
【解答】B
(4)鏈表不具有的特點(diǎn)是()。
A可隨機(jī)訪問任一元素B插入、刪除不需要移動元素
C不必事先估計存儲空間D所需空間與線性表長度成正比
【解答】A
⑸若某線性表中最常用的操作是取第i個元素和找第i個元素的前趨,則采用()存儲方
法最節(jié)省時間。
A順序表B單鏈表C雙鏈表D單循環(huán)鏈表
【解答】A
【分析】線性表中最常用的操作是取第i個元素,所以,應(yīng)選擇隨機(jī)存取結(jié)構(gòu)即順序表,同
時在順序表中
查找第i個元素的前趨也很方便。單鏈表和單循環(huán)鏈表既不能實現(xiàn)隨機(jī)存取,查找第i個元
素的前趨也不方
便,雙鏈表雖然能快速查找第i個元素的前趨,但不能實現(xiàn)隨機(jī)存取。
(6)若鏈表中最常用的操作是在最后一個結(jié)點(diǎn)之后插入一個結(jié)點(diǎn)和刪除第一個結(jié)點(diǎn),則采用
()存儲方法
最節(jié)省時間。
A單鏈表B帶頭指針的單循環(huán)鏈表C雙鏈表D帶尾指針的單循環(huán)鏈表
【解答】D
【分析】在鏈表中的最后一個結(jié)點(diǎn)之后插入一個結(jié)點(diǎn)需要知道終端結(jié)點(diǎn)的地址,所以,單鏈
表、帶頭指針
的單循環(huán)鏈表、雙鏈表都不合適,考慮在帶尾指針的單循環(huán)鏈表中刪除第一個結(jié)點(diǎn),其時間
性能是0(1),
所以,答案是D。
⑺若鏈表中最常用的操作是在最后一個結(jié)點(diǎn)之后插入一個結(jié)點(diǎn)和刪除最后一個結(jié)點(diǎn),則采
用()存儲方
法最節(jié)省運(yùn)算時間。
A單鏈表B循環(huán)雙鏈表C單循環(huán)鏈表D帶尾指針的單循環(huán)鏈表
【解答】B
【分析】在鏈表中的最后一個結(jié)點(diǎn)之后插入一個結(jié)點(diǎn)需要知道終端結(jié)點(diǎn)的地址,所以,單鏈
表、單循環(huán)鏈
表都不合適,刪除最后一個結(jié)點(diǎn)需要知道終端結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的地址,所以,帶尾指針的單
循環(huán)鏈表不合
適,而循環(huán)雙鏈表滿足條件。
(8)在具有n個結(jié)點(diǎn)的有序單鏈表中插入一個新結(jié)點(diǎn)并仍然有序的時間復(fù)雜度是()。
A0⑴B0(n)C0(n2)DO(nlog2n)
【解答】B
【分析】首先應(yīng)順序查找新結(jié)點(diǎn)在單鏈表中的位置。
(9)對于n個元素組成的線性表,建立一個有序單鏈表的時間復(fù)雜度是(
A。⑴B0(n)C0(n2)DO(nlog2n)
【解答】C
【分析】該算法需要將n個元素依次插入到有序單鏈表中,而插入每個元素需0(n)。
(10)使用雙鏈表存儲線性表,其優(yōu)點(diǎn)是可以()。
A提高查找速度B更方便數(shù)據(jù)的插入和刪除
C節(jié)約存儲空間D很快回收存儲空間
【解答】B
【分析】在鏈表中一般只能進(jìn)行順序查找,所以,雙鏈表并不能提高查找速度,因為雙鏈表
中有兩個指針
域,顯然不能節(jié)約存儲空間,對于動態(tài)存儲分配,回收存儲空間的速度是一樣的。由于雙鏈
表具有對稱性,
所以,其插入和刪除操作更加方便。
(11)在一個單鏈表中,已知q所指結(jié)點(diǎn)是p所指結(jié)點(diǎn)的直接前驅(qū),若在q和p之間插入S所
指結(jié)點(diǎn),則執(zhí)
行()操作。
As->next=p->next;p->next=s;Bq->next=s;s->next=p;
Cp->next=s->next;s->next=p;Dp->next=s;s->next=q;
【解答】B
【分析】注意此題是在q和p之間插入新結(jié)點(diǎn),所以,不用考慮修改指針的順序。
?在循環(huán)雙鏈表的p所指結(jié)點(diǎn)后插入S所指結(jié)點(diǎn)的操作是()。
Ap->next=s;s->prior=p;p->next->prior=s;s->next=p->next;
Bp->next=s;p->next->prior=s;s->prior=p;s->next=p->next;
Cs->prior=p;s->next=p->next;p->next=s;p->next->prior=s;
Ds->prior=p;s->next=p->next;p->next->prior=s;p->next=s
【解答】D
【分析】在鏈表中,對指針的修改必須保持線性表的邏輯關(guān)系,否則,將違背線性表的邏輯
特征,圖2-10
給出備選答案C和D的圖解。
3.判斷題
⑴線性表的邏輯順序和存儲順序總是一致的。
【解答】錯。順序表的邏輯順序和存儲順序一致,鏈表的邏輯順序和存儲順序不一定一致。
⑵線性表的順序存儲結(jié)構(gòu)優(yōu)于鏈接存儲結(jié)構(gòu)。
【解答】錯。兩種存儲結(jié)構(gòu)各有優(yōu)缺點(diǎn)。
⑶設(shè)p,q是指針,若p=q,則*p=*q。
【解答】錯。p=q只能表示p和q指向同一起始地址,而所指類型則不一定相同。
(4)線性結(jié)構(gòu)的基本特征是:每個元素有且僅有一個直接前驅(qū)和一個直接后繼。
【解答】錯。每個元素最多只有一個直接前驅(qū)和一個直接后繼,第一個元素沒有前驅(qū),最后
一個元素沒有
后繼。
⑸在單鏈表中,要取得某個元素,只要知道該元素所在結(jié)點(diǎn)的地址即可,因此單鏈表是隨
機(jī)存取結(jié)構(gòu)。
【解答】錯。要找到該結(jié)點(diǎn)的地址,必須從頭指針開始查找,所以單鏈表是順序存取結(jié)構(gòu)。
4.請說明順序表和單鏈表各有何優(yōu)缺點(diǎn),并分析下列情況下,采用何種存儲結(jié)構(gòu)更好些。
⑴若線性表的總長度基本穩(wěn)定,且很少進(jìn)行插入和刪除操作,但要求以最快的速度存取線
性表中的元素。
⑵如果n個線性表同時并存,并且在處理過程中各表的長度會動態(tài)發(fā)生變化。
⑶描述一個城市的設(shè)計和規(guī)劃。
【解答】順序表的優(yōu)點(diǎn):①無需為表示表中元素之間的邏輯關(guān)系而增加額外的存儲空間;
②可以快速地
存取表中任一位置的元素(即隨機(jī)存取)。順序表的缺點(diǎn):①插入和刪除操作需移動大量元
素;②表的
容量難以確定;③造成存儲空間的“碎片”。
單鏈表的優(yōu)點(diǎn):①不必事先知道線性表的長度;②插入和刪除元素時只需修改指針,不用
移動元素。單
鏈表的缺點(diǎn):①指針的結(jié)構(gòu)性開銷;②存取表中任意元素不方便,只能進(jìn)行順序存取。
⑴應(yīng)選用順序存儲結(jié)構(gòu)。因為順序表是隨機(jī)存取結(jié)構(gòu),單鏈表是順序存取結(jié)構(gòu)。本題很少
進(jìn)行插入和刪除
操作,所以空間變化不大,且需要快速存取,所以應(yīng)選用順序存儲結(jié)構(gòu)。
⑵應(yīng)選用鏈接存儲結(jié)構(gòu)。鏈表容易實現(xiàn)表容量的擴(kuò)充,適合表的長度動態(tài)發(fā)生變化。
⑶應(yīng)選用鏈接存儲結(jié)構(gòu)。因為一個城市的設(shè)計和規(guī)劃涉及活動很多,需要經(jīng)常修改、擴(kuò)充
和刪除各種信息,
才能適應(yīng)不斷發(fā)展的需要。而順序表的插入、刪除的效率低,故不合適。
5.算法設(shè)計
⑴設(shè)計一個時間復(fù)雜度為0(n)的算法,實現(xiàn)將數(shù)組A[n]中所有元素循環(huán)右移k個位置。
【解答】算法思想請參見主教材第一章思想火花。下面給出具體算法。
分析算法,第一次調(diào)用Reverse函數(shù)的時間復(fù)雜度為0(k),第二次調(diào)用Reverse函數(shù)的時間
復(fù)雜度為O(n-k),
第三次調(diào)用Reverse函數(shù)的時間復(fù)雜度為0(n),所以,總的時間復(fù)雜度為0(n)。
⑵已知數(shù)組A[n]中的元素為整型,設(shè)計算法將其調(diào)整為左右兩部分,左邊所有元素為奇數(shù),
右邊所有元
素為偶數(shù),并要求算法的時間復(fù)雜度為0(n)。
【解答】從數(shù)組的兩端向中間比較,設(shè)置兩個變量i和j,初始時i=0,j=n-L若A[i]為偶數(shù)
并且A[j]為奇
數(shù),則將A[i]與A[j]交換。具體算法如卜:
分析算法,兩層循環(huán)將數(shù)組掃描?遍,所以,時間復(fù)雜度為0(n)。
⑶試編寫在無頭結(jié)點(diǎn)的單鏈表上實現(xiàn)線性表的插入操作的算法,并和帶頭結(jié)點(diǎn)的單鏈表上
的插入操作的實
現(xiàn)進(jìn)行比較。
【解答】參見2.2.3。
(4)試分別以順序表和單鏈表作存儲結(jié)構(gòu),各寫一實現(xiàn)線性表就地逆置的算法。
【解答】順序表的逆置,即是將對稱元素交換,設(shè)順序表的長度為length,則將表中第i個
元素與第length-i-1
個元素相交換。具體算法如下:
單鏈表的逆置請參見224算法2-4和算法2-6。
⑸假設(shè)在長度大于1的循環(huán)鏈表中,即無頭結(jié)點(diǎn)也無頭指針,s為指向鏈表中某個結(jié)點(diǎn)的
指針,試編寫算
法刪除結(jié)點(diǎn)s的前趨結(jié)點(diǎn)。
【解答】利用單循環(huán)鏈表的特點(diǎn),通過指針s可找到其前驅(qū)結(jié)點(diǎn)r以及r的前驅(qū)結(jié)點(diǎn)p,然
后將結(jié)點(diǎn)r刪除,
如圖2-11所示,具體算法如下:
(6)已知一單鏈及中的數(shù)據(jù)元素含有三類字符:字母、數(shù)字和其他字符。試編寫算法,構(gòu)造
三個循環(huán)鏈表,
使每個循環(huán)鏈表中只含同一類字符。
【解答】在單鏈表A中依次取元素,若取出的元素是字母,把它插入到字母鏈表B中,若
取出的元素是數(shù)
字,則把它插入到數(shù)字鏈表D中,直到鏈表的尾部,這樣表B,D,A中分別存放字母、數(shù)
字和其他字符。
具體算法如下:
⑺設(shè)單鏈表以非遞減有序排列,設(shè)計算法實現(xiàn)在單鏈表中刪去值相同的多余結(jié)點(diǎn)。
【解答】從頭到尾掃描單鏈表,若當(dāng)前結(jié)點(diǎn)的元素值與后繼結(jié)點(diǎn)的元素值不相等,則指針后
移;否則刪除
該后繼結(jié)點(diǎn)。具體算法如下:
(8)判斷帶頭結(jié)點(diǎn)的雙循環(huán)鏈表是否對稱。
【解答】設(shè)工作指針p和q分別指向循環(huán)雙鏈表的開始結(jié)點(diǎn)和終端結(jié)點(diǎn),若結(jié)點(diǎn)p和結(jié)點(diǎn)q
的數(shù)據(jù)域相等,
則工作指針p后移,工作指針q前移,直到指針p和指針q指向同一結(jié)點(diǎn)(循環(huán)雙鏈表中
結(jié)點(diǎn)個數(shù)為奇數(shù)),
或結(jié)點(diǎn)q成為結(jié)點(diǎn)P的前驅(qū)(循環(huán)雙鏈表中結(jié)點(diǎn)個數(shù)為偶數(shù))。如圖2-12所示。
學(xué)習(xí)自測及答案
1.已知一維數(shù)組A采用順序存儲結(jié)構(gòu),每個元素占用4個存儲單元,第9個元素的地址為
144,則第一個
元素的地址是()。
A108B180C176D112
【解答】D
2.在長度為n的線性表中查找值為x的數(shù)據(jù)元素的時間復(fù)雜度為:()。
AO(0)BO(l)CO(n)DO(n2)
【解答】C
3.在一個長度為n的順序表的第i(l<Wn+l)個元素之前插入一個元素,需向后移動()
個元素,刪除
第i(lWiWn)個元素時,需向前移動()個元素。
【解答】n-i+1,n-i
4.在單鏈表中,除了頭結(jié)點(diǎn)以外,任一結(jié)點(diǎn)的存儲位置由()指示。
【解答】其前趨結(jié)點(diǎn)的指針域
5.當(dāng)線性表采用順序存儲結(jié)構(gòu)時,其主要特點(diǎn)是()。
【解答】邏輯結(jié)構(gòu)中相鄰的結(jié)點(diǎn)在存儲結(jié)構(gòu)中仍相鄰
6.在雙鏈表中,每個結(jié)點(diǎn)設(shè)置了兩個指針域,其中?個指向()結(jié)點(diǎn),另一個指向()
結(jié)點(diǎn)。
【解答】前驅(qū),后繼
7.設(shè)A是一個線性表(al,a2,…,an),采用順序存儲結(jié)構(gòu),則在等概率的前提下,平均每
插入一個元素
需要移動的元素個數(shù)為多少?若元素插在ai與ai+1之間(l<iWn)的概率為,則平均每
插
入一個元素所要移動的元素個數(shù)又是多少?
【解答】
8.線性表存放在整型數(shù)組A[arrsize]的前elenum個單元中,且遞增有序。編寫算法,將元
素x插入到線
性表的適當(dāng)位置上,以保持線性表的有序性,并且分析算法的時間復(fù)雜度。
【解答】本題是在一個遞增有序表中插入元素x,基木思路是從有序表的尾部開始依次取元
素與x比較,
若大于x,此元素后移一位,再取它前面一個元素重復(fù)上述步驟:否則,找到插入位置,將
x插入。具體
算法如下:
9.已知單鏈表中各結(jié)點(diǎn)的元素值為整型且遞增有序,設(shè)計算法刪除鏈表中所有大于mink且
小于maxk的
所有元素,并釋放被刪結(jié)點(diǎn)的存儲空間。
【解答】因為是在有序單鏈表上的操作,所以,要充分利用其有序性。在單鏈表中查找第
個大于mink
的結(jié)點(diǎn)和第一個小于maxk的結(jié)點(diǎn),再將二者間的所有結(jié)點(diǎn)刪除。
10.設(shè)單循環(huán)鏈表L1,對其遍歷的結(jié)果是:xl,x2,x3,?“,xn-l,xn。請將該循環(huán)鏈表拆成兩個
單循環(huán)鏈表
L1和L2,使得L1中含有原L1表中序號為奇數(shù)的結(jié)點(diǎn)且遍歷結(jié)果為:xl,x3,…;L2中含有
原L1表中序
號為偶數(shù)的結(jié)點(diǎn)且遍歷結(jié)果為:…,x4,x2。
【解答】算法如下:
第3章特殊線性表——棧、隊列和串
課后習(xí)題講解
1.填空
(1)設(shè)有一個空棧,棧頂指針為1000H,現(xiàn)有輸入序列為1、2、3、4、5,經(jīng)過push,push,
pop,push,
pop,push,push后,輸出序列是(),棧頂指針為()?
【解答】23,1003H
⑵棧通常采用的兩種存儲結(jié)構(gòu)是();其判定棧空的條件分別是(),判定棧滿的條件分
別是()?
【解答】順序存儲結(jié)構(gòu)和鏈接存儲結(jié)構(gòu)(或順序棧和鏈棧),棧頂指針top=-1和top=NULL,
棧頂指針
top等于數(shù)組的長度和內(nèi)存無可用空間
⑶()可作為實現(xiàn)遞歸函數(shù)調(diào)用的一種數(shù)據(jù)結(jié)構(gòu)。
【解答】棧
【分析】遞歸函數(shù)的調(diào)用和返回正好符合后進(jìn)先出性。
(4)表達(dá)式a*(b+c)-d的后綴表達(dá)式是()o
【解答】abc+*d-
【分析】將中綴表達(dá)式變?yōu)楹缶Y表達(dá)式有一個技巧:將操作數(shù)依次寫下來,再將算符插在它
的兩個操作數(shù)
的后面。
(5)棧和隊列是兩種特殊的線性表,棧的操作特性是(),隊列的操作特性是(),棧和隊
列的主要區(qū)別
在于()。
【解答】后進(jìn)先出,先進(jìn)先出,對插入和刪除操作限定的位置不同
⑹循環(huán)隊列的引入是為了克服()。
【解答】假溢出
⑺數(shù)組Q[n]用來表示一個循環(huán)隊列,front為隊頭元素的前一個位置,rear為隊尾元素的位
置,計算隊列
中元素個數(shù)的公式為()。
【解答】(rear-front+n)%n
【分析】也可以是(rear-front)%n,但rear-front的結(jié)果可能是負(fù)整數(shù),而對一個負(fù)整數(shù)求
模,其結(jié)果
在不同的編譯器環(huán)境下可能會有所不同。
(8)用循環(huán)鏈表表示的隊列長度為n,若只設(shè)頭指針,則出隊和入隊的時間復(fù)雜度分別是()
和()。
【解答】0(1),0(n)
【分析】在帶頭指針的循環(huán)鏈表中,出隊即是刪除開始結(jié)點(diǎn),這只需修改相應(yīng)指針:入隊即
是在終端結(jié)點(diǎn)
的后面插入一個結(jié)點(diǎn),這需要從頭指針開始查找終端結(jié)點(diǎn)的地址。
(9)串是一種特殊的線性表,其特殊性體現(xiàn)在()。
【解答】數(shù)據(jù)元素的類型是一個字符
⑩兩個串相等的充分必要條件是()。
【解答】長度相同且對應(yīng)位置的字符相等
【分析】例如"abcBabc","abc"^"bca"?
2.選擇題
⑴若一個棧的輸入序列是1,2,3,…,n,輸出序列的第一個元素是n,則第i個輸出元
素是()。
A不確定Bn-iCn-i-1Dn-i+1
【解答】D
【分析】此時,輸出序列一定是輸入序列的逆序。
⑵設(shè)棧S和隊列Q的初始狀態(tài)為空,元素el、e2、e3、e4、e5、e6依次通過棧S,一個元
素出棧后即進(jìn)
入隊列Q,若6個元素出隊的順序是e2、e4、e3、e6、e5、el,則棧S的容量至少應(yīng)該是
()o
A6B4C3D2
【解答】C
【分析】由于隊列具有先進(jìn)先出性,所以,此題中隊列形同虛設(shè),即出棧的順序也是e2、
e4、e3、e6^e5、
elo
⑶一個棧的入棧序列是1,2,3,4,5,則棧的不可能的輸出序列是()。
A54321B45321C43512D12345
【解答】C
【分析】此題有一個技巧:在輸出序列中任意元素后面不能出現(xiàn)比該元素小并且是升序(指
的是元素的序
號)的兩個元素。
(4)設(shè)計一個判別表達(dá)式中左右括號是否配對的算法,采用()數(shù)據(jù)結(jié)構(gòu)最佳
A順序表B棧C隊列D鏈表
【解答】B
【分析】每個右括號與它前面的最后一個沒有匹配的左括號配對,因此具有后進(jìn)先出性。
⑸在解決計算機(jī)主機(jī)與打印機(jī)之間速度不匹配問題時通常設(shè)置一個打印緩沖區(qū),該緩沖區(qū)
應(yīng)該是一個()
結(jié)構(gòu)。
A棧B隊列C數(shù)組D線性表
【解答】B
【分析】先進(jìn)入打印緩沖區(qū)的文件先被打印,因此具有先進(jìn)先出性。
(6)?個隊列的入隊順序是1,2,3,4,則隊列的輸出順序是()。
A4321B1234C1432D3241
【解答】B
【分析】隊列的入隊順序和出隊順序總是一致的。
⑺棧和隊列的主要區(qū)別在于()。
A它們的邏輯結(jié)構(gòu)不一樣B它們的存儲結(jié)構(gòu)不一樣
C所包含的運(yùn)算不一樣D插入、刪除運(yùn)算的限定不一樣
【解答】D
【分析】棧和隊列的邏輯結(jié)構(gòu)都是線性的,都有順序存儲和鏈接存儲,有可能包含的運(yùn)算不
一樣,但不是
主要區(qū)別,任何數(shù)據(jù)結(jié)構(gòu)在針對具體問題時包含的運(yùn)算都可能不同。
(8)設(shè)數(shù)組S[n]作為兩個棧S1和S2的存儲空間,對任何一個棧只有當(dāng)S[n]全滿時才不能進(jìn)
行進(jìn)棧操作。
為這兩個棧分配空間的最佳方案是()。
AS1的棧底位置為0,S2的棧底位置為n-1
BS1的棧底位置為0,S2的棧底位置為n/2
CS1的棧底位置為0,S2的棧底位置為n
DS1的棧底位置為0,S2的棧底位置為1
【解答】A
【分析】兩棧共享空間首先兩個棧是相向增長的,棧底應(yīng)該分別指向兩個棧中的第一個元素
的位置,并注
意C++中的數(shù)組下標(biāo)是從0開始的。
(9)設(shè)有兩個串p和q,求q在p中首次出現(xiàn)的位置的運(yùn)算稱作()。
A連接B模式匹配C求子串D求串長
【解答】B
3.判斷題
⑴有n個元素依次進(jìn)棧,則出棧序列有(n-l)/2種。
【解答】錯。應(yīng)該有種。
⑵棧可以作為實現(xiàn)過程調(diào)用的?種數(shù)據(jù)結(jié)構(gòu)。
【解答】對。只要操作滿足后進(jìn)先出性,都可以采用棧作為輔助數(shù)據(jù)結(jié)構(gòu)。
⑶在棧滿的情況下不能做進(jìn)棧操作,否則將產(chǎn)生“上溢”。
【解答】對。
(4)在循環(huán)隊列中,front指向隊頭元素的前個位置,rear指向隊尾元素的位置,則隊滿的
條件是
front=rear。
【解答】錯。這是隊空的判定條件,在循環(huán)隊列中要將隊空和隊滿的判定條件區(qū)別開。
(5)空串與空格串是相同的。
【解答】錯??沾拈L度為零,而空格串的長度不為0,其長度是串中空格的個數(shù)。
4.設(shè)有一個棧,元素進(jìn)棧的次序為A,B,C,D,E,能否得到如下出棧序列,若能,請寫
出操作序列,若
不能,請說明原因。
(1)C,E,A,B,D
(2)C,B,A,D,E
【解答】⑴不能,因為在C、E出棧的情況下,A一定在棧中,而且在B的下面,不可能先
于B出棧。(2)
可以,設(shè)1為進(jìn)棧操作,0為入棧操作,則其操作序列為川0001010。
5.舉例說明順序隊列的“假溢出”現(xiàn)象。
【解答】假設(shè)有一個順序隊列,如圖3-6所示,隊尾指針rear=4,隊頭指針front=l,如果再
有元素入隊,
就會產(chǎn)生“上溢”,此時的“上溢”又稱為“假溢出”,因為隊列并不是真的溢出了,存儲隊
列的數(shù)組中還有2個
存儲單元空閑,其下標(biāo)分別為0和1。
6.在操作序列push⑴、push⑵、pop、push⑸、push⑺、pop、push⑹之后,棧頂元素和
棧底元素分
別是什么?(push(k)表示整數(shù)k入棧,pop表示棧頂元素出棧。)
【解答】棧頂元素為6,棧底元素為1。其執(zhí)行過程如圖3-7所示。
7.在操作序列EnQueue⑴、EnQueue⑶、DeQueue、EnQueue(5)、EnQueue⑺、DeQueue、
EnQueue(9)
之后,隊頭元素和隊尾元素分別是什么?(EnQueue(k)表示整數(shù)k入隊,DeQueue表示隊頭
元素出隊)。
【解答】隊頭元素為5,隊尾元素為9。其執(zhí)行過程如圖3-8所示。
8.空串和空格串有何區(qū)別?串中的空格符有何意義?空串在串處理中有何作用?
【解答】不含任何字符的串稱為空串,其長度為零。僅含空格的串稱為空格串,它的長度為
串中空格符的
個數(shù)。串中的空格符可用來分隔一般的字符,便于人們識別和閱讀,但計算串長時應(yīng)包括這
些空格符???/p>
串在串處理中可作為任意串的子串。
9.算法設(shè)計
⑴假設(shè)以不帶頭結(jié)點(diǎn)的循環(huán)鏈表表示隊列,并且只設(shè)一個指針指向隊尾結(jié)點(diǎn),但不設(shè)頭指
針。試設(shè)計相應(yīng)
的入隊和出隊的算法。
【解答】出隊操作是在循環(huán)鏈表的頭部進(jìn)行,相當(dāng)于刪除開始結(jié)點(diǎn),而入隊操作是在循環(huán)鏈
表的尾部進(jìn)行,
相當(dāng)于在終端結(jié)點(diǎn)之后插入一個結(jié)點(diǎn)。由于循環(huán)鏈表不帶頭結(jié)點(diǎn),需要處理空表的特殊情況。
入隊算法如下:
出隊算法如下:
⑵設(shè)順序棧S中有2n個元素,從棧頂?shù)綏5椎脑匾来螢閍2n,a2n-l,al,要求通
過一個循環(huán)隊列
重新排列棧中元素,使得從棧頂?shù)綏5椎脑匾来螢閍2n,a2n-2,…,a2,a2n-l,a2n-3,…,
al,請設(shè)
計算法實現(xiàn)該操作,要求空間復(fù)雜度和時間復(fù)雜度均為0(n)。
【解答】操作步驟為:
①將所有元素出棧并入隊;
②依次將隊列元素出隊,如果是偶數(shù)結(jié)點(diǎn),則再入隊,如果是奇數(shù)結(jié)點(diǎn),則入棧;
③將奇數(shù)結(jié)點(diǎn)出棧并入隊;
④將偶數(shù)結(jié)點(diǎn)出隊并入棧;
⑤將所有元素出棧并入隊;
⑥將所有元素出隊并入棧即為所求。
⑶用順序存儲結(jié)構(gòu)存儲串S,編寫算法刪除S中第i個字符開始的連續(xù)j個字符。
【解答】先判斷串S中要刪除的內(nèi)容是否存在,若存在,則將第i+j-1之后的字符前移j個位
置。算法如下:
(4)對于采用順序存儲結(jié)構(gòu)的串S,編寫一個函數(shù)刪除其值等于ch的所有字符。
【解答】從后向前刪除值為ch的所有元素,這樣所有移動的元素中沒有值為ch的元素,能
減少移動元素
的次數(shù),提高算法的效率。算法如下:
⑸對串的模式匹配KMP算法設(shè)計求模式滑動位置的next函數(shù)。
【解答】參見3.2.5
學(xué)習(xí)自測及答案
1.在一個具有n個單元的順序棧中,假定以地址低端(即下標(biāo)為。的單元)作為棧底,以
top作為棧頂指
針,當(dāng)出棧時,top的變化為()。
A不變Btop=0;Ctop=top-l;Dtop=top+l;
【解答】C
2.一個棧的入棧序列是a,b,c,d,e,則棧的不可能的出棧序列是()。
AedcbaBcdebaCdebcaDabode
【解答】C
3.從棧頂指針為top的鏈棧中刪除一個結(jié)點(diǎn),用x保存被刪除結(jié)點(diǎn)的值,則執(zhí)行()。
Ax=top;top=top->next;Bx=top->data;
Ctop=top->next;x=top->data;Dx=top->data;top=top->next;
【解答】D
4.設(shè)元素1,2,3,P,A依次經(jīng)過一個棧,進(jìn)棧次序為123PA,在棧的輸出序列中,有哪些序
列可作為C++
程序設(shè)計語言的變量名。
【解答】PA321,P3A21,P32A1,P321A,AP321
5.設(shè)S="l_am_a_teacther",其長度為()。
【解答】15
6.對于棧和隊列,無論它們采用順序存儲結(jié)構(gòu)還是鏈接存儲結(jié)構(gòu),進(jìn)行插入和刪除操作的
時間復(fù)雜度都是
()。
【解答】。⑴
7.如果進(jìn)棧序列為A、B、C、D,則可能的出棧序列是什么?
答:共14種,分另I」是:ABCD,ABDC,ACBD,ACDB,ADCB,BACD,BADC,BCAD,BCDA,
BDCA,CBAD,
CBDA,CDBA,DCBA
8.簡述隊列和棧這兩種數(shù)據(jù)結(jié)構(gòu)的相同點(diǎn)和不同點(diǎn)。
【解答】相同點(diǎn):它們都是插入和刪除操作的位置受限制的線性表。
不同點(diǎn):棧是限定僅在表尾進(jìn)行插入和刪除的線性表,是后進(jìn)先出的線性表,而隊列是限定
在表的一端進(jìn)
行插入,在另一端進(jìn)行刪除的線性表,是先進(jìn)先出的線性表。
9.利用兩個棧S1和S2模擬一個隊列,如何利用棧的運(yùn)算實現(xiàn)隊列的插入和刪除操作,請
簡述算法思想。
【解答】利用兩個棧S1和S2模擬一個隊列,當(dāng)需要向隊列中插入一個元素時,用S1來存
放已輸入的元
素,即通過向棧S1執(zhí)行入棧操作來實現(xiàn);當(dāng)需要從隊列中刪除元素時,則將S1中元素全部
送入到S2中,
再從S2中刪除棧頂元素,最后再將S2中元素全部送入到S1中;判斷隊空的條件是:棧S1
和S2同時為
空。
10.設(shè)計算法把一個十進(jìn)制整數(shù)轉(zhuǎn)換為二至九進(jìn)制之間的任一進(jìn)制數(shù)輸出。
【解答】算法基于原理:N=(Ndivd)Xd+Nmodd(div為整除運(yùn)算,mod為求余運(yùn)算)。
11.假設(shè)一個算術(shù)表達(dá)式中可以包含三種括號:圓括號“(”和“)”,方括號和
以及花括號“{"和“}",且
這三種括號可按任意的次序嵌套使用。編寫算法判斷給定表達(dá)式中所含括號是否配對出現(xiàn)。
【解答】假設(shè)表達(dá)式已存入字符數(shù)組A[n]中,具體算法如下:
第4章廣義線性表——多維數(shù)組和廣義表
課后習(xí)題講解
1.填空
(1)數(shù)組通常只有兩種運(yùn)算:()和(),這決定了數(shù)組通常采用()結(jié)構(gòu)來實現(xiàn)存儲。
【解答】存取,修改,順序存儲
【分析】數(shù)組是一個具有固定格式和數(shù)量的數(shù)據(jù)集合,在數(shù)組上一般不能做插入、刪除元素
的操作。除了
初始化和銷毀之外,在數(shù)組中通常只有存取和修改兩種操作。
⑵二維數(shù)組A中行下標(biāo)從10到20,列下標(biāo)從5到10,按行優(yōu)先存儲,每個元素占4個存
儲單元,A[10]⑸
的存儲地址是1000,則元素A[15][10]的存儲地址是()。
【解答】1140
【分析】數(shù)組A中每行共有6個元素,元素A[15][10]的前面共存儲了(15-10)X6+5個元素,
每個元素占4
個存儲單元,所以,其存儲地址是1000+140=1140。
⑶設(shè)有一個10階的對稱矩陣A采用壓縮存儲,A⑼⑼為第一個元素,其存儲地址為d,每
個元素占1個
存儲單元,則元素A[8]⑸的存儲地址為()。
【解答】d+41
【分析】元素A⑻⑸的前面共存儲了(1+2+…+8)+5=41個元素。
(4)稀疏矩陣一般壓縮存儲方法有兩種,分別是()和()。
【解答】三元組順序表,十字鏈表
⑸廣義表((a),(((b),c)),(d))的長度是(),深度是(),表頭是(),表尾是()。
【解答】3,4,(a),((((b),c)),(d))
(6)已知廣義表LS=(a,(b,c,d),e),用Head和Tail函數(shù)取出LS中原子b的運(yùn)算是()。
【解答】Head(Head(Tail(LS)))
2.選擇題
⑴二維數(shù)組A的每個元素是由6個字符組成的串,行下標(biāo)的范圍從0?8,列下標(biāo)的范圍是
從0?9,則存
放A至少需要()個字節(jié),A的第8列和第5行共占()個字節(jié),若A按行優(yōu)先方式存儲,
元素A⑻⑸的起始地址與當(dāng)A按列優(yōu)先方式存儲時的()元素的起始地址一致。
A90B180C240D540E108F114G54
HA[8][5]IA[3][10]JA[5][8]KA[4][9]
【解答】D,E,K
【分析】數(shù)組A為9行10歹共有90個元素,所以,存放A至少需要90X6=540個存儲
單元,第8列
和第5行共有18個元素(注意行列有一個交叉元素),所以,共占108個字節(jié),元素A⑻⑸
按行優(yōu)先存
儲的起始地址為d+8X10+5=d+85,設(shè)元素按列優(yōu)先存儲的起始地址與之相同,則d+j
X9+i=d+85,
解此方程,得i=4,j=9。
⑵將數(shù)組稱為隨機(jī)存取結(jié)構(gòu)是因為()
A數(shù)組元素是隨機(jī)的B對數(shù)組任一元素的存取時間是相等的
C隨時可以對數(shù)組進(jìn)行訪問D數(shù)組的存儲結(jié)構(gòu)是不定
【解答】B
⑶下面的說法中,不正確的是()
A數(shù)組是一種線性結(jié)構(gòu)B數(shù)組是一種定長的線性結(jié)構(gòu)
C除了插入與刪除操作外,數(shù)組的基本操作還有存取、修改、檢索和排序等
D數(shù)組的基本操作有存取、修改、檢索和排序等,沒有插入與刪除操
【解答】C
【分析】數(shù)組屬于廣義線性表,數(shù)組被創(chuàng)建以后,其維數(shù)和每維中的元素個數(shù)是確定的,所
以,數(shù)組通常
沒有插入和刪除操作。
⑷對特殊矩陣采用壓縮存儲的目的主要是為了()
A表達(dá)變得簡單B對矩陣元素的存取變得簡單
C去掉矩陣中的多余元素D減少不必要的存儲空間
【解答】D
【分析】在特殊矩陣中,有很多值相同的元素并且他們的分布有規(guī)律,沒有必要為值相同的
元素重復(fù)存儲。
⑸下面()不屬于特殊矩陣。
A對角矩陣B三角矩陣C稀疏矩陣D對稱矩陣
【解答】C
(6)若廣義表A滿足Head(A)=Tail(A),則人為()
A()B(())C((),())D((),(),())
【解答】B
⑺下面的說法中,不正確的是()
A廣義表是一種多層次的結(jié)構(gòu)B廣義表是一種非線性結(jié)構(gòu)
C廣義表是一種共享結(jié)構(gòu)D廣義表是一種遞歸
【解答】B
【分析】從各層元素各自具有的線性關(guān)系講,廣義表屬于線性結(jié)構(gòu)。
(8)下面的說法中,不正確的是()
A對稱矩陣只須存放包括主對角線元素在內(nèi)的下(或上)三角的元素即可。
B對角矩陣只須存放非零元素即可。
C稀疏矩陣中值為零的元素較多,因此可以采用三元組表方法存儲。
D稀疏矩陣中大量值為零的元素分布有規(guī)律,因此可以采用三元組表方法存儲
【解答】D
【分析】稀疏矩陣中大量值為零的元素分布沒有規(guī)律,因此采用三元組表存儲。如果零元素
的分布有規(guī)律,
就沒有必要存儲非零元素的行號和列號,而需要按其壓縮規(guī)律找出相應(yīng)的映象函數(shù)。
3.判斷題
⑴數(shù)組是一種復(fù)雜的數(shù)據(jù)結(jié)構(gòu),數(shù)組元素之間的關(guān)系既不是線性的,也不是樹形的。
【解答】錯。例如二維數(shù)組可以看成是數(shù)據(jù)元素為線性表的線性表。
⑵使用三元組表存儲稀疏矩陣的元素,有時并不能節(jié)省存儲空間。
【解答】對。因為三元組表除了存儲非零元素值外,還需要存儲其行號和列號。
⑶稀疏矩陣壓縮存儲后,必會失去隨機(jī)存取功能。
【解答】對。因為壓縮存儲后,非零元素的存儲位置和行號、列號之間失去了確定的關(guān)系。
⑷線性表可以看成是廣義表的特例,如果廣義表中的每個元素都是單元素,則廣義表便成
為線性表。
【解答】對。
⑸若一個廣義表的表頭為空表,則此廣義表亦為空表。
【解答】錯。如廣義表L=((),(a,b))的表頭為空表,但L不是空表。
4.一個稀疏矩陣如圖4-4所示,寫出對應(yīng)的三元組順序表和十字鏈
表存儲表示。
【解答】對應(yīng)的三元組順序表如圖4-5所示,卜字鏈表如圖4-6所示。
5.已知A為稀疏矩陣,試從空間和時間角度比較采用二維數(shù)組和三元組順序表兩種不同的
存儲結(jié)構(gòu)完成
求運(yùn)算的優(yōu)缺點(diǎn)。
【解答】設(shè)稀疏矩陣為m行n歹I」,如果采用二維數(shù)組存儲,其空間復(fù)雜度為O(mXn);因
為要將所有的矩
陣元素累加起來,所以,需要用一個兩層的嵌套循環(huán),其時間復(fù)雜度亦為O(mXn)。如果采
用三元組順序
表進(jìn)行壓縮存儲,假設(shè)矩陣中有t個非零元素,其空間復(fù)雜度為O(t),將所有的矩陣元素累
加起來只需將
三元組順序表掃描一遍,其時間復(fù)雜度亦為O(t)。當(dāng)t?mXn時,采用三元組順序表存儲
可獲得較好的
時、空性能。
6.設(shè)某單位職工工資表ST由“工資”、“扣除”和“實發(fā)金額”三項組成,其中工資項包括
“基本工資”、“津貼”
和“獎金”,扣除項包括“水”、"電”和“煤氣”。
⑴請用廣義表形式表示所描述的工資表ST,并用表頭和表尾求表中的“獎金”項;
⑵畫出該工資表ST的存儲結(jié)構(gòu)。
【解答】⑴ST=((基本工資,津貼,獎金),(水,電,煤氣),實發(fā)金額)
Head(Tail(Tail(Head(ST))))=獎金
⑵工資表ST的頭尾表示法如圖4-7所示。
7.若在矩陣A中存在一個元素ai,j(0Wi<n-l,OWjWm-l),該元素是第i行元素中最小值
且又是第j列元
素中最大值,則稱此元素為該矩陣的一個馬鞍點(diǎn)。假設(shè)以二維數(shù)組存儲矩陣A,試設(shè)計一個
求該矩陣所有
馬鞍點(diǎn)的算法,并分析最壞情況下的時間復(fù)雜度。
【解答】在矩陣中逐行尋找該行中的最小值,然后對其所在的列尋找最大值,如果該列上的
最大值與該行
匕的最小值相等,則說明該元素是鞍點(diǎn),將它所在行號和列號輸出。
具體算法如下:
分析算法,外層for循環(huán)共執(zhí)行n次,內(nèi)層第一個for循環(huán)執(zhí)行m次,第二個for循環(huán)最壞
情況下執(zhí)行n
次,所以,最壞情況下的時間復(fù)雜度為0(mn+n2)。
8.已知兩個nXn的對稱矩陣按壓縮存儲方法存儲在已維數(shù)組A和B中,編寫算法計算對
稱矩陣的乘積。
【解答】對稱矩陣采用壓縮存儲,乘積矩陣也采用壓縮存儲。注意矩陣元素的表示方法。
第5章樹和二叉樹
課后習(xí)題講解
i.填空題
⑴樹是n(nNO)結(jié)點(diǎn)的有限集合,在一棵非空樹中,有()個根結(jié)點(diǎn),其余的結(jié)點(diǎn)分成
m(m>0)個
()的集合,每個集合都是根結(jié)點(diǎn)的子樹。
【解答】有且僅有一個,互不相交
⑵樹中某結(jié)點(diǎn)的子樹的個數(shù)稱為該結(jié)點(diǎn)的(),子樹的根結(jié)點(diǎn)稱為該結(jié)點(diǎn)的(),該結(jié)點(diǎn)
稱為其子樹根
結(jié)點(diǎn)的()o
【解答】度,孩子,雙親
⑶一棵二叉樹的第i(i2l)層最多有()個結(jié)點(diǎn);一棵有n(n>0)個結(jié)點(diǎn)的滿二叉樹共
有()個葉子
結(jié)點(diǎn)和()個非終端結(jié)點(diǎn)。
【解答】2i-l,(n+l)/2,(n-l)/2
【分析】設(shè)滿二叉樹中葉子結(jié)點(diǎn)的個數(shù)為nO,度為2的結(jié)點(diǎn)個數(shù)為n2,由于滿二叉樹中不
存在度為1的
結(jié)點(diǎn),所以n=nO+n2;由二叉樹的性質(zhì)nO=n2+l,得nO=(n+l)/2,n2=(n-l)/2°
(4)設(shè)高度為h的二叉樹上只有度為0和度為2的結(jié)點(diǎn),該二叉樹的結(jié)點(diǎn)數(shù)可能達(dá)到的最大
值是(),最
小值是()。
【解答】2h-
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 職業(yè)規(guī)劃設(shè)計培訓(xùn)
- 奮進(jìn)新征程建功新時代心得感悟10篇
- 物業(yè)員工述職報告(7篇)
- 語文學(xué)期教學(xué)總結(jié)
- 雷鋒英雄事跡材料心得
- 投標(biāo)承諾書(15篇)
- 有關(guān)土木工程實習(xí)報告范文合集七篇
- 在校大學(xué)生求職信15篇
- 單位銷售年終個人總結(jié)及
- 誠信考試主題演講稿7篇
- 大眾傳媒文化智慧樹知到期末考試答案章節(jié)答案2024年復(fù)旦大學(xué)
- 人教部編版三年級道德與法治上冊全冊教案(全冊)
- 中心靜脈壓CVP監(jiān)測專家講座
- 大豆購貨合同范本(2024版)
- 裝修出租合同范本
- 任命基金管理人協(xié)議
- 研學(xué)旅游基地設(shè)計方案
- 張成福《公共管理學(xué)》(修訂版)課后習(xí)題詳解
- 托育、早教中心崗位績效考核標(biāo)準(zhǔn)
- 小罐茶行業(yè)分析報告
- 福建省國土空間規(guī)劃(2021-2035年)公眾版
評論
0/150
提交評論