




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
重點(diǎn):順序表和鏈表上各種基本算法的實(shí)現(xiàn)及相關(guān)的時(shí)間性能分析難點(diǎn):線性表應(yīng)用的算法設(shè)計(jì)第二章線性表第二章線性表從第2章至第4章將討論線性結(jié)構(gòu)。線性結(jié)構(gòu)的特點(diǎn)是:在數(shù)據(jù)元素的非空有限集中,(1)存在唯一的一個(gè)被稱做“第一個(gè)”的數(shù)據(jù)元素;(2)存在唯一的一個(gè)被稱做“最后一個(gè)”的數(shù)據(jù)元素;(3)除第一個(gè)之外,集合中的每個(gè)數(shù)據(jù)元素均只有一個(gè)前驅(qū);(4)除最后一個(gè)之外,集合中每個(gè)數(shù)據(jù)元素均只有一個(gè)后繼。2023/7/10卓月明2第二章線性表2.1線性表的類型定義2.2線性表的順序表示和實(shí)現(xiàn)2.3線性表的鏈?zhǔn)奖硎竞蛯?shí)現(xiàn)2.3.1線性鏈表2.3.2循環(huán)鏈表2.3.3雙向鏈表2.4一元多項(xiàng)式的表示及相加(基于線性表的應(yīng)用)作業(yè)2023/7/10卓月明32.1線性表的類型定義定義n(≥0)個(gè)數(shù)據(jù)元素的有限序列,記作(a1,…ai-1,ai,ai+1,…,an)其中,ai
是表中數(shù)據(jù)元素,n
是表長(zhǎng)度(n=0時(shí)稱為空表),i為ai在線性表中的位序。由此,我們也可以將線性表看成是由(i,ai
)構(gòu)成的集合。線性表中的數(shù)據(jù)元素可以是各種各樣的,只要是屬于同一個(gè)集合即可。
例如,26個(gè)小寫英文字母是一個(gè)線性表
(a,b,…,z)
同一花色的13張撲克牌
(2,3,4,5,6,7,8,9,10,J,Q,K,A)
可以構(gòu)成一個(gè)線性表。2023/7/10卓月明42.1線性表的類型定義在稍復(fù)雜的線性表中,一個(gè)數(shù)據(jù)元素可以由若干個(gè)數(shù)據(jù)項(xiàng)(Item)組成。在這種情況下,常把數(shù)據(jù)元素稱為記錄(Record),含有大量記錄的線性表又稱文件(File)。
例如,一個(gè)學(xué)校的學(xué)生健康情況登記表如圖所示,表中每個(gè)學(xué)生的情況為一個(gè)記錄,它由姓名、學(xué)號(hào)、性別、年齡、班級(jí)和健康狀況等六個(gè)數(shù)據(jù)項(xiàng)組成。約定同一線性表中的元素必定具有相同的特性,即屬同一數(shù)據(jù)對(duì)象,相鄰數(shù)據(jù)元素之間存在著序偶關(guān)系。2023/7/10卓月明52.1線性表的類型定義邏輯特征n>0時(shí)有且僅有一個(gè)“第一個(gè)”數(shù)據(jù)元素有且僅有一個(gè)“最后一個(gè)”數(shù)據(jù)元素除第一個(gè)數(shù)據(jù)元素外,其它元素有且僅有一個(gè)直接前驅(qū)除最后一個(gè)數(shù)據(jù)元素外,其它元素有且僅有一個(gè)直接后繼序偶<ai,ai+1>表示ai是ai+1的直接前驅(qū),反之,ai+1是ai的直接后繼。
2023/7/10卓月明62.2線性表的順序表示和實(shí)現(xiàn)定義用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表中的數(shù)據(jù)元素特點(diǎn)邏輯上相鄰,物理上也相鄰。隨機(jī)存取688970674078
邏輯序號(hào)(位序)123456C數(shù)組下標(biāo)012345陳述問(wèn)題時(shí)用2023/7/10卓月明92.2線性表的順序表示和實(shí)現(xiàn)
--順序表的存儲(chǔ)LOC(ai+1)=LOC(ai)+lLOC(a
i)=LOC(a1)+(i-1)*l
a1
a2
…a
i………an12…i………n
aa+l…a+(i-1)*l………a+(n-1)*l
idle2023/7/10卓月明102.2線性表的順序表示和實(shí)現(xiàn)
--類型定義與基本操作實(shí)現(xiàn)順序表定義方案一#defineLIST_SIZE100typedefstruct{ElemTypeelem[LIST_SIZE]; /*存儲(chǔ)空間*/intlength; /*當(dāng)前長(zhǎng)度*/}SqList_static;1)LIST_SIZE過(guò)小,則會(huì)導(dǎo)致順序表上溢;2)LIST_SIZE過(guò)大,則會(huì)導(dǎo)致空間的利用率不高。2023/7/10卓月明112.2線性表的順序表示和實(shí)現(xiàn)
--類型定義與基本操作實(shí)現(xiàn)方案二#defineLIST_INIT_SIZE100 /*存儲(chǔ)空間的初始分配量 */#defineLISTINCREMENT10 /*存儲(chǔ)空間的分配增量*/typedefstruct{ElemType*elem; /*存儲(chǔ)空間的基址*/intlength;/*當(dāng)前長(zhǎng)度*/intlistsize;/*當(dāng)前分配的存儲(chǔ)容量*/}SqList;這種方法可以解決方案一中的“上溢”問(wèn)題和“空間利用率不高”問(wèn)題。但是這一方案是有時(shí)間和空間代價(jià)的:當(dāng)因插入元素而空間不足時(shí),需要重新分配比原先的順序表多存儲(chǔ)LISTINCREMENT個(gè)數(shù)據(jù)元素的連續(xù)空間,并且需要將原空間的數(shù)據(jù)元素復(fù)制到新分配的空間中。
2023/7/10卓月明122.2線性表的順序表示和實(shí)現(xiàn)
--類型定義與基本操作實(shí)現(xiàn)注意1)必須記載當(dāng)前線性表的實(shí)際分配的空間大??;2)當(dāng)線性表不再使用時(shí),應(yīng)釋放其所占的空間;3)這種方法要求實(shí)現(xiàn)級(jí)的語(yǔ)言能提供空間的動(dòng)態(tài)分配與釋放管理。void*malloc(unsignedintsize)生成一大小為size的結(jié)點(diǎn)空間,將該空間的起始地址賦給p;free(void*p)回收p所指向的結(jié)點(diǎn)空間;void*realloc(void*p,unsignedintsize)
將p所指向的已分配內(nèi)存區(qū)的大小改為size,size可以比原分配的空間大或小。若需使用上面三個(gè)函數(shù),需#include<stdlib.h>2023/7/10卓月明132.2線性表的順序表示和實(shí)現(xiàn)
--類型定義與基本操作實(shí)現(xiàn)基本操作的實(shí)現(xiàn)初始化
StatusInitList_Sq(SqList&L){//構(gòu)造一個(gè)空的線性表LL.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(L.elem==NULL) exit(OVERFLOW); //存儲(chǔ)分配失敗L.length=0; //空表長(zhǎng)度為0L.listsize=LIST_INIT_SIZE; //初始存儲(chǔ)容量returnOK;}//InitList_Sq2023/7/10卓月明142.2線性表的順序表示和實(shí)現(xiàn)
--類型定義與基本操作實(shí)現(xiàn)求表長(zhǎng)L.length取第i個(gè)元素L.elem[i-1](0<i<L.length+1)按值查找
intLocateElem_Sq(SqListL,ElemTypee,
Status(*compare)(ElemType,ElemType)){ i=1;
p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e))++i;
if(i<=L.length)returni;
elsereturn0;
for(i=0;i<L.length&&!(*compare)(L.elem[i],e);i++);
if(i<L.length)returni+1;
elsereturn0;}2023/7/10卓月明152.2–插入操作的實(shí)現(xiàn)基本操作的實(shí)現(xiàn)插入操作
演示
15234616571064
1234567848插入e01234567i15234616571064
123456789482023/7/10卓月明162.2–插入操作的實(shí)現(xiàn)插入操作1、算法設(shè)計(jì)參數(shù):順序表&L、插入位置i、插入元素e插入分析:第i個(gè)位置放e,則原來(lái)第i~L.length個(gè)數(shù)據(jù)元素必須先后移,以騰出第i個(gè)位置;注意后移的順序?yàn)椋簭淖詈笠粋€(gè)元素開(kāi)始,逐個(gè)往后移for(j=L.length;j>=i;j--) L.elem[j]=L.elem[j-1];//后移L.elem[i-1]=e;//第i個(gè)元素存放在L.elem[i-1]中,數(shù)組下標(biāo)的起始為0L.length=L.length+1;合法的位置:i:1..L.length+1上溢及處理:上溢發(fā)生的條件:L.length≥L.listsize此時(shí)要先申請(qǐng)一個(gè)有一定增量的空間,申請(qǐng)成功則原空間的元素復(fù)制到新空間,修改L.listsize,再進(jìn)行插入工作;否則報(bào)錯(cuò)退出。2023/7/10卓月明172.2–插入操作的實(shí)現(xiàn)2、算法StatusListInsert_Sq(SqList&L,inti,ElemTypee){//位置合法性的判斷if(i<1||i>L.length+1) returnERROR;//上溢時(shí)增加空間的分配if(L.length>=L.listsize){newbase=(ElemType*)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof(ElemType));if(newbase==NULL)exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}//插入元素for(j=L.length;j>=i;j--) L.elem[j]=L.elem[j-1];L.elem[i-1]=e;L.length++;returnOK;}2023/7/10卓月明182.2–插入操作的實(shí)現(xiàn)算法分析——時(shí)間頻次最高的操作:移動(dòng)元素。另外,上溢時(shí)的空間的再分配與復(fù)制(realloc操作)的時(shí)間復(fù)雜度與realloc的算法以及當(dāng)前的表長(zhǎng)相關(guān),至少為O(n);但它僅在插入元素會(huì)引起上溢時(shí)才執(zhí)行。若線性表的長(zhǎng)度為n,則:最好情況:插入位置i為n+1,此時(shí)無(wú)須移動(dòng)元素,時(shí)間復(fù)雜度為O(1);最壞情況:插入位置i為1,此時(shí)須移動(dòng)n個(gè)元素,時(shí)間復(fù)雜度為O(n);2023/7/10卓月明192.2–插入操作的實(shí)現(xiàn)平均情況:假設(shè)pi為在第i個(gè)元素之前插入一個(gè)元素的概率,則:
插入時(shí)移動(dòng)次數(shù)的期望值:
等概率時(shí),即,,
∴T(n)=O(n)2023/7/10卓月明202.2–刪除操作的實(shí)現(xiàn)基本操作的實(shí)現(xiàn)刪除操作
演示
StatusListDelete_Sq(SqList&L,inti,ElemType&e)15234616571064
1234567816刪除e01234567i152346571064
12345672023/7/10卓月明212.2–算法設(shè)計(jì)基于順序表的算法設(shè)計(jì)
例2-1和例2-2基本操作在順序表中的實(shí)現(xiàn)ListLength(La)
La.length
GetElem(Lb,i,e)
e=Lb.elem[i-1];LocateElem(La,e,equal)
ListInsert(La,++La_len,e)
La.elem[La_len++]=e;基于順序表實(shí)現(xiàn)例2-1和例2-2基本操作的簡(jiǎn)單替換,針對(duì)例2-2得到P26算法2.72023/7/10卓月明22單鏈表靜態(tài)鏈表循環(huán)鏈表雙向鏈表其他
2.3線性表的鏈?zhǔn)奖硎竞蛯?shí)現(xiàn)2023/7/10卓月明23單鏈表
順序映像的弱點(diǎn)空間利用率不高(預(yù)先按最大空間分配)
表的容量不可擴(kuò)充(針對(duì)順序表的方案一)
即使表的容量可以擴(kuò)充(針對(duì)順序表的方案二),由于其空間再分配和復(fù)制的開(kāi)銷,也不允許它頻繁地使用插入或刪除時(shí)需移動(dòng)大量元素鏈表定義特點(diǎn)邏輯上相鄰的元素,物理上未必相鄰;非隨機(jī)存取2.3.1線性鏈表–單鏈表2023/7/10卓月明24鏈表定義結(jié)點(diǎn)-數(shù)據(jù)元素的存儲(chǔ)映像,包括數(shù)據(jù)域和指針域(其信息稱為指針或鏈)頭指針-鏈表存取的開(kāi)始;空(NULL)-最后一個(gè)結(jié)點(diǎn)的指針
2.3.1線性鏈表–單鏈表頭指針2023/7/10卓月明252.3.1線性鏈表–單鏈表鏈表定義每個(gè)結(jié)點(diǎn)中只包含一個(gè)指針域,則稱為線性鏈表或單鏈表;相對(duì)地,稱含兩個(gè)或兩個(gè)以上指針域的結(jié)點(diǎn)構(gòu)成的鏈表稱為多重鏈表。用線性鏈表表示線性表時(shí),數(shù)據(jù)元素之間的邏輯關(guān)系是由結(jié)點(diǎn)中的指針指示的。
換句話說(shuō),指針為數(shù)據(jù)元素之間的邏輯關(guān)系的映象,則邏輯上相鄰的兩個(gè)數(shù)據(jù)元素其存儲(chǔ)的物理位置不要求緊鄰,這種存儲(chǔ)結(jié)構(gòu)為非順序映象或鏈?zhǔn)接诚蟆?023/7/10卓月明26鏈表定義
typedefstructLNode{
ElemTypedata; //數(shù)據(jù)域
structLNode*next; //后向指針域
}LNode,*LinkList;2.3.1線性鏈表–單鏈表2023/7/10卓月明272.3.1線性鏈表–單鏈表鏈表定義1、無(wú)頭結(jié)點(diǎn)的單鏈表頭指針為L(zhǎng),則空表時(shí),L==NULL由于第一個(gè)結(jié)點(diǎn)無(wú)前驅(qū)結(jié)點(diǎn),所以只能通過(guò)某指針變量來(lái)指向,如L;其余結(jié)點(diǎn)均有前驅(qū)結(jié)點(diǎn),故可通過(guò)其直接前驅(qū)結(jié)點(diǎn)的next域來(lái)指向,即……->next;表示方法的不同,會(huì)造成對(duì)結(jié)點(diǎn)的操作處理的不同。2、有頭結(jié)點(diǎn)的單鏈表空表時(shí),L指向一結(jié)點(diǎn)(稱為頭結(jié)點(diǎn)),該結(jié)點(diǎn)的數(shù)據(jù)域可以不存儲(chǔ)信息,也可存儲(chǔ)如表長(zhǎng)等的附加信息,結(jié)點(diǎn)的指針域存放NULL,即L->next==NULL。 第一個(gè)結(jié)點(diǎn)和其余結(jié)點(diǎn)均可統(tǒng)一表示為其直接前驅(qū)結(jié)點(diǎn)的next域所指向的結(jié)點(diǎn),即……->next。a1a2Lan^a1an^L2023/7/10卓月明282.3.1線性鏈表–單鏈表基本操作的實(shí)現(xiàn)
演示取第i個(gè)元素
GetElem_L(LinkListL,inti,ElemType&e)
插入操作
ListInsert_L(LinkList&L,inti,ElemTypee)2023/7/10卓月明29基本操作的實(shí)現(xiàn)
演示刪除操作
ListDelete_L(LinkList&L,inti,ElemType&e)創(chuàng)建單鏈表
CreateList_L(LinkList&L)頭插法尾插法2.3.1線性鏈表–單鏈表2023/7/10卓月明30基于單鏈表的算法設(shè)計(jì)不能簡(jiǎn)單地用基本操作的實(shí)現(xiàn)來(lái)替換要結(jié)合問(wèn)題的處理特征和存儲(chǔ)結(jié)構(gòu)的特征進(jìn)行適當(dāng)?shù)恼希?.3.1線性鏈表–單鏈表2023/7/10卓月明31靜態(tài)鏈表
問(wèn)題:若語(yǔ)言不支持指針類型,能有鏈?zhǔn)酱鎯?chǔ)嗎?
可以借用一維數(shù)組來(lái)表示鏈表-靜態(tài)鏈表
數(shù)組元素(數(shù)據(jù)元素的值、指示器)-結(jié)點(diǎn)類型定義
#define MAXSIZE 1000
typedefstruct{
ElemType data;
int cur; //替代動(dòng)態(tài)鏈表結(jié)點(diǎn)中的指針域
}component,SLinkList[MAXSIZE];2.3.1線性鏈表–靜態(tài)鏈表2023/7/10卓月明32循環(huán)鏈表
問(wèn)題1
如何從一個(gè)結(jié)點(diǎn)出發(fā),訪問(wèn)到鏈表中的全部結(jié)點(diǎn)?
——循環(huán)鏈表問(wèn)題2
如何在O(1)時(shí)間內(nèi)由鏈表指針訪問(wèn)到第一個(gè)結(jié)點(diǎn)和最后一個(gè)結(jié)點(diǎn)?
——頭指針表示/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 19762:2025 EN Information technology - Automatic identification and data capture (AIDC) techniques - Vocabulary
- 【正版授權(quán)】 IEC 63522-44:2025 EN-FR Electrical relays - Tests and measurements - Part 44: Corrosive atmosphere due to salt mist
- 2025年數(shù)字經(jīng)濟(jì)與未來(lái)就業(yè)考試卷及答案
- 春運(yùn)應(yīng)急預(yù)案15篇
- 中國(guó)環(huán)境經(jīng)濟(jì)政策的回顧與展望(上)
- 文檔基礎(chǔ)化工行業(yè)研究方法
- 糧食 防汛應(yīng)急演練方案
- 中學(xué)生日常行為規(guī)范新版
- 生物制藥項(xiàng)目投資合作合同
- 科技創(chuàng)新企業(yè)兼職UI設(shè)計(jì)師綜合聘用合同
- 2024年撫順市三支一扶考試真題
- 道德與法治教育資源整合與利用方案
- 《WEBGIS編程入門教程》課件
- 2024年合肥濱湖投資控股集團(tuán)有限公司招聘真題
- 醫(yī)?;鸸芾韺m?xiàng)整治部署
- 2024年濟(jì)南市工程咨詢?cè)赫衅缚荚囌骖}
- 小兒推拿培訓(xùn)合同協(xié)議
- 委托清算協(xié)議書范本
- 防塵防潮倉(cāng)庫(kù)管理制度
- 酒店房?jī)r(jià)體系管理制度
- 福州教育學(xué)院附屬中學(xué)2025年高三全真四模數(shù)學(xué)試題試卷
評(píng)論
0/150
提交評(píng)論