日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构之广义表

發布時間:2023/12/31 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之广义表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源代碼見:點擊打開鏈接

1.定義

? ? 廣義表是對線性表的擴展,在線性表中,表中元素具有原子性,不可分解。如果允許表中的元素具有某種結構,這就引入了廣義表的概念。廣義表的定義如下:

? ? 它是n(n>0)個數據元素a0,a1,……,an-1組成的有限序列,記為GList=(a0,a1,……,an-1),其中,ai(0<=i<n)是原子或子廣義表,原子是不可分解的數據元素。

? ? 語法圖如下:

????

? ? 舉個例子:

中國(北京,上海,江蘇(南京,蘇州),浙江(杭州))

????

2.數據結構

? ? 結構:

????????????????廣義表節點(data數據域,child子表地址域,next后繼結點地址域)

? ? 舉例:已知三個有名廣義表

??????????????L(a,b)

????????????? T(c,L(a,b))

??????????????G(d,L(a,b),T(c,L(a,b)))

G的存儲結構如下:


????

? ? 為什么需要頭節點?便于在表頭增加刪除結點。如果不要頭結點,那么對廣義表的表頭添加刪除,將可能影響其他廣義表中元素。比如,上面G的存儲結構改為不要頭結點的方式。如下:


? ? 如果此時通過G訪問子表L并刪除L中的第一個結點a后,G中L結點的child指向原a結點的后繼結點b。而這樣的刪除并沒有影響到T表中的L結點的child域。如下:


3.廣義表的設計實現

? ? 廣義表的基本操作:遍歷,求深度,插入元素,刪除元素,查找元素,判讀是否為空廣義表。

uml圖如下:


說明:

head:廣義表頭結點

GenList<T>():初始化廣義表,也就是讓head=new GenNode<T>();

boolean depth():求廣義表的深度

int insert(int i,T t):插入原子作為第i個元素,如果插入成功返回1,否則返回0

int insert(int i,GenList<T> gl):插入子廣義表作為第i個元素,如果插入成功返回1,否則返回0

int remove(int i):刪除第i個元素,刪除成功返回1,否則返回0

T getElement(int i):獲取廣義表第i個元素

T setElement(int i,T t):將廣義表的第i個元素設置為t。設置成功返回1,否則返回0


data:元素數據域,是一個T類型的數據

child:地址域,指向子廣義表

next:地址域,指向后繼結點(其實next(GenNode<T>)的類型可以和child(GenList<T>)的類型一樣,因為他們都有共同特征,可以作為廣義表的元素。只不過作為GenNode<T>類型的next沒有作為GenList<T>類型的child一些操作方法。這讓我想起了java設計模式的組合模式,這提供了一種實現廣義表的另一種方法)

GenNode<T>():初始化data,child,next

GenNode<T>(T t):通過t,讓data=t;

GenNode<T>(T t,GenList<T> c,GenNode<T> n):用t,c,n分別初始化data,child,next?


廣義表的遍歷(注意以下的廣義表的遍歷和求深度的方法都是針對再入表的,不適用于遞歸表,不信你試試!),采用的是遞歸的方法,其流程圖如下:


代碼如下:

public String toString() {return this.toString("");}public String toString(String str) {str += "(";for (GenNode<T> p = this.head.getNext(); p != null; p = p.getNext()) {if (p.getChild() == null) {str += p.getData().toString();} else {str += p.getChild().toString();}if (p.getNext() != null) {str += ",";}}return str + ")";}

測試代碼:

GenList<Integer> L=new GenList<Integer>();L.insert(1);L.insert(2);GenList<Integer> T=new GenList<Integer>();T.insert(3);T.insert(L);GenList<Integer> G=new GenList<Integer>();G.insert(4);G.insert(L);G.insert(T);System.out.println(G.toString());

運行結果:


廣義表求深度(針對再入表)的流程圖如下:


代碼如下:

public int depth() {int temp = 0;int max = 0;GenNode<T> p = this.head.getNext();for (; p != null; p = p.getNext(), temp = 0) {if (p.getChild() == null) {temp++;} else {temp = temp + 1 + (p.getChild()).depth();}if (max < temp) {max = temp;}}return max;}c

測試代碼:

