




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
計算機軟件技7性礎(chǔ)安喙機能件也喳礎(chǔ).一四密盤曲易1的一
第四章數(shù)據(jù)結(jié)構(gòu)
長嫡學(xué)信息工程學(xué)院計算機基礎(chǔ)教學(xué)部
............1
計算機軟件技才基礎(chǔ)計算機軟件拉尤基礎(chǔ)
§4.1數(shù)據(jù)結(jié)構(gòu)概述
?§4.1.1數(shù)據(jù)結(jié)構(gòu)的定義
1、數(shù)據(jù)(data):數(shù)據(jù)是一些可以輸入到計算機中的描述客觀事物的符
號,即信息的載體。這些符號可以是數(shù)值、字符、圖象等。在計算機領(lǐng)
域,人們把能夠被計算機加工的對象,或者說能夠被計算機輸入、存
儲、處理、輸出的一切信息都叫做數(shù)據(jù)。
2、數(shù)據(jù)元素(element):數(shù)據(jù)元素是算法可以處理的最小數(shù)據(jù)單位,是
一個數(shù)據(jù)整體中相對獨立的元素。數(shù)據(jù)元素可以是簡單數(shù)據(jù),也可以由
若干個簡單數(shù)據(jù)(數(shù)據(jù)項)組成數(shù)據(jù)元素。數(shù)據(jù)和數(shù)據(jù)元素是相對而言
的,是整體和個體之間的關(guān)系。例如,對一個字符串來說,每個字符都
是它的數(shù)據(jù)元素;對一個數(shù)組來說,每個數(shù)組元素都是它的數(shù)據(jù)元素。
本書中,經(jīng)常將數(shù)據(jù)元素、數(shù)據(jù)結(jié)點、結(jié)點、記錄這些概念不加區(qū)別的
使用,它們表示的是同一概念。
長蛇學(xué)信息工程學(xué)院—^算機荃礎(chǔ)教學(xué)部2
計算機軟件技本若礎(chǔ)計菖“底件歸基此―一^計皿器傕版
3、數(shù)據(jù)項:數(shù)據(jù)元素由更小的單位——數(shù)據(jù)項Qtem)(或成員)所組成,一
個記錄一般包括一個或若干個數(shù)據(jù)項。
4、數(shù)據(jù)之間的聯(lián)系:現(xiàn)實世界中的客觀對象在計算機中是用數(shù)據(jù)來描述
的,在現(xiàn)實世界當(dāng)中,客觀對象是有聯(lián)系的,因此數(shù)據(jù)之間也是有聯(lián)系的,
數(shù)據(jù)聯(lián)系是數(shù)據(jù)本身所具有的特性。
5、數(shù)據(jù)結(jié)構(gòu)(datastructure):簡單的說,數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)和數(shù)據(jù)
之間聯(lián)系的一門學(xué)科,它包括三個方面。
①數(shù)據(jù)的邏輯結(jié)構(gòu)
②數(shù)據(jù)的物理結(jié)構(gòu)
③數(shù)據(jù)的運算
數(shù)據(jù)結(jié)構(gòu)通常用二元組表示,其形式如下:
Data_struct=(D,R)
其中5為數(shù)據(jù)元素的集合,R為數(shù)據(jù)元素之間關(guān)系的集合。即:
D={ai|1WiWn,nNO}
R={rj|1WjWm,mN1}
ai為第i個數(shù)據(jù)元素,n為數(shù)據(jù)元素的個數(shù),特別地,當(dāng)n=0,D為空集,則
無結(jié)構(gòu)可言。rj表示第j個關(guān)系,m為關(guān)系的個數(shù)。
計算機基礎(chǔ)教學(xué)部3
計算機軟件裝木基礎(chǔ)_安奧/絲件拉比基礎(chǔ)一皿IMk園儂砒
§4.1.2數(shù)據(jù)結(jié)構(gòu)的基本內(nèi)容
數(shù)據(jù)結(jié)構(gòu)的基本內(nèi)容包括數(shù)據(jù)的邏輯結(jié)構(gòu)、數(shù)據(jù)的存儲結(jié)構(gòu)和數(shù)據(jù)的運
算。
1、數(shù)據(jù)的邏輯結(jié)構(gòu)
數(shù)據(jù)元素之間的邏輯關(guān)系就是數(shù)據(jù)的邏輯結(jié)構(gòu)。
一般情況下,一組數(shù)據(jù)元素并不是雜亂無章的,而是具有某種聯(lián)系形式。這
里的聯(lián)系形式指數(shù)據(jù)元素與元素間的相互關(guān)系。數(shù)據(jù)之間的聯(lián)系可以是固
有的,也可以是根據(jù)數(shù)據(jù)處理的需要人為定義的。數(shù)據(jù)元素之間的聯(lián)系方
式可分為一對一、一對多和多對多三種,根據(jù)數(shù)據(jù)元素之間聯(lián)系的不同特
性,數(shù)據(jù)的邏輯結(jié)構(gòu)通常有以下三種基本結(jié)構(gòu)。
①線性結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)元素之間的聯(lián)系方式是一對一的。
②樹形結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)元素之間的聯(lián)系方式是一對多的。
③圖形結(jié)構(gòu)或網(wǎng)狀結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)元素之間的聯(lián)系方式是多對多一
的。
通常&們也把數(shù)據(jù)的邏輯結(jié)構(gòu)分為線性結(jié)構(gòu)和非線性結(jié)構(gòu),樹形結(jié)構(gòu)和圖形
結(jié)構(gòu)統(tǒng)稱為非線性結(jié)構(gòu)。
研究數(shù)據(jù)結(jié)構(gòu)的目的是為了在計算機上實現(xiàn)對它的操作,因此還需研究如何
在計算機中表示數(shù)據(jù)結(jié)構(gòu)。
長蟒學(xué)信息工程學(xué)院一一二會算機基礎(chǔ)教學(xué)部4
計算機軟件技才基礎(chǔ)一ghg機軟件皮忙基礎(chǔ).計竟狐窿盤麗9為ik
2、數(shù)據(jù)的物理結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)(包括數(shù)據(jù)及其數(shù)據(jù)之間的關(guān)系)在計算機存儲器上的存儲表示稱為
數(shù)據(jù)的物理結(jié)構(gòu)或存儲結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)研究的是數(shù)據(jù)及其數(shù)據(jù)之間聯(lián)系的學(xué)
科,因此在研究數(shù)據(jù)的存儲結(jié)構(gòu)時,要求數(shù)據(jù)的存儲方式既能表示數(shù)據(jù)又能表
示數(shù)據(jù)之間的聯(lián)系。常用數(shù)據(jù)的存儲結(jié)構(gòu)有:
順序存儲
鏈?zhǔn)酱鎯?/p>
索引存儲
哈希存儲
順序存儲結(jié)構(gòu)的特點是借助元素在存儲器中的相對位置來表示數(shù)據(jù)元素之間的
關(guān)系;鏈?zhǔn)酱鎯Y(jié)構(gòu)是借助指示元素存儲位置的指針表示數(shù)據(jù)元素之間的關(guān)
系;索引存儲結(jié)構(gòu)是為存儲的數(shù)據(jù)建立一個索引表,訪問數(shù)據(jù)時先在索引表中
查找,再根據(jù)索引表的相關(guān)信息訪問數(shù)據(jù);哈希存儲是建立數(shù)據(jù)的關(guān)鍵字和存
儲地址之間的對應(yīng)關(guān)系(哈希函數(shù)),這樣訪問一個數(shù)據(jù)時丁可根據(jù)哈希函數(shù)
直接獲得該數(shù)據(jù)在計算機中的存儲地址,到該地址訪問數(shù)據(jù)。
長鎮(zhèn)學(xué)信息工程學(xué)院――二會算機基礎(chǔ)教學(xué)部5
計算機軟件技木基礎(chǔ)計算機軟件技才基礎(chǔ)
由于數(shù)據(jù)的存儲結(jié)構(gòu)有多種,所以一種數(shù)據(jù)的邏輯結(jié)構(gòu)可以根據(jù)需要表示成
一種或多種存儲結(jié)構(gòu),只要存儲結(jié)構(gòu)既能表示數(shù)據(jù),也能表示數(shù)據(jù)之間的聯(lián)
系或者存儲結(jié)構(gòu)能滿足用戶對數(shù)據(jù)的某種操縱要求即可。在后面的章節(jié)中,
讀者可根據(jù)具體的存儲實例了解到一種數(shù)據(jù)的邏輯結(jié)構(gòu)可以采用不同的存儲
方式進行存儲。
數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)兩個密切相關(guān)的方面,以后讀者可看
到,一個算法的設(shè)計取決于選定的邏輯結(jié)構(gòu),而算法的實現(xiàn)依賴于采取的存
儲結(jié)構(gòu)。算法的設(shè)計取決于數(shù)據(jù)的邏輯結(jié)構(gòu),算法的實現(xiàn)依賴于采用的存儲
結(jié)構(gòu),在不產(chǎn)生誤解的情況下我們也將數(shù)據(jù)的邏輯結(jié)構(gòu)稱為數(shù)據(jù)結(jié)構(gòu)
如何描述存儲結(jié)構(gòu)呢?雖然存儲結(jié)構(gòu)涉及數(shù)據(jù)元素及其關(guān)系在存儲器中的存
儲方式,但由于本書是在高級語言的層次上討論數(shù)據(jù)結(jié)構(gòu)的操作,因此可以
借助高級語言中提供的“數(shù)據(jù)類型’來描述它。例如可以用C語言中提供的“數(shù)組
類型”來描述順序存儲結(jié)構(gòu),用“指針”來構(gòu)造鏈?zhǔn)酱鎯Y(jié)構(gòu)。
長鎮(zhèn)學(xué)信息工程學(xué)院――二會算機基礎(chǔ)教學(xué)部6
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
3、數(shù)據(jù)的運算
研究數(shù)據(jù)結(jié)構(gòu),除了研究數(shù)據(jù)結(jié)構(gòu)本身以外,還要研究與數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)的運
算。這里的運算是指對數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)元素進行的操作處理,而這些操作與
數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)有直接的關(guān)系,結(jié)構(gòu)不同,則實現(xiàn)方法也不同。運
算的種類很多,但常用的有以下幾種:
檢索(查找):在給定的數(shù)據(jù)結(jié)構(gòu)中,找出滿足一定條件的結(jié)點來,這個條件往
往是一個或幾個數(shù)據(jù)項的值。
排序:根據(jù)給定的條件,將數(shù)據(jù)結(jié)構(gòu)中所有結(jié)點重新排列順序
插入:在給定的數(shù)據(jù)結(jié)構(gòu)中,根據(jù)某些條件,將一個結(jié)點插入到一個合適的位
置。
刪除「在給定的數(shù)據(jù)結(jié)構(gòu)中,根據(jù)某些條件,將一個結(jié)點刪除。
修改:修改數(shù)據(jù)結(jié)構(gòu)中某些結(jié)點的值。
運算的種類很多,同一種運算也存在各種各樣的算法。在一種數(shù)據(jù)結(jié)構(gòu)中要進行
那一種或那幾種運算,往往取決于要解決的實際問題。完成一種指定的運
算,當(dāng)然要選一種最好的算法。但對一種具體的數(shù)據(jù)結(jié)構(gòu)來說,完成一種運
算的效率較高,完成另外一種則可能較低,對另一種數(shù)據(jù)結(jié)構(gòu)來說,情況可
能正好相反。因此,要解決一個實際問題,數(shù)據(jù)結(jié)構(gòu)的設(shè)計和算法的選擇要
結(jié)合起來考慮,對各種情況要反復(fù)比較,最終選擇一個較好的數(shù)據(jù)結(jié)構(gòu)和高
效率的算法。
長蟒學(xué)信息工程學(xué)院一一二會算機基礎(chǔ)教學(xué)部7
計算機軟件技木基礎(chǔ)計算機軟件技刁七基礎(chǔ)
§4.2線性表
?§4.2.1線性表的邏輯結(jié)構(gòu)
線性表(linearlist)是具有相同特性的數(shù)據(jù)元素的一個有限序列。該序列中
所含元素的個數(shù)叫線性表的長度,用n表示,n^Oo當(dāng)n=0時,線性表是一個
空表,即表中不包含任何元素。當(dāng)nWO時,設(shè)序列中的第i個元素為ai
(1WWn),則線性表的一般表示為:
(a1,a2,.......,ai,.......,an)
其中,a1為第一個元素,又稱為表頭元素,an為最后一個元素,又稱為表尾
元素。每一個元素在表中的位置用其下標(biāo)來表示。線性表具有如下特點:
長嫡學(xué)信息工程學(xué)院做算機整礎(chǔ)教學(xué)部8
計算機軟件技才基礎(chǔ)計算機軟件按方基僦一計篡,業(yè)隱露由匿匐限
1)線性表的數(shù)據(jù)元素ai具有相同特性,在不同的情況下含義不同??梢詾橐粋€
數(shù)、一個字符或更復(fù)雜的信息;在一個表中,ai類型必須相同。
2)表非空的情況下,除第一個元素以外,每個元素都有且僅有一個直接前驅(qū);除
最后一個元素以外,每個元素都有且僅有一個直接后繼。
線性表中的元素在邏輯上是有序的,即第i個元素處在第i-1和第i+1個元素的中
間,這種邏輯上的有序性就是一種線性關(guān)系,所以線性表的邏輯結(jié)構(gòu)是線性結(jié)
構(gòu)。
用二元組表示為:
Linear_list=(D,R)
D={ai|1WiWn,n20,aieelemtype}/*elemtype為任何數(shù)據(jù)類型*/
R={r|r=<ai,ai+1>1WiWn-1}
下面給出幾個線性表的例子:
('O',T,2,3',4,5,5,6,7',8,‘9‘,
(12,34,56,78,89,54,76,32,98)
("basic",“fortran",“pascal",“cobol")”
其中,第一個線性表數(shù)據(jù)元素為字符型,第二個線性表數(shù)據(jù)元素為數(shù)值型,第
三個線性表數(shù)據(jù)元素為字符串。
長鎮(zhèn)學(xué)信息工程學(xué)院――二會算機基礎(chǔ)教學(xué)部9
?§4.2.2線性表的存儲結(jié)構(gòu)
線性表的存儲結(jié)構(gòu)有兩種,即順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu)。具有順序存
儲結(jié)構(gòu)的線性表稱為順序表,具有鏈?zhǔn)酱鎯Y(jié)構(gòu)的線性表稱為線性鏈
表。根據(jù)不同的需要對線性表可以進行多種操作,其基本運算有:
1.清表清除表中的結(jié)點使其成為空表。
2.排序根據(jù)給定的條件,將表中結(jié)點重新排列順序。
3.插入根據(jù)條件在表中插入一個結(jié)點。
4.刪除根據(jù)某些條件,將一個結(jié)點刪除。
5.修改修改表中給定結(jié)點的值。
6.檢索(查找)查找表中某一特征的結(jié)點。
7.求長求線性表的長度。
對線性表所采取的存儲結(jié)構(gòu)不同,其實現(xiàn)方法也不一樣。下面分別介紹。
長嫡學(xué)信息工程學(xué)院做算機整礎(chǔ)教學(xué)部10
計算機軟件技才基礎(chǔ)計算機軟件拉尤基礎(chǔ)
1、線性表的順序存儲結(jié)構(gòu)及其算法
線性表的順序存儲結(jié)構(gòu)是線性表的一種最簡單的存儲結(jié)構(gòu),其存儲方法是:在
內(nèi)存中為線性表開辟一塊連續(xù)的存儲空間,該存儲空間所包含的存儲單元數(shù)要
大于等于線性表的長度(假定每個存儲單元存儲線性表中的一個元素)。
因為一個數(shù)組在內(nèi)存中占據(jù)一段連續(xù)的存儲單元,所以可以借助數(shù)組來為線性
表的順序存儲開辟空間,如圖4.1所示。其中L為每個元素占據(jù)的字節(jié)數(shù),
Loc(a1)為線性表的起始地址。
另外為了存儲線性表的長度,還要定
義一個整型變量。若將線性表的順序
存儲結(jié)構(gòu)定義為一個數(shù)組與一個整型
變量,則可將它們放在一個結(jié)構(gòu)體
中,C語言定義形式為:
#defineN1000/*N為線性表的最
大元素個數(shù)*/
typedefstructlist
{elemtypev[N];
intlen;
}LIST;
其中,N為線性表開辟的存儲單元
數(shù),可以根據(jù)需要改變其大下。
elemtype為線性表中元素的類型。
長頓學(xué)信息工程學(xué)院――算峨礎(chǔ)教學(xué)部11
計算機軟件技才基礎(chǔ)計算方破隹拄本基礎(chǔ)一計算址密編的透A礎(chǔ)
|拿湖瞄洞本笑熏器搦睡海您泓的涮腳隅腳湖售海踞海腮涌湖㈱貨附眼黑輜袋。陽藤㈱陽率過舟淞皓抵瞄網(wǎng)錦湖㈱湖㈱泌㈱裝舟除淵樂捻湖群焚哥海涮舟網(wǎng)新
1|數(shù)犯下產(chǎn)01.i-li…L.康出
L.v@+L.V[1]P…?L.v[i-1]^L.v[i)^…―|Lv[L.Len?li
(a)插入前。
!防蛆下標(biāo)01…i-lii+1L!至北
Lv叨/L.v[l]...「L.v[i-1]^x/L.v[i+1]^...?|L.Y[Llen?l]o-
(b)插入后。
圖4.2順序存儲結(jié)構(gòu)插入運邕示意圖“
[&娜那觸蝌履軸溺腐凝撇薄海燃微解剛息液瓣溺燃潮魂趣題旗源施軸,舞蝴㈱◎攜舟除鼓腕勰弱獴廉赧建㈱海版耕浦海誨蟠睇薄懈腕蜩辛海期解談源通轉(zhuǎn)㈱回從算法中可見,當(dāng)i的位置不
①插入運算合適時,插入無法進行。當(dāng)
根據(jù)給定的條件不同,插入算法也不一樣,如果要表中有L.len個元素時,插入
在線性表L的第i(OWiWL.Ien)個位置上插入一個元位置可以是從0到L.len。當(dāng)
素x,那么只需要將第i個元素及其以后的所有元素插入位置在最后一個元素的
后移一位,第i個位置上存入x,線性表的長度加后邊(即下標(biāo)L.len)時,不
1,如圖4.2所示。需要移動元素。
LISTinslist(LISTL,inti,elemtypex)如果插入條件是:在線性表
{if(L.len==N)
中的某一元素之前(或之
printf("OVERFLOW\n");
elseif(i<O)||(i>L.len)后)插入一一兀素,則應(yīng)先查
printfC'positionERROR\n!,);找該元素的位置,然后利用
else上述方法實現(xiàn)即可。從圖4.2
{for(j=L.len-1;j>=i;j-)讀者可以看到在數(shù)據(jù)x插入
L.v[j+1]=L.v[j];L.v[i]=x;L.len++;}前后,線性表的有效元素都
returnL是從下表0到下標(biāo)L.len-1。
讀者可自行編寫該算法。
長蟒學(xué)信息工程學(xué)院一一二會算機基礎(chǔ)教學(xué)部13
計算機軟件技木基礎(chǔ)計算機軟件技才基礎(chǔ)
②刪除運算
將線性表中的第i個元素刪除的情況,可以用圖4.3所示的方法實現(xiàn)。
下標(biāo)01................7i................L.len-2VLSz.SlAeAAn/V-1^
L.v[O]。LM1]P…dLv[i-1]^ILvfil^??)LArfLJen-2]^L.vKJen-1]^
(a)刪除前。
下標(biāo)0----------------1-------------------------------卜1-------------------1---------------------------------UerfelUen
Lv[i-l]pILv[i]^Ly[L.len-l]^L.v[L.len]-k
LylO]^Ly[lp???SAAAz**\WVV*V,???~
(b)刪除后。
圖4.3順序存儲結(jié)構(gòu)刪除運算示意圖“
只要將從第i+1個元素到最后一個元素向前各移動
從算法中可見,當(dāng)i的位置不合
一個元素,表的長度減一即可。相應(yīng)的算法為:
適時,刪除無法進行。
LISTdellist(LISTL,inti)/*刪除線性表L中的第i
從圖4.3讀者同樣可以看到,在
個元素*/
第i個元素刪除前后,線性表的
{if(i<O)||(i>=L.len)
有效元素都是從下表0到下標(biāo)
printfC'positionERROR'n");
L.len-1o
else
如果刪除條件是:刪除線性表
{for(j=i+1;j<=L.len-1;j++)
中某一特定元素x,則應(yīng)先查找
L.v[j-1]=L.v[j];
該元素x的位置,然后利用上述
L.len-;
方法實現(xiàn)即可。讀者可自行編
)
寫該算法。
returnL
}
長蟒學(xué)信息工程學(xué)院「一二會算機基礎(chǔ)教學(xué)部14
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
③檢索(查找)
在線性表而t橐值為x的元素,檢索的方法很多,有順序檢索、折半檢
索、分塊檢索、散列檢索等。下面僅介紹順序檢索,方法是,從線
性表的第一個元素起,依次使每一個元素與值為x的元素進行比
較,直到某個元素與X相等(既查找成功)或查完所有元素都找不
到值為X的元素(查找失敗)為止。算法為:
intsearchlist(LISTL,elemtypex)
{for(i=0;i<L.len-1&&L.v[i]!=x;i++);
if(i==L.len)
{printfC'notfound\n,");return-1;}
else
returni;
}
2、線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)及其算法
所謂鏈?zhǔn)酱鎯Y(jié)構(gòu)是用戶在編寫程序時,利用高級語言提供的功能自己構(gòu)建
的存儲結(jié)構(gòu)。用戶根據(jù)自己存儲數(shù)據(jù)的需要,向計算機系統(tǒng)申請隨機的存儲
單元,再將這些存儲單元利用指針聯(lián)系起來,構(gòu)成鏈表。利用鏈?zhǔn)酱鎯Y(jié)構(gòu)
存儲線性表,把線性表的第一個元素存儲在鏈表的第一個結(jié)點,線性表的第
二個元素存儲在鏈表的第二個結(jié)點,…,線性表的最后一個元素存儲在鏈表
最后一個結(jié)點。
長蟒學(xué)信息工程學(xué)院一一二會算機基礎(chǔ)教學(xué)部15
計算機軟件技7座礎(chǔ)計冬山法件也匕基礎(chǔ)一分強加德偏位卮
結(jié)點地址■結(jié)點示意結(jié)點序號
[以”:頭結(jié)點
dl_^*ZZ第一個結(jié)點
ald2
d2第二個結(jié)點
第三個結(jié)點
第n個結(jié)點
這樣邏輯在前的元素,在鏈表中的位置鏈?zhǔn)酱鎯Y(jié)構(gòu)不要求邏輯上相鄰的元
也在前(注意:不是地址單元在前,實素物理位置(存儲地址)也相鄰。它
際上d1,d2,…,dn為隨機值,di與di+1的值的存儲特點是,用隨機的存儲單元存
之間沒有誰大誰小的關(guān)系),利用指針儲線性表中的元素,其存儲空間可連
訪問鏈表中的結(jié)點時,通常是通過頭指續(xù)、也可以不連續(xù)。因為存儲空間不
針獲得邏輯上的第一個結(jié)點的地址,通要求連續(xù)性,所以在存儲完每一個數(shù)
過第一個結(jié)點獲得第二個結(jié)點的地據(jù)元素的內(nèi)容以后,還應(yīng)指出下一元
址,…,因次對鏈?zhǔn)酱鎯Φ木€性表訪問素的存儲位置,將這兩部分信息共同
時,邏輯在在前的元素訪問也在前。我稱為一個結(jié)點。,因此我們說,在線
們稱隨機存儲順序訪問。性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)中利用指針表示
了元素之間邏輯上的順序關(guān)系。
長嫡學(xué)信息工程學(xué)院工營算機基礎(chǔ)教學(xué)部
計算機軟件技才基礎(chǔ)計算機軟件按方基僦一計篡,業(yè)隱露由匿匐限
一個鏈接表由n(n20)個結(jié)點組成,當(dāng)n=0時稱為空表。每一個結(jié)點中
的指針域可以有一個,也可以有兩個。有一個指針域的鏈表稱為單鏈
表,其中的指針域存儲數(shù)據(jù)元素的后繼結(jié)點的位置。有兩個指針域的鏈
表稱為雙鏈表,其中一個指針域存儲數(shù)據(jù)元素的后繼結(jié)點的位置,另一
個指針域存儲數(shù)據(jù)元素的前驅(qū)結(jié)點的位置。下面我們介紹單鏈表幾個常
見的算法。
單鏈表的定義如下:
typedefstructnode
{elemtypedata;
structnode*next;
}NODE;
NODE*H;
設(shè)單鏈表H中有n個元素,分別為(a1,a2,……an),可以用圖4.4描述單鏈
表的結(jié)構(gòu)。
長蟒學(xué)信息工程學(xué)院「一二會算機基礎(chǔ)教學(xué)部17
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
其中H為單鏈表中第一個結(jié)點的地址,稱為頭指針。最后一個元素an所
在的結(jié)點不存在后繼,因此其指針域的值為空(NULL),從上面的結(jié)構(gòu)中
可以看到,鏈表在存儲空間上的要求比線性表要付出更大的代價,因為
它除了存儲數(shù)據(jù)元素外,還要存儲每個元素的后繼元素的位置。
判斷一個鏈表為空的條件為:H==NULLO
為了便于計算機算法編寫,在單鏈表的第一個元素所在的結(jié)點之前附設(shè)
一個結(jié)點一頭結(jié)點。頭結(jié)點的指針域存放第一個元素所在結(jié)點的存儲
位置,數(shù)據(jù)域不存儲任何信息,因此單鏈表的頭指針指向頭結(jié)點,如圖
4.5(a)為帶頭結(jié)點的單鏈表的一般形式。如圖4.5(b)為帶頭結(jié)點的
單鏈表為空時的形式。
H-*----------->a1-----?a2------*.=----------*anNULL
(a)帶頭結(jié)點的單鏈表
H—>/y/S?JLL
(b)帶頭結(jié)點的空單鏈表
圖4.5帶頭結(jié)點的單鏈表示意圖
長鎮(zhèn)學(xué)信息工程學(xué)院一—二會算機基礎(chǔ)教學(xué)部18
計算機軟件技才基礎(chǔ)計算機軟件按方基僦一計篡,業(yè)隱露由匿匐限
判斷一個鏈表是否為空的條件是:H->next==NULL
鏈表加上頭結(jié)點以后將空表和非空表的處理統(tǒng)一起來,因而簡化了單鏈表的
實現(xiàn)算法。
下面介紹在這種存儲結(jié)構(gòu)上鏈表的幾個主要操作。
①帶頭結(jié)點單鏈表的查找
設(shè)H為一帶頭結(jié)點的單鏈表的頭指針,在線性表中查找第i(i>0)個元素所在的結(jié)點。
要查找單鏈表中的某一結(jié)點,必須從頭指針出發(fā),沿結(jié)點的指針域往后找直到找到
所要結(jié)點為止。算法如下:
NODE*get(NODE*H,inti)
{NODE*p;
intj=1;
p=H->next;
while((p!=NULL)&&(j<i))
{p=p->next;
j++;
)
if(p!=NULL)
returnp;/*返回指向待查找結(jié)點的指針*/
else
returnNULL;/*查找的位置不合適*/
)
查找元素的時間復(fù)雜度為0(n)。
長蟒學(xué)信息工程學(xué)院「一二下算機基礎(chǔ)教學(xué)部19
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
②帶頭結(jié)點單鏈表的插入
設(shè)H為一帶頭結(jié)點的單鏈表的頭指針,在線性表的兩個元素a和c之間插入一個
元素b,設(shè)p為存儲數(shù)據(jù)元素a結(jié)點地址的指針變量,設(shè)q為存儲數(shù)據(jù)元素b結(jié)
點地址的的指針變量,如圖4.6(a)所示
在一個以鏈?zhǔn)酱鎯Φ木€性表的某個位置上插入一個結(jié)點,只需要改變其鏈
接關(guān)系就可以。從圖中可以看出插入結(jié)點b時,需要修改兩個指針,將a結(jié)
點的指針域的值由指向結(jié)點c改為指向結(jié)點b,再使結(jié)點b的指針域的值指
向結(jié)點c,從而實現(xiàn)改變a,b和c之間的鏈接關(guān)系,插入后各元素的關(guān)系如
圖4.6(b)所示。修改指針關(guān)系的語句為:
q->next=p->next;p->next=q;
長鎮(zhèn)學(xué)信息工程學(xué)院一—二會算機基礎(chǔ)教學(xué)部20
計算機軟件技木基礎(chǔ)計算機軟件技才基礎(chǔ)
下面的算法是在鏈表H中第i個位置上插入一元素為x的結(jié)點:
voidinsnode(NODE*H,inti,intx)
{NODE*p,*q;
if(i==1)p=H;
else
p=get(H,i-1);/*查找插入元素的位置*/
if(p!=NULL)
{q=(NODE*)malloc(sizeof(NODE));
q->date=x;
q->next=p->next;p->next=q;/*實現(xiàn)插入*/
)
else
printf("iv1或者i>表長,插入位置錯誤\rT);
)
與順序表的插入比較,鏈表的插入更容易實現(xiàn),不需要移動元素,只須修改
兩個指針,時間復(fù)雜度為0(1)。但是為了找到插入位置,需花費的時間復(fù)雜
度為。(n)。
長蟒學(xué)信息工程學(xué)院「一二會算機基礎(chǔ)教學(xué)部21
計算機軟件裝本勢礎(chǔ)_安奧/座件拉比基礎(chǔ)一皿IMk園儂砒
③帶頭結(jié)點單鏈表的刪除
刪除操作而插入基本相Q,應(yīng)先找到待刪結(jié)點的前驅(qū)結(jié)點的位置后再完成刪
除。如圖4.7(a)所示,設(shè)b為待刪除的元素,p為指向待刪元素的前一結(jié)點
的指針,刪除結(jié)束后元素a的后繼由b改為c,操作中將b所在結(jié)點的地址記為
q,以便處理和回收結(jié)點,如圖4.7(b)所示。
刪除語句為:
q=p->next;p->next=q->next;free(q);
長鎮(zhèn)學(xué)信息工程學(xué)院一—二會算機基礎(chǔ)教學(xué)部22
計算機軟件技木基礎(chǔ)計算機軟件技才基礎(chǔ)
下面的算法是在頭指針為H的帶頭結(jié)點的單鏈表中刪除第i個結(jié)點:
voiddelnode(NODE*H,inti)
{NODE*p,*q;
if(i==i)p=H;
else
p=get(H,i-1);/*查找刪除元素的位置*/
if((p==NULL)||(p->next==NULL))
printf("表中無E匕結(jié)點\n");
else
{q=p->next;
p->next=q->next;
free(q);
)
)
與順序表的刪除比較,鏈表的刪除也更容易實現(xiàn),不需要移動元素,
只須修改幾個指針,時間復(fù)雜度為0(1)。同樣為了找到刪除位置,需
花費的時間復(fù)雜度為0(n)。
長蟒學(xué)信息工程學(xué)院「一二會算機基礎(chǔ)教學(xué)部23
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
?§423算法評價及改進算法的各種策略
在前面兩節(jié)我們講解了線性表的兩中存儲方式,在這兩種存儲方式中我
們采用了不同的方式將線性表表示到計算機中。用這兩種存儲方式存儲
線性表時,既表示了數(shù)據(jù),也表示了數(shù)據(jù)之間的聯(lián)系,同時我們看到,
在實現(xiàn)線性表的相關(guān)運算(查找、插入、刪除)時,兩種存儲結(jié)構(gòu)采用
的算法完全不同,正如我們在§4.1.1.中所講:算法的設(shè)計取決于數(shù)據(jù)的
邏輯結(jié)構(gòu),算法的實現(xiàn)依賴于采用的存儲結(jié)構(gòu)。下面我們分析線性表的
順序存儲和鏈?zhǔn)酱鎯υ谕瓿删€性表的插入和刪除算法的時間復(fù)雜度和空
間復(fù)雜度。
1、算法評價
①時間復(fù)雜度
前面在§2.2.3節(jié)中,我們講到算法的時間復(fù)雜度的估算通常有兩中方法:
平均運算量和最壞的情況,對于具有n個元素的線性表的插入算法,在線
性表第12…,i,i+1個位置任意一個位置進行插入在實際運行時都有
可能,一個算法在實際使用的過程中,運行的次數(shù)很大,因此在任意一
個位置的插入運算可以看做是一個隨機量,在進行平均運算量的估算
時,按在每個位置插入的概率是均等的。
■■計算機基礎(chǔ)教學(xué)部24
計算機軟件技后若礎(chǔ)力啰機能1的座礎(chǔ)一±匕算四/盤函■1通—
下面我們估算線性表的順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu)的時間復(fù)雜度。
順序存儲結(jié)構(gòu):順序存儲的線性表在第i個位置進行插入時,應(yīng)將i到n個位置上的
元素依次向后移動,將要插入的元素存儲到第i個存儲單元,實現(xiàn)在線性表的第i
個位置插入元素的運算。
插入的位置數(shù)據(jù)移動的次數(shù)
n+10
n1
n-12
n-23
in-i+1
1n
在等概率的情況下,順序存儲的線性表中插入運算的平均運算量為:,
?+1X+111?+1y.
ASL=FjCj=------j+1|=------▽-j4-1,=—
H+1%+1H2
從上面的分析我們看到,線性表的順序存儲結(jié)構(gòu),在等概率的前提下平均運算量和數(shù)據(jù)
規(guī)模n是線性關(guān)系,也就是說平均運算量隙鰥規(guī)模的噌大線性噌長,其時間復(fù)雜度可表示
為:0(n)。0
長嫡學(xué)信息工程學(xué)院工次算機基礎(chǔ)教學(xué)部25
計算機軟件技木基礎(chǔ)計算機軟件技才基礎(chǔ)
鏈?zhǔn)酱鎯Y(jié)構(gòu):在鏈?zhǔn)酱鎯Φ木€性表的第i個位置插入元素,只要能夠獲得一個
指向第i-1個元素的指針,插入運算只需要進行下列面的兩個基本運算:
q->next=p->next;
p->next=q;
換句話說,線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)的插入運算的基本運算量,和插入的位置
無關(guān),在線性表的任意位置插入元素的基本運算量均為2,基本運算量不隨數(shù)
據(jù)規(guī)模的增長而變化,其時間復(fù)雜度為:0(1)
②空間復(fù)雜度
假設(shè)線性/的每個元素存儲到計算機中,向系統(tǒng)申請的字節(jié)數(shù)為k,線性
表長度為n。
用順序存儲結(jié)構(gòu)存儲線性表,則相應(yīng)的算法運行時,向系統(tǒng)申請的臨時
空間字節(jié)數(shù)為:
k*n
用鏈?zhǔn)酱鎯Y(jié)構(gòu)存儲線性表,每個結(jié)點的指針域向系統(tǒng)申請的字節(jié)數(shù)為
2,則相應(yīng)的算法在運行時向系統(tǒng)申請的臨時空間字節(jié)數(shù)為:
(k+2)*n
長蟒學(xué)信息工程學(xué)院「一二會算機基礎(chǔ)教學(xué)部26
計算機軟件技木基礎(chǔ)計算機軟件技才基礎(chǔ)
用線性表兩種不同的存儲方式設(shè)計算法時,從向系統(tǒng)申請的總的字節(jié)數(shù)來說,
鏈?zhǔn)酱鎯Y(jié)構(gòu)由于每個結(jié)點除存儲線性表的元素外,還需開辟存儲下一個結(jié)點
地址的指針,因此鏈?zhǔn)酱鎯Y(jié)構(gòu)向系統(tǒng)申請的總字節(jié)數(shù)比順序存儲結(jié)構(gòu)多
((k+2)*n>k*n),但是,順序存儲的線性表向系統(tǒng)申請的是連續(xù)的存儲單
元(地址號連續(xù)的k*n個字節(jié)),而鏈?zhǔn)酱鎯Φ木€性表向系統(tǒng)申請的是隨機的
存儲單元(n個隨機的(k+2)字節(jié)單元),從這一點上說,順序存儲的線性
表比鏈?zhǔn)酱鎯Φ木€性表對系統(tǒng)存儲空間的要求高,鏈?zhǔn)酱鎯Φ木€性表的空間復(fù)
雜度比順序存儲的線性表的空間復(fù)雜度小,即從空間復(fù)雜度上講,鏈?zhǔn)酱鎯Φ?/p>
線性表優(yōu)于順序存儲的線性表。
比較線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)和順序存儲結(jié)構(gòu)編寫的線性表的插入算法,我們可
以看到,鏈?zhǔn)酱鎯Φ木€性表的算法的編寫對編程者有更高的要求。
綜上所述,線性表的鏈?zhǔn)酱鎯晚樞虼鎯Ω饔凶约旱奶攸c,程序設(shè)計者在實際
編程中可根據(jù)實際情況選擇相應(yīng)的存儲方式存儲線性表、操縱線性表。
查找算法的復(fù)雜度讀者可自行分析。
長蟒學(xué)信息工程學(xué)院「一二會算機基礎(chǔ)教學(xué)部27
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
2、算法的策略
①不帶頭結(jié)點的單鏈表和帶頭結(jié)點的單鏈表
通過前面的研究我們知道,鏈接存儲結(jié)構(gòu)是線性表的一種存儲方式。在構(gòu)造
鏈?zhǔn)酱鎯r我們采用的是將線性表的第1個元素存放放在單鏈表的第2個結(jié)
點,線性表的第2個元素存放放在單鏈表的第3個結(jié)點,…,線性表的第i個元
素存放放在單鏈表的第i+1個結(jié)點,…,這樣構(gòu)造的單鏈表我們稱為帶頭結(jié)點的
單鏈表,當(dāng)然在構(gòu)造單鏈表時我們也可以將線性表的第1個元素存放在單鏈表
的第1個結(jié)點,線性表的第2個元素存放放在單鏈表的第2個結(jié)點,…,線性表
的第i個元素存放放在單鏈表的第i個結(jié)點,…,這樣構(gòu)造的單鏈表我們稱為不
帶頭結(jié)點的單鏈表,因此我們說在構(gòu)造線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)時;是否帶頭
結(jié)點是一種構(gòu)造存儲的策略,在§4.2.2線性表的插入、刪除、查找運算中,
鏈?zhǔn)酱鎯Φ木€性表采用的是帶頭結(jié)點的單鏈表,下面我們給出用不帶頭結(jié)點
的單鏈表存儲線性表插入運算的算法。用此算法和上面帶頭結(jié)點的單鏈表中
刪除第i個元素的算法進行比較,讀者可發(fā)現(xiàn)兩種方法的不同之處。
在不帶頭結(jié)點的單鏈表中進行操作時,要區(qū)分第一個結(jié)點和表中結(jié)點,因
為第一個結(jié)點的地址值發(fā)生變化后,表示鏈表的頭指針H的值也會發(fā)生變化
(參考圖4.4),比如刪除操作,若刪除的元素為a1,則刪除后H的值為a2
的地址,若是在帶頭結(jié)點的單鏈表中進行操作則不同(參考圖4.5
(a)),此時即使刪除的元素為a1,刪除后H的值也不會發(fā)生變化。
長鎮(zhèn)學(xué)信息工程學(xué)院一—二會算機基礎(chǔ)教學(xué)部28
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
voiddel(NODE*H,inti)/*將H為頭指針的鏈表中第i個結(jié)點刪除7
{NODE*p,*q;intm=1;
if(H!=NULL)
{q=H;
if(i==1)
{H=H->next;/*刪除表頭結(jié)點*/
free(q);)
else
{while(q!=NULL&&m<i)/*查找待刪結(jié)點q,q為第i個結(jié)點的前一結(jié)點7
{p=q;q=q->next;m++;}
if(q==NULL)
printf("%dnotbeenfound\n",i);/*沒找到待刪結(jié)點*/
else
{p->next=q->next;/*刪除結(jié)點q*/
free(q);}}}
else
printf("thelistempty\n");/*表空*/
)
通過帶頭結(jié)點和不帶頭結(jié)點兩種不同的存儲線性表的策略,我們明顯地看到,
在線性表的插入、刪除運算中,帶頭結(jié)點的單鏈表比不帶頭結(jié)點的單鏈表算法
思路簡潔、結(jié)構(gòu)簡單。
長鎮(zhèn)學(xué)信息工程學(xué)院一—二會算機基礎(chǔ)教學(xué)部29
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
②循環(huán)單鏈表和雙向鏈表
采用鏈?zhǔn)酱鎯Φ木€性表在算法設(shè)計中,對線性表的操作我們總是利用頭指針
找到被訪問的結(jié)點,對該結(jié)點進行訪問,而且這種訪問是單方向的(如果我
們需要訪問該結(jié)點的前一個結(jié)點,又必須從頭結(jié)點開始),這種情況下采用
單鏈表的存儲方式,運算的效率低。如果我們構(gòu)建循環(huán)單鏈表和雙向鏈表來
存儲線性表,這樣對上述情況將會有所改觀。
循環(huán)單鏈表
如果有一個單鏈表其表尾元素的指針域的值不為NULL,而讓它指向頭結(jié)
點,這樣的鏈表叫循環(huán)單鏈表或環(huán)形鏈表。圖4.8為帶頭結(jié)點的循環(huán)鏈表
示意圖:Halan...(a)循環(huán)單鏈表a2空的表循環(huán)單鏈表
圖4.8循環(huán)單鏈表示意圖H
(空的表循環(huán)單鏈表
圖4.8循環(huán)單鏈表示意圖
長鎮(zhèn)學(xué)信息工程學(xué)院一—二會算機基礎(chǔ)教學(xué)部30
計算機軟件技術(shù)基礎(chǔ)計算“附件拉本基礎(chǔ)一計翦扎次年拉展A礎(chǔ)
循環(huán)單鏈表與單鏈表的大部分操作相同,如插入、刪除、查找等。與單鏈表比較有
以下不同點。
a)判斷鏈表結(jié)束的條件不同。設(shè)p為鏈表中任意一結(jié)點的指針,在單鏈表中當(dāng)某
一結(jié)點p的next域指向NULL時,則說明鏈表操作結(jié)束(p->next==NULL)。而
在循環(huán)單鏈表中沒有指向NULL的指針,鏈表操作結(jié)束的條件應(yīng)為:某一結(jié)點p
的next域指向表頭結(jié)點(p->next==H)。
b)從單鏈表的某一結(jié)點出發(fā)只能訪問到其后繼結(jié)點,所需的時間復(fù)雜度為
0(1),而循環(huán)單鏈表除了能訪問結(jié)點p的后繼結(jié)點外,也能訪問其前驅(qū)結(jié)
點,其方法是從此結(jié)點出發(fā),找到滿足條件(q->next==p)的結(jié)點q,則q
為p的前驅(qū)結(jié)點,時間復(fù)雜度為0(n)。
c)采用單鏈表的形式存儲一個線性表,從一個結(jié)點出發(fā)只能夠訪問到該結(jié)點
的后繼結(jié)點,而采用循環(huán)單鏈表的形式存儲一個線表,從一個結(jié)點出發(fā)既
可以訪問到該結(jié)點的后繼結(jié)點,也可以訪問到該結(jié)點的前驅(qū)結(jié)點,也就是
說,從循環(huán)單鏈表的任意一個結(jié)點出發(fā),可以訪問該鏈表的任意一個結(jié)
點。
長鎮(zhèn)學(xué)信息工程學(xué)院一—二會算機基礎(chǔ)教學(xué)部31
計算機軟件技才基礎(chǔ)機能件拉市基礎(chǔ).一計常訕繞噩近造A礎(chǔ)一一
如果一個鏈表為循環(huán)鏈表,則許多操作可只對鏈表設(shè)一個尾指針,而沒有頭指
針,因為這樣更利于鏈表的操作,如鏈表的合并等。
上面我們我們對循環(huán)單鏈表存儲線性表進行了分析,我們看到采用循環(huán)單鏈表
的形式存儲線性表,從一個結(jié)點出發(fā),可以訪問到線性表的任意一個結(jié)點,但
如果從一個結(jié)點出發(fā)訪問該結(jié)點的前一個結(jié)點,則算法的運算量最大(需要將
線性表中的所有結(jié)點均掃描一遍),如果我們采用雙向鏈表的形式存儲線表,
這種情況可以得到改觀。
雙向鏈表
如果在每個結(jié)點上再增加一個指向線性表中每個元素的前驅(qū)結(jié)點的指針
prior,就可以很方便的找到前驅(qū)結(jié)點(p->prior)或后繼結(jié)點(p-
>next),這樣組織的鏈表可以使得我們從一個結(jié)點出發(fā),既可以向后
訪問該結(jié)點的后繼結(jié)點,也可以向前訪問該結(jié)點的前驅(qū)結(jié)點,因此我們
稱這樣的鏈表為雙向鏈表。有時為了滿足需要,也為了操作的方便,用
雙向鏈表對線性表進行定義和操作。
長蟒學(xué)信息工程學(xué)院「一二會算機基礎(chǔ)教學(xué)部32
才算機軟件技7理礎(chǔ)計票機婪件放江B礎(chǔ)一^拉血窕能攝幽抽
雙向鏈表的定義如下。
typedefstructdnode
{elemtypenum;
structnode*prior,*next;
}DNODE
其中prior為指向前趨結(jié)點的指針,next為指向后繼結(jié)點的指針。
圖4.9(a)為雙向鏈表的示意圖,圖4.9(b)為空的雙向鏈表的示意圖,
表,圖4.10(b)為空的循環(huán)雙鏈表。
長嫡學(xué)信息工程學(xué)院原版教學(xué)晶獨算機基礎(chǔ)教學(xué)部33
計算機軟件技才基礎(chǔ)計算機軟件拉尤基礎(chǔ)
在雙向鏈表中凡涉及一個方向的操作與單鏈表一樣。只是在做插入和刪除時的操
作不同。
1)定位刪除
設(shè)p為待刪結(jié)點的指針,如圖4.11所示,
刪除語句為:
p->prior->next=p->next;
p->next->prior=p->prev;
free(p);
長頓學(xué)信息工程學(xué)院—算理礎(chǔ)教學(xué)部34
計算機軟件技才基礎(chǔ)計算機軟件拉尤基礎(chǔ)
2)定位插入
設(shè)p為待插入結(jié)點的位置,待插結(jié)點指針為q,在p結(jié)點之前或之后
插入均可。如圖4.12為在p結(jié)點之前插入q結(jié)點的示意圖。
在p結(jié)點之前插入的語句可描述為:
q->prior=p->prior;P
p->prior->next=q;z
p->prior=q;1
q->next=p;q-xj
(a)插入前
描述為:
q->next=p->next;
p->next->prior=q;
p->next=q;
q->prior=p;
長頓學(xué)信息工程學(xué)院—算理礎(chǔ)教學(xué)部35
計算機軟件技術(shù)基礎(chǔ)計算機軟件垓定基礎(chǔ)___計算如正編由透副h
3、算法舉例:
例il寫出在帶有頭結(jié)點的循環(huán)鏈表L中查找第i個元素的算法。
include<stdio.h>
NODEcreat(intn)/*創(chuàng)建帶頭main()/*主函數(shù)*/
typedefstructnode結(jié)點的循環(huán)單鏈表*/{NODE*p,*q;inti,n;
{intdata;{intnum;chart='y';
structnode*next;NODE*head,*s,*p;printf("Pleaeinputthelengthof
}NODE;head=(NODE*)malloctheList
NODE*search(NODE*H(sizeof(NODE));scanf("%d",&n);
p=creat(n);
在帶頭結(jié)點的循環(huán)單鏈菜head->next=head;p=head;
inti)/*while(t=='y')
中查找第i個元素*/while(n>0)
{printf("Pleaseinputthe{printf("\nPleaseinputi=");
{NODE*p=H->next;
datas:");scanf("%d",&i);
intj=1;scanf("%d",&num);while(i>n||i<1)
while(j<i&&p->next!=H)s=(NODE*)malloc{printf("ERROR!Pleaeinputi
{p=p->next;(sizeof(NODE));again:\n");
scanf("%d",&i);}
j++;s->data=num;
q=search(p,i);
)s->next=p->next;
p->next=s;p=s;printf("\nDatais:%d\n",q->data);
W==j)printf("\nContinueOrNot?(y/n)
returnp;n=n-1;
)");
else
returnhead;scanf("\n%c",&t);
returnNULL;)})
長鎮(zhèn)學(xué)信息工程學(xué)院――二會算機基礎(chǔ)教學(xué)部36
計算機軟件技木基礎(chǔ)計算機軟件技才基礎(chǔ)
例2寫出一個將鏈表進行逆轉(zhuǎn)的算法。
#include<stdio.h>
typedefstructnode{intdata;structnode*next;}NODE;
main()
NODEturn(NODEH)/*逆轉(zhuǎn)
NODEcreat(intn)/*創(chuàng)建帶頭{NODE*p,*q,*t;intn,s;
函數(shù)7
結(jié)點的單鏈表*/printf("Pleaeinputthelengthof
{NODE*p=H,*q=H,*head;
{intnum;theList
head=(NODE
NODE*head,*s,*p;scanf("%d",&n);
*)malloc(sizeof(NODE));
head=(NODE*)malloct=creat(n);p=t;
while(p->next!=NULL)(sizeof(NODE));;
p=p->next;printf("Thelist'sdatais:\n")
head->next=NULL;while(p->n
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同欠款起訴費用3篇
- 農(nóng)產(chǎn)品購買合同的交貨條款3篇
- 工程設(shè)計施工合同范本的建設(shè)周期
- 土地使用權(quán)及房屋買賣合同3篇
- 買房授權(quán)委托書樣本格式3篇
- 勞動合同解除公告3篇
- 學(xué)生社會實踐承諾函3篇
- 合伙關(guān)系終止合同3篇
- 2025基于社區(qū)的阿爾茨海默病三級綜合防治中國專家共識
- 煤炭加工廠的環(huán)境影響評價與環(huán)境保護措施考核試卷
- 年產(chǎn)16萬噸赤蘚糖醇項目建議書
- 基層綜合治理法律培訓(xùn)課件
- 三軸攪拌樁驗收要求
- 2024年云南交投集團招聘筆試參考題庫含答案解析
- 高大支架坍塌事故原因分析及預(yù)防措施
- 跨境數(shù)據(jù)傳輸與安全保護
- 制衣廠安全隱患排查項目清單及排查表
- ISO13485質(zhì)量管理手冊
- 辯論賽PPT模板模板
- 發(fā)電廠貯灰場突發(fā)環(huán)境事件應(yīng)急預(yù)案
- 2023年高考全國乙卷作文“一花獨放不是春百花齊放春滿園”寫作
評論
0/150
提交評論