typedef enum
{ATOM,LIST
}Nodetype;//枚举类型
typedef struct GLnode
{Nodetype tag;//原子 或者 子表union {char atom;//字母struct{struct GLnode* head;struct GLndoe* tail;};};
}GLnode;
//创建原子结点
GLnode* createAtom(char data)
{GLnode* newnode = (GLnode*)malloc(sizeof(GLnode));if (newnode == NULL){perror("error");exit(1);}newnode->tag = ATOM;newnode->atom = data;return newnode;
}
//创建子表结点
GLnode* createList(GLnode* head, GLnode* tail)
{GLnode* newnode = (GLnode*)malloc(sizeof(GLnode));if (newnode == NULL){perror("error");exit(1);}newnode->tag = LIST;newnode->head = head;newnode->tail = tail;return newnode;
}
//打印广义表
void printNode(GLnode* node)
{if(node == NULL){printf("()");}if (node->tag == ATOM){printf("%c", node->atom);}else{printf("(");GLnode* pcur = node;while (pcur){printNode(pcur->head);if (pcur->tail != NULL){printf(",");}pcur = pcur->tail;}printf(")");}
}
int main()
{GLnode* atomA = createAtom('a');GLnode* atomB = createAtom('b');GLnode* atomC = createAtom('c');GLnode* atomD = createAtom('d');GLnode* suiblist = createList(atomA, createList(atomB, NULL));GLnode* list = createList(atomC, createList(suiblist,createList(atomD,NULL)));printNode(list);printf("\n");printNode(suiblist);}