广义表是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; } } }