計算機軟件技術(shù)基礎(chǔ)及實驗指導(dǎo) 席曉慧 袁玲 第4章 數(shù)據(jù)結(jié)構(gòu)_第1頁
計算機軟件技術(shù)基礎(chǔ)及實驗指導(dǎo) 席曉慧 袁玲 第4章 數(shù)據(jù)結(jié)構(gòu)_第2頁
計算機軟件技術(shù)基礎(chǔ)及實驗指導(dǎo) 席曉慧 袁玲 第4章 數(shù)據(jù)結(jié)構(gòu)_第3頁
計算機軟件技術(shù)基礎(chǔ)及實驗指導(dǎo) 席曉慧 袁玲 第4章 數(shù)據(jù)結(jié)構(gòu)_第4頁
計算機軟件技術(shù)基礎(chǔ)及實驗指導(dǎo) 席曉慧 袁玲 第4章 數(shù)據(jù)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩141頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論