廣義表是線性表的推廣,又稱列表。線性表的元素只限於原子項,即每個資料元素只能是乙個數或乙個記錄,如果放鬆對線性表元素的這種限制,允許他們自身具有結構,那麼就產生了廣義表。
廣義表是一種多層次的線性結構,像是一顆倒扣的樹,實際上,這也算是一種樹形結構。廣義表不僅是線性表的推廣,也算是樹結構的推廣。
廣義表的元素本身可以具有結構,這是一種帶有層次性的線性結構。這裡我們定義了三個域。乙個為tag標誌位,指示了當前元素是原子還是子表。廣義表規定了當tag為0時,當前原子項為原子(data),當tag為1時,當前原子項指向下乙個原子子表的位址。(slink),即當廣義表中的某個節點出現了data時,不可能出現節點slink。這個我們可以通過union聯合體來實現。
另乙個節點是link。link指向了同一層次的下乙個元素的位址。類似於鍊錶中得到next,link把每乙個節點都竄通在了一起,不同於slink的是,link指向下乙個節點,slink指向子表,當slink存在是,link一定為null。
建立廣義表輸出廣義表查詢廣義表中元素獲取廣義表中的tail尾表獲取廣義表深度
其中tag為標誌位,data和slink在聯合體中,link指向下乙個節點,當節點是本層次最後乙個元素時,link為null
typedef enum nodetag;
template typedef struct glnode;
glnode* link;
}*glist;
使用者輸入字元。若當前字元為左括號,則設當前tag為1(list),否則當前tag為0(atom),若使用者輸入為空格,則廣義表為空表。由上圖可知,廣義表建立是乙個遞迴的過程,所以這裡使用遞迴來實現。當然如果表特別大對記憶體空間有很大壓力,則我們可以使用棧來模擬遞迴操作。最後本函式結尾返回廣義表頭
glist createglist(glist gl)
else
} else gl = null;
ch = getchar();
if (gl != null)
}
廣義表輸出也是乙個遞迴的操作。這裡我們先判斷廣義表的標誌位tag。如果tag為list,則暗示當前節點指向了下乙個子表的位址。那麼我們使用遞迴來訪問當前節點的子表的位址slink。當然如果slink為空,那麼子表就是空表,自然就需要輸出空格了。當前子表判斷後,我們可以繼而判斷當前層次的下乙個元素。如果link為空,則當前表結束。否則我們每當訪問乙個link,輸出乙個逗號,並遞迴的訪問下乙個元素的位址。輸出。
void printglist(glist gl = this.gl)
else
if (gl->tag == list)cout << ")";
if (gl->link != null)
} }
這段函式的作用時在廣義表gl中查詢值為x的原子,並且如果查詢成功就令mark的值為1,很容易得出。這也是乙個遞迴的過程。
void findglistx(glist gl,datatype x,int * mark)
else
} }
void depth(glist gl, int * maxdh)
else
} while (gl != null);
(*maxdh)++;
}} }
#include #include using namespace std;
typedef enum nodetag;
template class glist ;
glnode* link;
}*glist;
public:
glist _gl;
glist p;
public:
//建立廣義表的儲存結構
glist createglist(glist gl)
else
} else gl = null;
ch = getchar();
if (gl != null)
} void printglist(glist gl = this.gl)
else
if (gl->tag == list)cout << ")";
if (gl->link != null)
} }void findglistx(glist gl,datatype x,int * mark)
else
} }glist tail()
else return null;
} void depth(glist gl, int * maxdh)
else
} while (gl != null);
(*maxdh)++;
}} }
};int main()
以上即為利用c/c++泛型程式設計實現資料結構之廣義表。類模板可復用。 資料結構之java泛型
雖然該賬號已經申請很長一段時間,每次找資料,csdn上的小夥伴所提供的資訊總能幫我大忙 時間久了,感覺自己只是乙個消費者,並沒有做出一點點貢獻。最近,腦子一熱,買了乙個資料結構與演算法分析,第一小節看的就是泛型,回頭想想,好像大學裡學的演算法都是以這種泛型方法展示的,廢話不多說,自己總結一丟丟。1....
基本泛型資料結構
資料結構 電腦程式的靈魂 資料結構選取的好壞直接決定了演算法效率的高低和實現的複雜程度 資料結構的組織與訪問特性,決定了演算法的選取與實現 list 用陣列儲存資料 資料項查詢複雜度為o n 下標查詢複雜度為o 1 當資料空間不夠時,擴大1陪空間 將資料從原有緩衝區複製到新的緩衝區中 帶來o n 的...
《資料結構與演算法》之泛型 使用介面型別表示泛型
如 考慮再由一些項組成的陣列中找出最大項的問題。基本的 是型別無關的,但是它需要一種能力來比較任意兩個物件。因此,不能直接找出object的陣列中的最大元素 我們需要更多的資訊。最簡單的方法就是找出comparable的陣列中的最大元。要確定順序,可以使用compareto方法,它對所有的compa...