




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
線性結(jié)構(gòu):鏈表qin寬帶光纖傳輸與通信系統(tǒng)技術(shù)教育部Key
Laboratory
of
Broadband
Optical
Fiber
Transmissionand
Communication
Networks制作:段景山主講:的線性表的線性表(鏈表)的定義鏈表的引入數(shù)組結(jié)構(gòu)的缺點:在 、刪除時要移動大量的節(jié)點表的大小固定。預(yù)先在申明數(shù)組時指定,無法更改原因:存放的連續(xù)性突破離散存放用指針來表示元 間的關(guān)系。的線性表用鏈表實現(xiàn)線性表(非連續(xù)
)線性表元素:a1、a2、a3、a4....鏈表鏈點線性關(guān)系:a1a2a3a4指針域,指針關(guān)系鏈表的定義鏈表的定義鏈點datalink元素域
域元素域(數(shù)據(jù)元素域):存放一個數(shù)據(jù)元素。
域(關(guān)系域):存放指向下一個元素的指針——元素間的關(guān)系。元素域
+
域
=結(jié)點(鏈點)鏈表的定義鏈表a1a2an……h(huán)ead由鏈點及鏈點相互間的 構(gòu)成鏈表頭鏈表尾鏈表長度(節(jié)點數(shù)目)taillength鏈表的定義定義typedef
struct
node_type{elemtype
data;struct
node_type
*
next;}node_type
;typedef
struct
list_type{node_type
*head;node_type
*tail;int
length;}list_type;鏈點的定義鏈表的定義datanext鏈表的定義鏈表組織:list_type
*list;list->head
=
a1;a1->next
=
a2;a2->next
=
a3;……an->next
=
NULLlist->tail
=
an;list->length
=
n;a1a2an……h(huán)eadtailNULL,表示指針的值為
“空”,即指針指向空處鏈表的基本操作鏈表的基本操作刪除鏈表的基本操作鏈表的第i個節(jié)點操作問題描述:問題分析:輸入:鏈表,ia1a2an……h(huán)eadtail輸出:鏈點——指向鏈點的指針?biāo)惴▽崿F(xiàn)分析:只能從鏈表頭開始,一個一個“數(shù)”下去,直到第i個。temptemptemp}returnp;a1nextaiai+1anpnode_type
*get_node( list,
i
){int
counter
;node_type
*
p;p=list->head;counter
=
1;while(counter
<
i
&&p!=NULL){counter
=
counter
+1;p=p
->next;}if(
p
=
=
NULL)
return
NULL;a2:counter
3設(shè)i
=
3操作注意1、p=p->next;沿鏈表前進(jìn)2、循環(huán)結(jié)束條件counter==i
或node==NULLcounter
>
list->length如果希望獲得值為x的元素,如何實現(xiàn)?while(p->data
==x
&&
p!=
NULL)操作新的元素new_node;鏈表
操作問題描述:在元素ai前問題分析:輸入:鏈表,location,x輸出: 新元素后的鏈表。算法實現(xiàn)分析操作a1aianheadtailai-1......anewa1aianheadtailai-1......anew兩個步驟:ai-1->next
=
anew
;anew->next
=
ai;操作void
insertl(list,
new_node
,
location){找到ai-1執(zhí)行
動作
兩個步驟:ai-1->next
=
anew
;anew->next
=
ai
;}操作void
insertl(list,
new_node
,
location){找到ai-1ai-1->next
=
anew
;anew->next=
ai
;a1ai-1aianpnewnodea2p
=list->header;counter
=
1while(
counter
<i
-1
&&p
!=NULL){counter
=
counter
+
1;p
=
p->next;q}q
=
p->next;p->next
=
new_node;new_node->next
=
q;法一}操作void
insertl(list,
new_node
,
location){}new_node->next
=
p->next;p->next
=
new_node;a1ai-1aianpnewnodea2p
=list->header;counter
=
1while(
counter
<i
-1
&&p
!=NULL){counter
=
counter
+
1;p=
p->next;}法二操作}list->length
++;void
insertl(list,
new_node
,
location){邊界情況:表首表
入counter
=
1;p=list->head;
初始化while(
counter
<i
-1
&&p
!=NULL){counter
=
counter
+
1;p
=
p->next;}new_node->next
=
p->next;p->next
=
new_node;操作a1ai-1aianlist->headnewnodenew_node->next
=
list->head;list->head=
new_node;void
insertl(list,
new_node
,
location){if(location
==
1){}else{new_node
=
list->head;list->head=new_node;counter
=
1;p=list->head;初始化while(
counter
<
i
-1
&&p!=
NULL){counter
=counter
+1;p
=
p->next;}new_node->next
=
p->next;p->next=new_node;}}
list->length++;邊界情況:表首操作表入a1ai-1aianlist->headcounter=counter+1;
注意當(dāng)循環(huán)執(zhí)行到表尾時p
=
p->next;}new_node->next
=
p->next;p->next
=
new_node;p->next
!=
NULL){NULLp當(dāng)i>鏈表長度時while(
counter<
i
-1
&&p
的值為NULL(空)p->next是懸空的值會造成系統(tǒng)因此循環(huán)結(jié)束應(yīng)以
p->next==NULL為條件}void
insertl(list,
new_node,location){if(location==
1){new_node->next
=
list->head;list->head=
new_node;else{counter
=
1;p=list->head;while(
counter
<i
-1
&&p->next
!=NULL){counter
=
counter
+
1;p=
p->next;}new_node->next
=
p->next;p->next
=
new_node;}}
list->length
++;從 算法中對鏈表操作的體會鏈表操作往往從表頭開始,逐個找到需要的鏈點鏈表操作的有向性不能回退;鏈表指針
使用,謹(jǐn)防丟失。過程沒有對鏈點內(nèi)容進(jìn)行搬移。指針使用一定要注意空指針的判斷鏈表的創(chuàng)建鏈表的創(chuàng)建從鏈點的生成過程中體會動態(tài)內(nèi)存申請的動作問題描述:根據(jù)輸入的元素,生成一個鏈點,并把它 到鏈表頭creat_list(
list, x){new_node=
(node_type*)malloc(sizeof(node_type));new_node->data
=
x;new_node->next
=
NULL;list->head=
new_node;}刪除操作鏈表的刪除操作問題描述:刪除元素ai
;問題分析:輸入:鏈表,location輸出:刪除元素后的鏈表。算法實現(xiàn)分析a1ai+1anheadtailai-1......ai即ai-1->next =
ai->next;ai-1->next
=
ai-1->next->next;void
dele找到ai-1刪除操作(list,location){執(zhí)行刪除動作ai-1->next
=
ai-1->next->next注意,從鏈表上取下的鏈點ai需要掛在一個指針上,否則可能丟失a1ai+1anhead}tailai-1......aitempvoid
dele(list,location){}}if(locat n==1){temp=list->head;list->head
=
list->head->next;free(temp);}else{counter
=
1;p=list->head;
初始化while(
counter
<i
-1
&&p
!=NULL){counter
=
counter
+
1;p
=
p->next;}temp
=
p->next;p->next
=
p->next->next;free(temp);list->length--;從鏈表刪除的鏈點,一般應(yīng)該 其空間刪除操作注意:對刪除鏈點的處理往往需要要free(
)如果希望刪除值為x的元素,如何實現(xiàn)?while(p->data
==x
&&
p
!=
NULL)鏈表的特點1、操作的順序性有平均N/2次查找過程2、離散存放不受鏈表大小限制不進(jìn)行鏈點內(nèi)容的搬移查找操作:數(shù)組效率優(yōu)于鏈表、刪除操作:鏈表效率優(yōu)于數(shù)組鏈表的特點其它一些操作相同于順序表來說:兩個有序鏈表的合并?思考:1、編程判斷兩個單向鏈表是否相交(假定這兩個鏈表本身不帶有環(huán));2、假設(shè)有一個沒有頭指針的單向鏈表。一個指針指向此單鏈表中間的一個節(jié)點(不是第一個,也不是最后一個節(jié)點),將該節(jié)點從單鏈表中刪除。節(jié)點的單鏈表節(jié)點的單鏈表頭節(jié)點:是一個特殊的鏈點,數(shù)據(jù)內(nèi)容無效鏈點指針指向鏈表頭/////a1...aian...a1an......ai頭節(jié)點頭指針鏈表的典型形態(tài)節(jié)點的單鏈表幾個容易 的概念第一個元素節(jié)點 頭指針 頭節(jié)點、鏈表頭a1ai+1anheadtailai-1......ai/////a1...aian...第一個元素節(jié)點、鏈表頭第一個元素節(jié)點頭指針頭節(jié)點head鏈表的典型形態(tài)節(jié)點單鏈表的操作特點和刪除算法不必考慮在表首進(jìn)行時,需要更改頭指針的特殊處理/////a1...aian...headp=
head;while(location
>
1
&&p
!=NULL
){…}p->next
=
p->next->next;p為什么 中使用**而教案中沒有使用?
中僅定義了鏈點,沒有定義鏈表結(jié)構(gòu),一個鏈表僅由一個頭指針開始程序中調(diào)用的上下文不同typedef
struct
list_type{node_type
*head;node_type
*tail;intlength;}list_type;headtaillengtha1a2為什么中使用**而教案中沒有使用?void
main(){node*head;createsl(&head);……}void
createsl(
node
**h){*h
=
node;……}教案void
main(){list_type
list;create_l(&list);……}void
create_l(list_type
*l){l->head=
node;……}headheadtaillengthheadtaillength為什么 中使用**而教案中沒有使用?本質(zhì)是一樣的:要在函數(shù)調(diào)用中改變頭指針的指向改變指針的指向,即改變指針變量的內(nèi)容要改變指針的內(nèi)容,必須將指針變量的地址傳入中是將指針的地址傳入--指針的指針教案中將地址所在的結(jié)構(gòu)的地址傳入雙向鏈表a1headtailNa2NPanPPa1N雙向鏈表特點:每一個鏈點包含兩個指針,前趨指針后繼指針P:priorN:next……雙向鏈表的定義typedef
struct
double_link_node_type{struct
double_link_node_type
*
prior;struct
double_link_node_type
*
next;elemtype
data;}dl_node_type
;typedef
struct
double_link_list_type{dl_node_type
*head;dl_node_type
*tail;int
length;}dl_list_type;鏈點的定義鏈表的定義雙向鏈表ai-1NPaiNP問題描述:在第i個元素前 新元素雙向鏈表的
操作anewNP1、anew->next=ai2、
ai-1
->next
=anew3、anew->prior=ai-14、
ai->prior
=
anewpanew->next
=
p;p->prior->next=
anew;anew->prior
=
p->pri
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 青島版四年級下學(xué)期數(shù)學(xué)期中復(fù)習(xí)課堂知識練習(xí)題
- 中國過濾器行業(yè)發(fā)展前景預(yù)測及投資方向研究報告
- 2025年機(jī)械零件項目可行性研究報告
- 2025年中國汽車用橡膠管市場深度分析及投資戰(zhàn)略咨詢報告
- 2024-2025學(xué)年高中生物第一單元生物技術(shù)與生物工程第3章第2節(jié)良種化胚胎工程教案中圖版選修3
- 2024-2025學(xué)年高中語文第二單元傳記第4課“布衣總統(tǒng)”孫中山節(jié)選練習(xí)粵教版必修1
- 2025年科研項目年度總結(jié)報告
- 2024-2025學(xué)年高中物理第1章電場第6節(jié)示波器的奧秘學(xué)案粵教版選修3-1
- 2024-2025學(xué)年高中物理第6章章末復(fù)習(xí)課教案含解析魯科版選修1-1
- 2024-2025學(xué)年高中歷史第五單元近現(xiàn)代中國的先進(jìn)思想第23課毛澤東與馬克思主義的中國化課后篇鞏固探究岳麓版必修3
- 醫(yī)院信息系統(tǒng)HIS知識培訓(xùn)教學(xué)課件-HIS的主要內(nèi)容
- 經(jīng)濟(jì)法通論債權(quán)法總論
- 合成聚氨酯原料及助劑生產(chǎn)項目
- 鼻部整形隆鼻術(shù)精選PPT
- 微信個人簡歷
- 軟件測試jmeter中英文對照
- 反假貨幣培訓(xùn)考試題庫-相關(guān)法律法規(guī)及規(guī)范性文件知識考題
- 鉆井安全操作規(guī)程中英文
- 體育《網(wǎng)球正手擊球》教學(xué)PPT
- 富氫水水素水推廣方法
- 煤礦職業(yè)衛(wèi)生培訓(xùn)課件2023
評論
0/150
提交評論