廣義表是n個元素的有限序列,每一個元素都是原子項或者是廣義表,通常記作LS=(a1,a2,an),如果是a1廣義表為其字表稱為表頭,其余元素為表尾。
廣義表的性質:
(1)廣義表的元素可以是子表或是元素,而子表內還可以包含子表,因此廣義表可以多層結構。
(2)廣義表具有遞歸和共享的性質。
廣義表的基本運算:
廣義表是一種多層次的線性結構,根樹形結構相同。所以有基本的取表頭,取表尾,取表長,取表深度。
廣義表的存儲結構:
由於元素本身具有結構,所以是一種帶有層次的非線性結構,通常采用鏈式存儲結構,每個元素可以用結點表示,結點結構分三部分,tag、data/slink, link。tag表示標志位,用來區分結點是原子還是子表,第二個slink存放子表地址,如果是原子,data表示值,link表示后一個結點。

#include <stdio.h> #include <stdlib.h> #define DataType char typedef enum {atom, list} NodeTag; // atom = 0 表示原子,list = 1 表示子表 typedef struct CLNode{ NodeTag tag; union { DataType data; struct CLNode *slink; }; struct CLNode *link; } *Glist; Glist p; /** **創建廣義表 **/ Glist CreateGList(Glist GL) { char ch; scanf("%c", &ch); if (ch == ' ') { GL = (Glist)malloc(sizeof(struct CLNode)); if (ch == '(') { GL->tag = list; GL->slink = CreateGList(GL->slink);//遞歸調用 } else { GL->tag = atom; GL->data = ch; } }else { GL = NULL; } scanf("%c", &ch); if (GL != NULL) { if (ch == ',') GL->link = CreateGList(GL->link); else GL->link = NULL; } return GL; } /** **輸出廣義表 **/ void PrintGList(Glist GL) { if (GL != NULL) { if (GL->tag == list) { printf("("); if (GL->slink == NULL) printf(" "); else PrintGList(GL->slink); } else printf("%c", GL->data); if (GL->tag == list) printf(")"); if (GL->link != NULL) printf(","); PrintGList(GL->link); } } /** **查找廣義表 **/ void FindGlistX(Glist GL, DataType x, int *mark) { if (GL != NULL) { if (GL->tag == 0 && GL->data == x) { p = GL; *mark = 1; } else if (GL->tag == 1) FindGlistX(GL->slink, x, mark); FindGlist(GL->link, x, mark); } } /** **表頭 **/ Glist head(Glist GL) { Glist p; if (GL != NULL && GL->tag != 0) { p = GL->slink; p->link = NULL; return p; } else return NULL; } /** **表尾 **/ Glist tail(Glist GL) { Glist p; if (GL != NULL && GL->tag != 0) { p = GL->slink; p = p->link; GL->slink = p; } else { return p; } } /** ** 深度 **/ void depth(Glist GL, int *maxdh) { int h; if (GL->tag == 0) *maxdh = 0; else { if (GL->tag == 1 && GL->slink == NULL) { *maxdh = 1; } else { GL = GL->slink; *maxdh = 0; do { depth(GL, &h); if (h > *maxdh) *maxdh = h; GL = GL->link; }while(GL != NULL); *maxdh = *maxdh + 1; } } }