广义表
作者:互联网
结点结构(扩展线性链表)
1 typedef char AtomType; 2 enum ElemTag { ATOM, LIST }; 3 4 typedef struct GLNode 5 { 6 ElemTag tag; 7 8 union 9 { 10 AtomType atom; 11 struct GLNode* head; 12 }value; 13 14 struct GLNode* next; 15 }GLNode;
创建广义表(带头结点:因为广义表本身也是一个表结点)
1 GLNode* CreateGList(GLNode* A) 2 {//带头结点 3 //假定广义表中元素类型为ElemType为char类型,每个原子的值被限定为单个字符。 4 //并假设广义表是一个正确的表达式,其格式为: 5 //元素之间用一个逗号分隔,表元素的起止符号为左、右括号,空表在元括号内包含#。 6 char ch = '\0'; 7 8 scanf("%c", &ch); 9 if (ch != '\0') 10 {//表达式未结束 11 A = (GLNode*)calloc(1, sizeof(GLNode)); 12 if (ch == '(') 13 { 14 A->tag = LIST; 15 A->value.head = CreateGList(A->value.head); 16 } 17 else if (ch == '#' || ch == ')') 18 { 19 A = NULL; 20 } 21 else 22 {//原子结点 23 A->tag = ATOM; 24 A->value.atom = ch; 25 } 26 } 27 else 28 { 29 A = NULL; 30 } 31 32 scanf("%c", &ch); 33 if (A != NULL) 34 { 35 if (ch == ',') 36 { 37 A->next = CreateGList(A->next); 38 } 39 else 40 { 41 A->next = NULL; 42 } 43 } 44 return A; 45 }
打印广义表
1 void PrintGList(GLNode* A) 2 { 3 if (A) 4 { 5 if (A->tag == LIST) 6 { 7 printf("("); 8 if (A->value.head) 9 { 10 PrintGList(A->value.head); 11 } 12 } 13 else 14 {//原子结点 15 printf("%c", A->value.atom); 16 } 17 18 if (A->tag == LIST) 19 { 20 printf(")"); 21 } 22 if (A->next) 23 { 24 printf(","); 25 PrintGList(A->next); 26 } 27 }//广义表非空 28 }
取广义表的表头(因为存储结构带头结点,所以要取下一层的表头)
1 GLNode* GetHead(GLNode* A) 2 { 3 if (A->tag != LIST) 4 {//带头结点的广义表 5 exit(-1); 6 } 7 8 A = A->value.head; 9 if (A == NULL) 10 { 11 return NULL; 12 } 13 else if (A->tag == ATOM) 14 { 15 exit(-1); 16 } 17 else 18 { 19 return A->value.head; 20 } 21 }View Code
标签:结点,ch,head,value,GLNode,广义,else 来源: https://www.cnblogs.com/lvhui123/p/15759435.html