版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、8.1 廣義表的定義,第8章 廣義表,8.2 廣義表的存儲(chǔ)結(jié)構(gòu),8.3 廣義表的運(yùn)算,本章小結(jié),8.1 廣義表的定義 廣義表簡(jiǎn)稱表,它是線性表的推廣。一個(gè)廣義表是n(n0)個(gè)元素的一個(gè)序列,若n=0時(shí)則稱為空表。設(shè)ai為廣義表的第i個(gè)元素,則廣義表GL的一般表示與線性表相同: GL=(a1,a2,ai,an) 其中n表示廣義表的長(zhǎng)度,即廣義表中所含元素的個(gè)數(shù),n0。如果ai是單個(gè)數(shù)據(jù)元素,則ai是廣義表GL的原子;如果ai是一個(gè)廣義表,則ai是廣義表GL的子表。,廣義表具有如下重要的特性: (1)廣義表中的數(shù)據(jù)元素有相對(duì)次序; (2)廣義表的長(zhǎng)度定義為最外層包含元素個(gè)數(shù); (3)廣義表的深度定
2、義為所含括弧的重?cái)?shù)。其中,原子的深度為0,空表的深度為1; (4)廣義表可以共享;一個(gè)廣義表可以為其他廣義表共享;這種共享廣義表稱為再入表; (5)廣義表可以是一個(gè)遞歸的表。一個(gè)廣義表可以是自已的子表。這種廣義表稱為遞歸表。遞歸表的深度是無(wú)窮值,長(zhǎng)度是有限值; (6)任何一個(gè)非空廣義表GL均可分解為表頭head(GL) = a1和表尾tail(GL) = ( a2,an) 兩部分。,為了簡(jiǎn)單起見(jiàn),下面討論的廣義表不包括前面定義的再入表和遞歸表,即只討論一般的廣義表。另外,我們規(guī)定用小寫(xiě)字母表示原子,用大寫(xiě)字母表示廣義表的表名。例如: A=() B=(e) C=(a,(b,c,d) D=(A,B
3、,C)=(),(e),(a,(b,c,d) E=(a,(a,b),(a,b),c),如果把每個(gè)表的名字(若有的話)寫(xiě)在其表的前面,則上面的5個(gè)廣義表可相應(yīng)地表示如下: A() B(e) C(a,(b,c,d) D(A(),B(e),C(a,(b,c,d) E(a,(a,b),(a,b),c) 若用圓圈和方框分別表示表和單元素,并用線段把表和它的元素(元素結(jié)點(diǎn)應(yīng)在其表結(jié)點(diǎn)的下方)連接起來(lái),則可得到一個(gè)廣義表的圖形表示。例如,上面五個(gè)廣義表的圖形表示如下圖所示。,A() B(e) C(a,(b,c,d) D(A(),B(e),C(a,(b,c,d) E(a,(a,b),(a,b),c),8.2 廣
4、義表的存儲(chǔ)結(jié)構(gòu) 廣義表是一種遞歸的數(shù)據(jù)結(jié)構(gòu),因此很難為每個(gè)廣義表分配固定大小的存儲(chǔ)空間,所以其存儲(chǔ)結(jié)構(gòu)只好采用動(dòng)態(tài)鏈?zhǔn)浇Y(jié)構(gòu)。 我們將一個(gè)廣義表看成一棵樹(shù),為了方便存儲(chǔ),將其轉(zhuǎn)換成一棵二叉樹(shù)。其轉(zhuǎn)換過(guò)程已在第6章中介紹過(guò),這里以示例中的廣義表C說(shuō)明其轉(zhuǎn)換過(guò)程。如下圖所示,左邊的圖表示轉(zhuǎn)換的中間狀態(tài),右邊的圖表示轉(zhuǎn)換的最終狀態(tài),即一棵二叉樹(shù)。從二叉樹(shù)中看到,有兩類結(jié)點(diǎn),一類為圓圈結(jié)點(diǎn),在這里對(duì)應(yīng)子表;另一類為方形結(jié)點(diǎn),在這里對(duì)應(yīng)原子。,廣義表的存儲(chǔ)結(jié)構(gòu),typedef struct lnode int tag; /*結(jié)點(diǎn)類型標(biāo)識(shí)*/ union ElemType data; struct lnod
5、e *sublist; val; struct lnode *link;/*指向下一個(gè)元素*/ GLNode;/*廣義表結(jié)點(diǎn)類型定義*/,廣義表的兩種基本情況 :,為原子的情況 :,8.3 廣義表的運(yùn)算 1. 求廣義表的長(zhǎng)度 在廣義表中,同一層次的每個(gè)結(jié)點(diǎn)是通過(guò)link域鏈接起來(lái)的,所以可把它看做是由link域鏈接起來(lái)的單鏈表。這樣,求廣義表的長(zhǎng)度就是求單鏈表的長(zhǎng)度,可以采用以前介紹過(guò)的求單鏈表長(zhǎng)度的方法求其長(zhǎng)度。,求廣義表長(zhǎng)度的非遞歸算法如下: int GLLength(GLNode *g) /*g為一個(gè)廣義表頭結(jié)點(diǎn)的指針*/ int n=0; g=g-val.sublist;/*g指向廣義
6、表的第一個(gè)元素*/ while (g!=NULL) n+; g=g-link; return n; ,2. 求廣義表的深度 對(duì)于帶頭結(jié)點(diǎn)的廣義表g,廣義表深度的遞歸定義是它等于所有子表中表的最大深度加1。若g為原子,其深度為0。 求廣義表深度的遞歸模型f()如下:,f(g)=,0 若g為原子,1 若g為空表,MAXf(subg)+1 其他情況,subg為g的子表,int GLDepth(GLNode *g) /*求帶頭結(jié)點(diǎn)的廣義表g的深度*/ int max=0,dep; if (g-tag=0) return 0; /*為原子時(shí)返回0*/ g=g-val.sublist; /*g指向第一個(gè)元
7、素*/ if (g=NULL) return 1; /*為空表時(shí)返回1*/ while (g!=NULL) /*遍歷表中的每一個(gè)元素*/ if (g-tag=1) /*元素為子表的情況*/ dep=GLDepth(g); /*遞歸調(diào)用求出子表的深度*/ if (depmax) max=dep; /*max為同一層所求過(guò)的子表中深度的最大值*/ g=g-link; /*使g指向下一個(gè)元素*/ return(max+1); /*返回表的深度*/ ,3. 建立廣義表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu) 假定廣義表中的元素類型ElemType為char類型,每個(gè)原子的值被限定為英文字母。 并假定廣義表是一個(gè)表達(dá)式,其格式為
8、:元素之間用一個(gè)逗號(hào)分隔,表元素的起止符號(hào)分別為左、右圓括號(hào),空表在其圓括號(hào)內(nèi)不包含任何字符。例如“(a,(b,c,d)”就是一個(gè)符合上述規(guī)定的廣義表格式。,生成廣義表鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的算法如下: GLNode *CreatGL(char * /*遞歸構(gòu)造子表并鏈到表頭結(jié)點(diǎn)*/ ,else if (ch=) h=NULL; /*遇到)字符,子表為空*/ else h-tag=0; /*新結(jié)點(diǎn)作為原子結(jié)點(diǎn)*/ h-val.data=ch; else h=NULL; /*串結(jié)束,子表為空*/ ch=*s+; /*取下一個(gè)掃描字符*/ if (h!=NULL) /*串未結(jié)束判斷*/ if (ch=,)
9、/*當(dāng)前字符為,*/ h-link=CreatGL(s); /*遞歸構(gòu)造后續(xù)子表*/ else /*串結(jié)束*/ h-link=NULL; /*處理表的最后一個(gè)元素*/ return h; /*返回廣義表指針*/ ,4. 輸出廣義表 以h作為帶表頭附加結(jié)點(diǎn)的廣義表的表頭指針,打印輸出該廣義表時(shí),需要對(duì)子表進(jìn)行遞歸調(diào)用。輸出一個(gè)廣義表的算法如下:,void DispGL(GLNode *g) /*g為一個(gè)廣義表的頭結(jié)點(diǎn)指針*/ if (g!=NULL) /*表不為空判斷*/ if (g-tag=1) /*為表結(jié)點(diǎn)時(shí)*/ printf(); /*輸出(*/ if (g-val.sublist=NULL) printf(); /*輸出空子表*/ else DispGL(g-val.sublist); /*遞歸輸出子表*/ else printf(%c, g-val.data); /*為原子時(shí)輸出元素值*/ if (g-tag=1) printf(); /*為表結(jié)點(diǎn)時(shí)輸出)*/ if (g-link!=NULL) printf(,); DispGL(g-li
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)市政工程施工(市政施工管理)試題及答案
- 2025年大學(xué)教育學(xué)(學(xué)前心理學(xué))試題及答案
- 2025年高職生態(tài)保護(hù)技術(shù)(生態(tài)修復(fù)方案)試題及答案
- 2025年大學(xué)自動(dòng)化(PLC控制)試題及答案
- 2026年藥店銷售(客戶接待)試題及答案
- 2025年高職行政管理(行政管理)試題及答案
- 中國(guó)銀行培訓(xùn)課件
- 中國(guó)知名大學(xué)介紹
- 養(yǎng)老院老人用藥管理制度
- 養(yǎng)老院老人投訴處理制度
- 2025-2026學(xué)年遼寧省葫蘆島市連山區(qū)八年級(jí)(上)期末數(shù)學(xué)試卷(含答案)
- 上海市松江區(qū)2026屆初三一模物理試題(含答案)
- 小學(xué)六年級(jí)英語(yǔ)2026年上學(xué)期語(yǔ)法改錯(cuò)綜合真題
- 2026長(zhǎng)治日?qǐng)?bào)社工作人員招聘勞務(wù)派遣人員5人備考題庫(kù)完美版
- 護(hù)理核心制度內(nèi)容精要
- 光伏板清洗施工方案
- 閱讀理解體裁與命題方向(復(fù)習(xí)講義)-2026年春季高考英語(yǔ)(上海高考專用)
- 指南抗菌藥物臨床應(yīng)用指導(dǎo)原則(2025版)
- 2024年全國(guó)職業(yè)院校技能大賽ZZ060 母嬰照護(hù)賽項(xiàng)規(guī)程以及母嬰照護(hù)賽項(xiàng)賽題1-10套
- 舒城縣2023-2024學(xué)年四年級(jí)數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)檢測(cè)模擬試題含答案
- 《干部履歷表》1999版電子版
評(píng)論
0/150
提交評(píng)論