帮我用C语言完成以下编程(49.广义表的应用 本设计要求实现的广义表的建立、查找、输出、取表头和取表尾以及求深度。 本设计用一个主控菜单程序控制,共分为6个子系统。 (1).建立广义表(2)输出广义表(3)结点的查找(4)求广义表表头(5)求广义表表尾(6)求广义表的深度)
时间: 2024-01-05 14:04:05 浏览: 89
好的,下面是用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;
}
```
注意:输入广义表时,请确保输入的字符串符合广义表的语法规则,例如括号匹配等。
阅读全文