原题链接:数据结构-广义表的基本操作
参考代码:
#include<stdio.h> #include<string.h> #include<malloc.h> #define MAX_STR_LEN 101 typedef char AtomType; typedef enum { ATOM, LIST } ElemTag; typedef struct GLNode { ElemTag tag; union { AtomType atom; struct { struct GLNode *hp; struct GLNode *tp; } ptr; }; } GLNode, *GList; void SubString(char *sub, char *str, int start, int end); void SplitHeadStr(char *str, char *headstr); void CreateGList(GList *G, char *str); int GListDepth(GList G); int main() { GList G = NULL; char str[MAX_STR_LEN]; scanf("%s", str); CreateGList(&G, str); int dep = GListDepth(G); printf("%d\n", dep); return 0; } void SubString(char *sub, char *str, int start, int end) { for (char *temp = str + start; temp <= str + end; temp++) { *sub++ = *temp; } *sub = '\0'; } void SplitHeadStr(char *str, char *headstr) { int n = strlen(str); int i = 0, k = 0; do { if (str[i] == '(') k++; if (str[i] == ')') k--; i++; } while (i < n && (str[i] != ',' || k != 0)); if (i < n) { SubString(headstr, str, 0, i - 1); SubString(str, str, i + 1, n - 1); } else { strcpy(headstr, str); *str = '\0'; } } void CreateGList(GList *G, char *str) { if (!strcmp(str, "()")) { // 若为空表 *G = NULL; } else { // 不为空表 *G = (GList)malloc(sizeof(GLNode)); // 建立表结点 if (strlen(str) == 1) { // 若为原子 (*G)->tag = ATOM; (*G)->atom = *str; } else { // 为子表 char hstr[MAX_STR_LEN] = { 0 }; GList p = *G; (*G)->tag = LIST; SubString(str, str, 1, strlen(str) - 2); // 子表去两边括号() do { SplitHeadStr(str, hstr); // 获取表头hstr,剩下表尾str CreateGList(&p->ptr.hp, hstr); // 递归创建表头 if (str != NULL && strlen(str) != 0) { // 若表尾不为空 GList t = (GList)malloc(sizeof(GLNode)); t->tag = LIST; // 表尾为表 p->ptr.tp = t; p = t; } } while (str != NULL && strlen(str) != 0); p->ptr.tp = NULL; } } } int GListDepth(GList G) { if (!G) return 1; if (G->tag == ATOM) return 0; int max = 0; for (GList p = G; p; p = p->ptr.tp) { int dep = GListDepth(p->ptr.hp); if (max < dep) max = dep; } return max + 1; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复