帮我用C语言完成以下编程(49.广义表的应用 本设计要求实现的广义表的建立、查找、输出、取表头和取表尾以及求深度。 本设计用一个主控菜单程序控制,共分为6个子系统。 (1).建立广义表(2)输出广义表(3)结点的查找(4)求广义表表头(5)求广义表表尾(6)求广义表的深度)

时间: 2024-01-05 11:04:05 浏览: 29
好的,下面是用C语言实现广义表建立、查找、输出、取表头、取表尾以及求深度的完整代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 //定义广义表中元素的最大长度 typedef struct GLNode{ int tag; //0表示原子,1表示子表 union { char data[MAXSIZE]; //原子结点的值 struct GLNode *sublist; //子表的指针 }atom; struct GLNode *next; //指向下一个广义表结点的指针 }GLNode, *GList; //建立广义表 GList createGList(char *s); //查找广义表 GList searchGList(GList L, char *x); //输出广义表 void printGList(GList L); //取表头 GList getHead(GList L); //取表尾 GList getTail(GList L); //求广义表的深度 int getDepth(GList L); int main() { GList L = NULL; int choice; char x[MAXSIZE]; while (1) { printf("**********广义表操作菜单**********\n"); printf("1.建立广义表\n2.输出广义表\n3.结点的查找\n4.求广义表表头\n5.求广义表表尾\n6.求广义表的深度\n0.退出程序\n"); printf("请输入要进行的操作:"); scanf("%d", &choice); switch (choice) { case 0: printf("程序已退出\n"); return 0; case 1: printf("请输入广义表:"); scanf("%s", x); L = createGList(x); printf("广义表已建立\n"); break; case 2: if (!L) printf("广义表为空\n"); else { printf("广义表为:"); printGList(L); printf("\n"); } break; case 3: if (!L) printf("广义表为空\n"); else { printf("请输入要查找的元素:"); scanf("%s", x); GList p = searchGList(L, x); if (!p) printf("未找到元素 %s\n", x); else printf("找到元素 %s\n", x); } break; case 4: if (!L) printf("广义表为空\n"); else { GList head = getHead(L); if (head) { printf("表头为:"); printGList(head); printf("\n"); } else { printf("广义表为原子结点,无法取表头\n"); } } break; case 5: if (!L) printf("广义表为空\n"); else { GList tail = getTail(L); if (tail) { printf("表尾为:"); printGList(tail); printf("\n"); } else { printf("广义表为原子结点,无法取表尾\n"); } } break; case 6: if (!L) printf("广义表为空\n"); else { int depth = getDepth(L); printf("广义表的深度为:%d\n", depth); } break; default: printf("输入有误,请重新输入\n"); break; } } return 0; } //建立广义表 GList createGList(char *s) { GList p, t, h = NULL; int k, len; len = strlen(s); for (int i = 0; i < len; ) { p = (GList)malloc(sizeof(GLNode)); if (!h) { //第一个结点 h = p; t = h; } else { t->next = p; t = p; } if (s[i] == '(') { p->tag = 1; //子表结点 int j = i + 1, cnt = 1; while (cnt) { j++; if (s[j] == '(') cnt++; else if (s[j] == ')') cnt--; } char *sub_s = (char *)malloc(sizeof(char) * (j - i - 1)); strncpy(sub_s, s + i + 1, j - i - 1); sub_s[j - i - 1] = '\0'; p->atom.sublist = createGList(sub_s); //递归创建子表 i = j + 1; } else { p->tag = 0; //原子结点 k = 0; while (s[i] != '(' && s[i] != ')' && s[i] != ',' && i < len) { p->atom.data[k++] = s[i++]; } p->atom.data[k] = '\0'; } p->next = NULL; } return h; } //查找广义表 GList searchGList(GList L, char *x) { GList p; if (!L) return NULL; if (L->tag == 0) { //原子结点 if (strcmp(L->atom.data, x) == 0) return L; else return NULL; } else { //子表结点 p = searchGList(L->atom.sublist, x); if (p) return p; else return searchGList(L->next, x); } } //输出广义表 void printGList(GList L) { if (!L) return; if (L->tag == 0) printf("%s", L->atom.data); else { printf("("); printGList(L->atom.sublist); printf(")"); } if (L->next) { printf(","); printGList(L->next); } } //取表头 GList getHead(GList L) { if (!L) return NULL; if (L->tag == 0) return NULL; //原子结点没有表头 else return L->atom.sublist; } //取表尾 GList getTail(GList L) { if (!L) return NULL; if (L->tag == 0) return NULL; //原子结点没有表尾 else return L->next; } //求广义表的深度 int getDepth(GList L) { if (!L) return 1; if (L->tag == 0) return 0; int max_depth = 0, depth; GList p = L->atom.sublist; while (p) { depth = getDepth(p); if (depth > max_depth) max_depth = depth; p = p->next; } return max_depth + 1; } ``` 注意:输入广义表时,请确保输入的字符串符合广义表的语法规则,例如括号匹配等。

相关推荐

最新推荐

recommend-type

C语言实现顺序表的顺序查找和折半查找

主要为大家详细介绍了C语言实现顺序表的顺序查找和折半查找,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C语言实现带头结点的链表的创建、查找、插入、删除操作

主要介绍了C语言实现带头结点的链表的创建、查找、插入、删除操作方法,对于了解数据结构中链表的各项操作有很好的借鉴价值,需要的朋友可以参考下
recommend-type

C语言基于哈希表实现通讯录

主要为大家详细介绍了C语言基于哈希表实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

40个C语言的基础编程题.doc

40个C语言基础编程题,难度适中,适合新手小白练习,里面涵盖了斐波那契数列、101~200的素数、水仙花数、国际象棋棋盘等。
recommend-type

C语言链表题目(附答案).docx

大一初学C语言时的期末作业,涉及到链表的建立和功能的实现,涉及指针、函数、动态结构建立等方面的知识,初学者可以参考参考尝试尝试哟!!!
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。