用c语言写一个广义表 A=((a,b,c),(d,e,f))
时间: 2023-10-13 08:06:47 浏览: 99
您好!以下是用C语言编写广义表的代码:
```
#include<stdio.h>
#include<stdlib.h>
typedef struct GLNode{
int tag; // 标志域,tag=1为原子,tag=0为子表
union{
char atom; // 原子结点的值域
struct GLNode* hp; // 子结点指针
}val;
struct GLNode* tp; // 指向下一个子节点
}*GList;
void CreateGList(GList *L, char* str); // 创建广义表
void PrintGList(GList L); // 输出广义表
void CreateGList(GList *L, char* str){
if(!L) return;
char c = *str++; // 获取第一个字符
if(!c) *L = NULL; // 如果字符串为空,则广义表也为空
else{
*L = (GList)malloc(sizeof(struct GLNode)); // 分配内存
if(c == '('){ // 如果当前字符为'(',则说明是子表
(*L)->tag = 0; // 标记为子表
(*L)->val.hp = NULL; // 初始化子结点指针
CreateGList(&((*L)->val.hp), str); // 递归创建子表
c = *str++; // 获取下一个字符
}else{
(*L)->tag = 1; // 否则为原子
(*L)->val.atom = c; // 存储原子值
c = *str++; // 获取下一个字符
}
(*L)->tp = NULL; // 初始化下一个子节点指针
if(c == ','){ // 如果下一个字符为',',则说明还有兄弟子节点
CreateGList(&((*L)->tp), str); // 递归创建兄弟节点
}
else if(c == ')'){ // 如果下一个字符为')',则子节点创建完毕
return;
}
}
}
void PrintGList(GList L){
if(!L) return;
if(L->tag == 1){ // 如果当前节点为原子
printf("%c", L->val.atom);
}else{ // 否则为子表
printf("(");
PrintGList(L->val.hp); // 递归输出子表
printf(")");
}
if(L->tp) printf(","); // 如果有兄弟子节点,则输出','
PrintGList(L->tp); // 递归输出兄弟子节点
}
int main(){
char* str = "((a,b,c),(d,e,f))";
GList L;
CreateGList(&L, str);
PrintGList(L);
printf("\n");
return 0;
}
```
希望对您有帮助~
阅读全文