廣義表及其存儲方式簡介

廣義表(Lists,又稱列表)是線性表的推廣。線性表定義為n>=0個元素a1,a2,a3,…,an的有限序列。線性表的元素僅限于原子項,原子是作為結構上不可分割的成分,它可以是一個數或一個結構,若放松對表元素的這種限制,容許它們具有其自身結構,這樣就產生了廣義表的概念。

?????廣義表是n (n>=0)個元素a1,a2,a3,…,an的有限序列,其中ai或者是原子項,或者是一個廣義表。通常記作LS=(a1,a2,a3,…,an)。LS是廣義表的名字,n為它的長度。若ai是廣義表,則稱它為LS的子表。

抽象數據類型廣義表的定義如下:

ADT Glist

{

???數據對象:?D={ei | i=1,2,..,n;n>=0 ;??ei?AtomSet?或ei??Glist,

?????????????????????????????????????AtomSet為某個數據對象}

???數據關系:R1={< ei-1, ei > | ei-1 , ei??D,2<=i<=n}

???基本操作:

???????InitGList( &L);

?????????????操作結果:創建空的廣義表L。

???????CreateGList(&L,S);

?????????????初始條件:S是廣義表的書寫形式串。

?????????????操作結果:由S創建廣義表L。

???????DestroyGList(&L);

????????????初始條件:廣義表L存在。

????????????操作結果:銷毀廣義表L。

CopyGList( &T,L);

????????????初始條件:廣義表L存在。

????????????操作結果:由廣義表L復制得到廣義表T。

???????GListLength(L);

????????????初始條件:廣義表L存在。

????????????操作結果:求廣義表L的長度,即元素個數。

???????GListDepth(L);

????????????初始條件:廣義表L存在。

????????????操作結果:求廣義表L的深度。

???????GListEmpty (L);

????????????初始條件:廣義表L存在。

????????????操作結果:判定廣義表L是否為空。

???????GetHead(L);

????????????初始條件:廣義表L存在。

????????????操作結果:取廣義表L的頭。

GetTail( &T,L);

????????????初始條件:廣義表L存在。

????????????操作結果:取廣義表L的尾。

???????InsertFirst_GL(&L,e);

????????????初始條件:廣義表L存在。

????????????操作結果:插入元素e作為廣義表L的第一元素。

???????DeleteFirst_GL(&L,&e);

????????????初始條件:廣義表L存在。

????????????操作結果:刪除廣義表L的第一元素,并用e返回其值。

???????Traverse_GL (L,visit());

????????????初始條件:廣義表L存在。

????????????操作結果:遍歷廣義表L,用函數visit處理每個元素。

通常用圓括號將廣義表括起來,用逗號分隔其中的元素。為了區別原子和廣義表,書寫時用大寫字母表示廣義表,用小寫字母表示原子。若廣義表LS(n>=1)非空,則a1是LS的表頭,其余元素組成的表(a2,…an)稱為LS的表尾。

????顯然廣義表是遞歸定義的,這是因為在定義廣義表時又用到了廣義表的概念。廣義表的例子如下:

(1)A=()——A是一個空表,其長度為零。

(2)B=(e)——表B只有一個原子e,B的長度為1。

(3)C=(a,(b,c,d))——表C的長度為2,兩個元素分別

?????????為原子a和子表(b,c,d)。

(4)D=(A,B,C)——表D的長度為3,三個元素

????????都是廣義表。顯然,將子表的值代入后,

?????????則有D=(( ),(e),(a,(b,c,d)))。

(5)E=(E)——這是一個遞歸的表,它的長度為2,E相當于一個無限的廣義表E=(a,(a,(a,(a,…)))).

從上述定義和例子可推出廣義表的三個重要結論:

(1)廣義表的元素可以是子表,而子表的元素還可以是子表,。由此,廣義表是一個多層次的結構,可以用圖形象地表示。P108

?

(2)廣義表可為其它表所共享。例如在上述例(4)中,廣義表A,B,C為D的子表,則在D中可以不必列出子表的值,而是通過子表的名稱來引用。

?

(3)廣義表的遞歸性。

?????綜上所述,廣義表不僅是線性表的推廣,也是樹的推廣。

由表頭、表尾的定義可知:任何一個非空廣義表其表頭可能是原子,也可能是列表,而其表尾必定是列表。

??????????gethead(B)=e?????????gettail(B)=(??)

??????????gethead(D)=A????????gettail(D)=(B,C)

?

??????由于(B,C)為非空廣義表,則可繼續分解得到:

?????????gethead(B,C)=B?????????gettail(B,C)=(C)

??

????注意廣義表(?)和( ( ) )不同。前者是長度為0的空表,

對其不能做求表頭的和表尾的運算;而后者是長度為1的非空表(只不過該表中唯一的一個元素是空表)。對其可進行分解,得到表頭和表尾均為空表(?)。

?

?

廣義表的存儲結構

由于廣義表(a1,a2,a3,…an)中的數據元素可以具有不同的結構,(或是原子,或是廣義表),因此,難以用順序存儲結構表示,通常采用鏈式存儲結構,每個數據元素可用一個結點表示。

????由于廣義表中有兩種數據元素,原子或廣義表,因此,需要兩種結構的結點:一種是表結點,用以表示列表;一種是原子結點,用以表示原子。?

?

  若列表不空,則可分解成表頭和表尾;反之,一對確定的表頭和表尾可唯一確定列表。由此,一個表結點可由三個域組成:標志域、指示表頭的指針域和指示表尾的指針域;而原子結點只需兩個域:標志域和值域。

1、僅有表結點由三個域組成:

    標志域、指示表頭的指針域和指示表尾的指針域;而原子域只需兩個域:標志域和值域。

頭尾鏈表存儲表示

[cpp]?view plaincopy
  1. typedef?enum?{ATOM,LIST?}?ElemTag;??//ATOM==0:表示原子,LIST==1:表示子表??
  2. typedef?struct?GLNode?{??
  3. ????ElemTag??tag;??//公共部分,用以區分原子部分和表結點??
  4. ????union?{???????//原子部分和表結點的聯合部分??
  5. ??????AtomType??atom;?//atom是原子結點的值域,AtomType由用戶定義??
  6. ??????struct?{?struct?GLNode?*hp,?*tp;}?ptr;??
  7. ?????????????//?ptr是表結點的指針域,ptr.hp?和ptr.tp分別指向表頭和表尾??
  8. ????};??
  9. }?*Glist;??//廣義表類型??


示例如圖:

這種存儲結構的三個特點:

1。除空表的表頭指針為空外,對任何非空列表,其表頭指針均指向一個表結點,且該結點中的hp域指示列表表頭,tp域指向列表表尾(除非表尾為空,則指針為空,否則必為表結點);

2。容易分清列表中原子和子表所在層次。如在列表D中,原子e和a在同一層次上,而b、c和d在同一層次且比e和a低一層,B和C是同一層的子表;

3。最高層的表結點個數即為列表的長度。

?

2、表結點和原子結點均由三個域組成:標志域、指示表頭的指針域和指示表尾的指針域;原子結點的三個域為:標志域、值域和指示表尾的指針域。

其類型定義如下:

?

擴展線性鏈表存儲表示

[cpp]?view plaincopy
  1. Typedef?enum?{?ATOM,LIST}?ElemTag;????????????????????????????????
  2. ????//ATOM==0:表示原子,LIST==1:表示子表??
  3. Typedef?struct?GLNode?{??
  4. ????ElemTag????tag;??//公共部分,用以區分原子部分和表結點??
  5. ????union?{??//原子部分和表結點的聯合部分??
  6. ????????AtomType????atom;??//原子結點的值域??
  7. ????????struct?GLNode??*hp;??//表結點的表頭指針??
  8. ????????};??
  9. ????????struct?GLNode????*tp;????
  10. ????????????????//相當于線性鏈表的next,指向下一個元素結點??
  11. }?*Glist;??//廣義表類型Glist?是一種擴展的線性鏈表??


示例如圖:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453327.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453327.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue.js:路由

ylbtech-Vue.js&#xff1a;路由1.返回頂部 1、Vue.js 路由 本章節我們將為大家介紹 Vue.js 路由。 Vue.js 路由允許我們通過不同的 URL 訪問不同的內容。 通過 Vue.js 可以實現多視圖的單頁Web應用&#xff08;single page web application&#xff0c;SPA&#xff09;。 Vue.…

圖片轉excel:“保留數字格式”在什么場景下該勾

保留數字格式是什么意思呢&#xff1f;顧名思義&#xff0c;就是將轉出來的數字保留為數字格式&#xff0c;而不是文本格式。我們知道&#xff0c;OCR程序將圖片上的文字識別為電腦可編輯的文字后&#xff0c;如果導入到excel不加處理&#xff0c;則單個數字過長的文字就會被ex…

html概述和基本結構

html概述 HTML是 HyperText Mark-up Language 的首字母簡寫&#xff0c;意思是超文本標記語言&#xff0c;超文本指的是超鏈接&#xff0c;標記指的是標簽&#xff0c;是一種用來制作網頁的語言&#xff0c;這種語言由一個個的標簽組成&#xff0c;用這種語言制作的文件保存的是…

linux添加三權,基于SELinux的三權分離技術的研究

目前&#xff0c;Linux操作系統已廣泛應用于各種設備和產品中&#xff0c;如服務器、PC機、機頂盒及路由器等。隨著Linux系統的不斷發展和廣泛應用&#xff0c;Linux系統的安全問題也引起越來越多的關注。在Linux操作系統中&#xff0c;存在一個超級用戶即root用戶。root也稱為…

二叉樹、樹和有序樹的區別

樹&#xff1a;子樹沒有左右之分 二叉樹、有序樹:左右有序 二叉樹與有序樹&#xff1a;在只有一棵樹的情況下&#xff0c;二叉樹有左右之分、有序樹無左右之分 另外&#xff1a;二叉樹是有序的&#xff0c;可以為空或一個根節點以及兩個分別稱為左子樹和右子樹的互不相交的二叉…

高效程序員

軟件開發人員的作戰手冊 - 讓程序員活的久一點 1. 程序員的職業準則是&#xff1a;誠實&#xff08;如實的報告你的狀態&#xff0c;風險和出現的問題&#xff09;&#xff0c;守信&#xff08;承諾完成的任務就要按時完成&#xff09;&#xff0c;尊重&#xff08;尊重給你的代…

PHP學習筆記1

1.什么是PHP&#xff1f; Hypertext Preprocessor(超文本預處理語言)。 是腳本語言。 是最流行的網站開發語言。 2.PHP能做什么&#xff1f; 可以生成動態頁面內容。 可以創建、打開、讀取、寫入、關閉服務器上的文件。 可以手機表單數據。 可以發送和接收cookies。&#xf…

Redis在windows下的配置

原文:Redis在windows下的配置 Redis在windows下的配置&#xff08;在windows-64下安裝redis&#xff0c;請參考微軟redis的github&#xff1a;https://github.com/MSOpenTech/redis/releases&#xff09;下面是windows32的配置 下載地址http://files.cnblogs.com/files/cuiweny…

linux磁盤符變化autofs,Linux基礎教程學習筆記之Autofs自動掛載

Linux基礎教程學習筆記之Autofs自動掛載Autofs自動掛載&#xff1a;yum -y install autofsvim /etc/auto.master 在文件中添加下面行/home/guests /etc/auto.tianyunvim /etc/auto.tianyun 子掛載點監控ldapuser0 -rw,sync classroom:/home/guests/ldapuser0systemctl enable …

二叉樹的遞歸遍歷(先序,中序,后序)

#include "stdio.h" #include "malloc.h" #define M 100 typedef struct node { /* 采用二叉鏈表存儲結構 */char data;struct node *lchild,*rchild; }BTnode; BTnode *create()/*利用先序遍歷的過程創建二叉樹*/ {BTnode *t;char ch;scanf("%c&quo…

DOM-動態操作心得

這個知識點都是之前看過的,就當是復習了 一、創建元素的三種方法 第一種: document.write() 識別標簽但會覆蓋之前內容第二種: 用元素自身的innerHTML方法 不識別標簽但可以不覆蓋之前內容 ul.innerHTML "<li></li>"; 第三種:利用DOM自身api創建元素 …

linux探索之旅pdf,【Linux探索之旅】第四部分第一課:壓縮文件,解壓無壓力

內容簡介1、第四部分第一課&#xff1a;壓縮文件&#xff0c;解壓無壓力2、第四部分第二課&#xff1a;SSH連接&#xff0c;安全快捷壓縮文件&#xff0c;解壓無壓力最近小編因為換工作&#xff0c;從南法搬到巴黎。折騰了很久。網絡一直用的是公共的無線網&#xff0c;信號不行…

遍歷二叉樹的全部方法(遞歸+非遞歸)

#include<iostream> #include<queue> #include<stack> using namespace std; //二叉樹結點的描述 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍…

如何在本地搭建一個Android應用crashing跟蹤系統-ACRA

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAndroid%E5%BA%94%E7%94%A8crashing%E8%B7%9F%E8%B8%AA%E7%B3%BB%E7%BB%9F%EF%BC%8DACRA 如何在本地搭建一個Andr…

20165222第一周查漏補缺

一&#xff0c;第一章要點總結 1&#xff0c;java的特點&#xff1a;面向對象&#xff0c;動態&#xff0c;平臺無關。 2&#xff0c;對于帶包程序的編譯&#xff1a;注意javac -d 編譯到一個文件夾內&#xff0c;然后java -cp 文件夾名 包名.類名。 第一章是比較簡單的&#x…

學習中的十七條建議

作者&#xff1a;孤劍 對于一個自學的人來說&#xff0c;幾條規則當然是必要的了&#xff0c;以下是我自己的一些心得。 1。自信是你成功的第一要素&#xff1b; 2。用心去學&#xff0c;活學活用&#xff1b; 3。新手不要“好高騖遠”&#xff0c;老手不要“驕傲自大”&#x…

tp5 linux路由不跳轉,thinkphp5路由不生效一直跳到首頁的解決方法

自從用laravel框架后&#xff0c;好久沒用過thinkphp框架了&#xff0c;早期用的3.x系列&#xff0c;想熟悉一下thinkphp5&#xff0c;結果入坑了&#xff1b;路由配置一直不起作用&#xff0c;總是跳到首頁&#xff0c;折騰了好久&#xff0c;后來發現是nginx配置的問題&#…

stack堆棧簡介

stack堆棧簡介 堆棧是一個線性表&#xff0c;插入和刪除只在表的一端進行。這一端稱為棧頂(Stack Top)&#xff0c;另一端則為棧底(Stack Bottom)。堆棧的元素插入稱為入棧&#xff0c;元素的刪除稱為出棧。由于元素的入棧和出棧總在棧頂進行&#xff0c;因此&#xff0c;堆棧是…

一份從 0 到 1 的 Java 項目實踐清單

2019獨角獸企業重金招聘Python工程師標準>>> 看了一篇文章&#xff0c;感覺還可以&#xff0c;就給大家共享一下&#xff1a; 對于著手一個項目的時候&#xff0c;要從以下入手&#xff08;即項目清單&#xff09;&#xff1a; 1. 項目規劃 1.1 首先&#xff0c;你得…

JWT 簡介

JWT是一種用于雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規范。JWT作為一個開放的標準&#xff08;RFC 7519&#xff09;&#xff0c;定義了一種簡潔的&#xff0c;自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。因為數字簽名的存在&#xff0c;這些信…