public class Main {/*** @auther 馮利* @version 創建時間:2018年5月25日 下午8:01:35* @param args*/public static void main(String[] args) {// TODO Auto-generated method stubGenList<Integer> L=new GenList<Integer>();L.insert(1);L.insert(2);GenList<Integer> T=new GenList<Integer>();T.insert(3);T.insert(L);GenList<Integer> G=new GenList<Integer>();G.insert(4);G.insert(L);G.insert(T);//GenList<Integer> Z=new GenList<Integer>();//Z.insert(Z);//G.remove();System.out.println(G.toString());System.out.println(G.depth());System.out.println(L.toString());System.out.println(L.depth());System.out.println(T.toString());System.out.println(T.depth());//System.out.println(Z.toString());//System.out.println(Z.depth());}

運行結果:



GenList.java

package genList;/*** * @author 馮利* @version 創建時間:2018年5月24日 下午12:49:22* @param <T>* 原子結點類型*/ public class GenList<T> {// 頭結點private GenNode<T> head;// 表示廣義表的大小(沒有考慮深度)int count = 0;/*** 初始化頭結點*/public GenList() {head = new GenNode<T>();}/*** 判讀廣義表是否為空* * @auther 馮利* @version 創建時間:2018年5月24日 下午1:05:01* @return*/boolean isEmpty() {if (head == null || head.next == null) {return true;}return false;}public int depth() {int temp = 0;int max = 0;GenNode<T> p = this.head.getNext();for (; p != null; p = p.getNext(), temp = 0) {if (p.getChild() == null) {temp++;} else {temp = temp + 1 + (p.getChild()).depth();}if (max < temp) {max = temp;}}return max;}/*** 求廣義表的大小* * @auther 馮利* @version 創建時間:2018年5月24日 下午1:09:19* @return*/int size() {return count;}/*** 插入t作為廣義表的第i個元素* * @auther 馮利* @version 創建時間:2018年5月24日 下午1:19:57* @param i* @param t* @return*/int insert(int i, T t) {// 插入點位置大于廣義表可插位置if (i > count) {return 0;}GenNode<T> temp = head;for (int j = 0; j < i; ++j) {temp = temp.next;}GenNode<T> n = new GenNode<T>(t);n.setNext(temp.getNext());temp.setNext(n);++count;return 1;}public int insert(int i, GenList<T> gl) {// 插入點位置大于廣義表可插位置if (i > count) {return 0;}GenNode<T> temp = head;for (int j = 0; j < i; ++j) {temp = temp.next;}GenNode<T> n = new GenNode<T>();n.setNext(temp.getNext());n.setChild(gl);temp.setNext(n);++count;return 1;}public void insert(GenList<T> gl) {insert(count, gl);}public void insert(T t) {insert(count, t);}public String toString() {return this.toString("");}public String toString(String str) {str += "(";for (GenNode<T> p = this.head.getNext(); p != null; p = p.getNext()) {if (p.getChild() == null) {str += p.getData().toString();} else {str += p.getChild().toString();}if (p.getNext() != null) {str += ",";}}return str + ")";}public int remove(int i) {// 插入點位置大于廣義表可插位置if (i >= count) {return 0;}GenNode<T> temp = head;for (int j = 0; j < i; ++j) {temp = temp.next;}temp.setNext(temp.getNext().getNext());--count;return 1;}public void remove() {remove(count - 1);}GenNode<T> getElement(int i) {// 插入點位置大于廣義表可插位置if (i >= count) {return null;}GenNode<T> temp = head;for (int j = 0; j < i; ++j) {temp = temp.next;}return temp.getNext();}public void setElement(int i, T t) {// 插入點位置大于廣義表可插位置if (i >= count) {return;}GenNode<T> temp = head;for (int j = 0; j < i; ++j) {temp = temp.next;}GenNode<T> n = new GenNode<T>(t);n.setNext(temp.getNext().getNext());temp.setNext(n);return;}/*** * @author 馮利* @version 創建時間:2018年5月24日 下午12:49:37* @param <T>*/class GenNode<T> {private T data;private GenList<T> child;private GenNode<T> next;public GenNode() {data = null;child = null;next = null;}public GenNode(T t, GenList<T> c, GenNode<T> n) {data = t;child = c;next = n;}public GenNode(T t) {data = t;child = null;next = null;}public T getData() {return data;}public void setData(T data) {this.data = data;}public GenList<T> getChild() {return child;}public void setChild(GenList<T> child) {this.child = child;}public GenNode<T> getNext() {return next;}public void setNext(GenNode<T> next) {this.next = next;}} }







總結

以上是生活随笔為你收集整理的数据结构之广义表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。