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);
}