原题链接:数据结构-广义表的基本操作
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复