![數(shù)據(jù)結(jié)構(gòu)第8章 廣義表_第1頁](http://file4.renrendoc.com/view/ac0769a9c246fbbd92c8c6c6f798b0c3/ac0769a9c246fbbd92c8c6c6f798b0c31.gif)
![數(shù)據(jù)結(jié)構(gòu)第8章 廣義表_第2頁](http://file4.renrendoc.com/view/ac0769a9c246fbbd92c8c6c6f798b0c3/ac0769a9c246fbbd92c8c6c6f798b0c32.gif)
![數(shù)據(jù)結(jié)構(gòu)第8章 廣義表_第3頁](http://file4.renrendoc.com/view/ac0769a9c246fbbd92c8c6c6f798b0c3/ac0769a9c246fbbd92c8c6c6f798b0c33.gif)
![數(shù)據(jù)結(jié)構(gòu)第8章 廣義表_第4頁](http://file4.renrendoc.com/view/ac0769a9c246fbbd92c8c6c6f798b0c3/ac0769a9c246fbbd92c8c6c6f798b0c34.gif)
![數(shù)據(jù)結(jié)構(gòu)第8章 廣義表_第5頁](http://file4.renrendoc.com/view/ac0769a9c246fbbd92c8c6c6f798b0c3/ac0769a9c246fbbd92c8c6c6f798b0c35.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
8.1廣義表的定義第8章廣義表8.2廣義表的存儲結(jié)構(gòu)8.3廣義表的運算本章小結(jié)8.1廣義表的定義
廣義表簡稱表,它是線性表的推廣。一個廣義表是n(n≥0)個元素的一個序列,若n=0時則稱為空表。設(shè)ai為廣義表的第i個元素,則廣義表GL的一般表示與線性表相同:
GL=(a1,a2,…,ai,…,an)
其中n表示廣義表的長度,即廣義表中所含元素的個數(shù),n≥0。如果ai是單個數(shù)據(jù)元素,則ai是廣義表GL的原子;如果ai是一個廣義表,則ai是廣義表GL的子表。廣義表具有如下重要的特性:
(1)廣義表中的數(shù)據(jù)元素有相對次序;
(2)廣義表的長度定義為最外層包含元素個數(shù);
(3)廣義表的深度定義為所含括弧的重數(shù)。其中,原子的深度為0,空表的深度為1;
(4)廣義表可以共享;一個廣義表可以為其他廣義表共享;這種共享廣義表稱為再入表;
(5)廣義表可以是一個遞歸的表。一個廣義表可以是自已的子表。這種廣義表稱為遞歸表。遞歸表的深度是無窮值,長度是有限值;
(6)任何非空廣義表GL均可分解為兩部分。表頭head(GL)=a1和表尾tail(GL)=(a2,…,an)約定用小寫字母表示原子,用大寫字母表示廣義表的表名。例如:
A=()B=(e)C=(a,(b,c,d))D=(A,B,C)=((),(e),(a,(b,c,d)))E=((a,(a,b),((a,b),c)))若用圓圈和方框分別表示表和單元素,并用線段把表和它的元素(元素結(jié)點應(yīng)在其表結(jié)點的下方)連接起來,則可得到一個廣義表的圖形表示。例如,上面五個廣義表的圖形表示如下圖所示。A=()B=(e)eABC=(a,(b,c,d))D=(A,B,C)=((),(e),(a,(b,c,d)))E=((a,(a,b),((a,b),c)))8.2廣義表的存儲結(jié)構(gòu)
廣義表是一種遞歸的數(shù)據(jù)結(jié)構(gòu),因此很難為每個廣義表分配固定大小的存儲空間,所以其存儲結(jié)構(gòu)只好采用動態(tài)鏈式結(jié)構(gòu)。將一個廣義表看成一棵樹,為了方便存儲,將其轉(zhuǎn)換成一棵二叉樹。其轉(zhuǎn)換過程已在“樹”一章中介紹過,這里以示例中的廣義表C說明其轉(zhuǎn)換過程。如下圖所示,左邊的圖表示轉(zhuǎn)換的中間狀態(tài),右邊的圖表示轉(zhuǎn)換的最終狀態(tài),即一棵二叉樹。從二叉樹中看到,有兩類結(jié)點,一類為圓圈結(jié)點,在這里對應(yīng)子表;另一類為方形結(jié)點,在這里對應(yīng)原子。typedef
struct
lnode{ inttag; /*結(jié)點類型標識*/ union {ElemTypedata;
struct
lnode*sublist; }val;
struct
lnode*link; /*指向下一個元素*/}GLNode; /*廣義表結(jié)點類型定義*/廣義表的兩種基本情況:為原子的情況:8.3廣義表的運算1.求廣義表的長度
在廣義表中,同一層次的每個結(jié)點是通過link域鏈接起來的,所以可把它看做是由link域鏈接起來的單鏈表。這樣,求廣義表的長度就是求單鏈表的長度,可以采用以前介紹過的求單鏈表長度的方法求其長度。求廣義表長度的非遞歸算法如下:
int
GLLength(GLNode*g)/*g為一個廣義表頭結(jié)點的指針*/{
intn=0;g=g->val.sublist;/*g指向廣義表的第一個元素*/while(g!=NULL){n++;g=g->link;}returnn;}2.求廣義表的深度對于帶頭結(jié)點的廣義表g,廣義表深度的遞歸定義是它等于所有子表中表的最大深度加1。若g為原子,其深度為0。求廣義表深度的遞歸模型f()如下:f(g)=0若g為原子
1 若g為空表MAX{f(subg)}+1其他情況,subg為g的子表
1∧
10a∧0b0c0dC0e1∧
1C=((a),(b,c,d),(e))∧∧1int
GLDepth(GLNode*g)/*求帶頭結(jié)點的廣義表g的深度*/{intmax=0,dep;if(g->tag==0)return0;/*為原子時返回0*/g=g->val.sublist; /*g指向第一個元素*/if(g==NULL)return1;/*為空表時返回1*/while(g!=NULL) /*遍歷表中的每一個元素*/{if(g->tag==1) /*元素為子表的情況*/{dep=GLDepth(g);/*遞歸調(diào)用求出子表的深度*/if(dep>max)max=dep; /*max為同一層所求過的子表中深度的最大值*/}g=g->link; /*使g指向下一個元素*/}return(max+1); /*返回表的深度*/}3.建立廣義表的鏈式存儲結(jié)構(gòu)假定廣義表中的元素類型ElemType為char類型,每個原子的值被限定為英文字母。并假定廣義表是一個表達式,其格式為:元素之間用一個逗號分隔,表元素的起止符號分別為左、右圓括號,空表在其圓括號內(nèi)不包含任何字符。例如“(a,(b,c,d))”就是一個符合上述規(guī)定的廣義表格式。
生成廣義表鏈式存儲結(jié)構(gòu)的算法如下:GLNode*CreatGL(char*&s){GLNode*h;charch;ch=*s;/*取一個掃描字符*/s++; /*串指針后移一位*/if(ch!='\0') /*串未結(jié)束判斷*/{h=(GLNode*)malloc(sizeof(GLNode));/*創(chuàng)建新結(jié)點*/
if(ch=='(') /*當前字符為左括號時*/ {h->tag=1; /*新結(jié)點作為表頭結(jié)點*/h->val.sublist=CreatGL(s);/*遞歸構(gòu)造子表并鏈到表頭結(jié)點*/ }
elseif(ch==')')h=NULL;/*遇到')'字符,子表為空*/ else{h->tag=0; /*新結(jié)點作為原子結(jié)點*/ h->val.data=ch; }}elseh=NULL; /*串結(jié)束,子表為空*/
ch=*s; /*取下一個掃描字符*/s++; /*串指針后移一位*/
if(h!=NULL) /*串未結(jié)束判斷*/
if(ch==',') /*當前字符為','*/h->link=CreatGL(s);/*遞歸構(gòu)造后續(xù)子表*/ else /*串結(jié)束*/h->link=NULL; /*處理表的最后一個元素*/returnh; /*返回廣義表指針*/}1∧
10a0b0c0dC0e1∧
1C=(a,(b,c,d),(e))∧∧4.輸出廣義表以h作為帶表頭附加結(jié)點的廣義表的表頭指針,打印輸出該廣義表時,需要對子表進行遞歸調(diào)用。輸出一個廣義表的算法如下:voidDispGL(GLNode*g)/*g為一個廣義表的頭結(jié)點指針*/{if(g!=NULL)/*表不為空判斷*/{if(g->tag==1)/*為表結(jié)點時*/ {printf("(");/*輸出'('*/if(g->val.sublist==NULL)
printf("");/*輸出空子表*/ elseDispGL(g->val.sublist);/*遞歸輸出子表*/ } elseprintf("%c",g->val.data);/*為原子時輸出元素值*/if(g->tag==1)
printf(")");/*為表結(jié)點時輸出')'*/if(g->link!=NULL)
{printf(",");
DispGL(g->link); /*遞歸輸出后續(xù)表的內(nèi)容*/ }}}1∧
10
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代企業(yè)現(xiàn)金流分析與優(yōu)化策略
- 環(huán)境安全教育在校園的推廣與實踐
- Unit 4 Natural disasters Project 說課稿-2024-2025學(xué)年高中英語人教版(2019)必修第一冊
- 3 地球的形狀說課稿-2023-2024學(xué)年大象版科學(xué)四年級下冊
- 2023六年級語文上冊 第三單元 12 故宮博物院說課稿新人教版
- Unit1 Making friends Part C(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊001
- 2024年四年級品社下冊《第三單元 交通連著你我他》說課稿 山東版
- 27巨人的花園 說課稿 -2023-2024學(xué)年語文四年級下冊統(tǒng)編版
- Module 3 Unit 2 You can use the computers.(說課稿)-2023-2024學(xué)年外研版(一起)英語五年級下冊001
- 6 傳統(tǒng)游戲我會玩 第二課時 說課稿-2023-2024學(xué)年道德與法治二年級下冊統(tǒng)編版
- 2022年湖南省公務(wù)員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 國家安全教育課程教學(xué)大綱分享
- 養(yǎng)殖場獸醫(yī)服務(wù)合同
- 電氣工程及其自動化基礎(chǔ)知識單選題100道及答案解析
- HR六大板塊+三支柱體系
- 慢性病患者門診身份管理方案
- 2025年高考英語一輪復(fù)習(xí)講義(新高考)第2部分語法第23講狀語從句(練習(xí))(學(xué)生版+解析)
- 連鑄工職業(yè)技能大賽考試題庫-上(單選、多選題)
- 2024年全國統(tǒng)一高考數(shù)學(xué)試卷(新高考Ⅱ)含答案
- 十七個崗位安全操作規(guī)程手冊
- 爆花(2023年陜西中考語文試卷記敘文閱讀題及答案)
評論
0/150
提交評論