请写出判断两个广义表是否相等的递归算法,如果两个广义表相等,则输出1,否则输出0。如A=((a)),B=((a)),则A=B,输出1。要求输入的广义表采用链式存储结构存储,并基于链式存储结构编写递归函数。用C语言实现
时间: 2023-11-24 22:07:36 浏览: 81
我们可以设计一个递归函数来判断两个广义表是否相等,具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct GLNode {
int tag; // 标志域,0表示该节点是原子,1表示该节点是广义表
union {
char atom; // 原子节点的值
struct GLNode *sublist; // 指向子表的指针
} data;
struct GLNode *next; // 指向下一个节点的指针
} GLNode, *GList;
// 创建广义表
void createGList(GList *L) {
char c;
scanf("%c", &c);
if (c == '(') {
*L = (GList) malloc(sizeof(GLNode));
(*L)->tag = 1; // 标记为广义表
(*L)->next = NULL;
createGList(&(*L)->data.sublist); // 递归创建子表
} else if (c == ')') {
*L = NULL;
} else if (c == ',') {
createGList(&(*L)->next); // 递归创建兄弟节点
} else {
*L = (GList) malloc(sizeof(GLNode));
(*L)->tag = 0; // 标记为原子
(*L)->data.atom = c;
createGList(&(*L)->next); // 递归创建兄弟节点
}
}
// 判断两个广义表是否相等
int equal(GList L1, GList L2) {
if (L1 == NULL && L2 == NULL) { // 都为空表,相等
return 1;
} else if (L1 == NULL || L2 == NULL) { // 一空一非空,不相等
return 0;
} else if (L1->tag != L2->tag) { // 类型不同,不相等
return 0;
} else if (L1->tag == 0 && L2->tag == 0 && L1->data.atom == L2->data.atom) { // 原子节点值相等
return equal(L1->next, L2->next); // 比较下一个节点
} else if (L1->tag == 1 && L2->tag == 1 && equal(L1->data.sublist, L2->data.sublist)) { // 子表相等
return equal(L1->next, L2->next); // 比较下一个节点
} else { // 其他情况不相等
return 0;
}
}
int main() {
GList A, B;
printf("请输入广义表A:");
createGList(&A);
getchar();
printf("请输入广义表B:");
createGList(&B);
getchar();
if (equal(A, B)) {
printf("A和B相等\n");
} else {
printf("A和B不相等\n");
}
return 0;
}
```
我们首先输入两个广义表A和B,然后调用equal函数判断它们是否相等。equal函数采用递归的方式进行比较,如果两个广义表都为空表,则相等;如果有一个为空表,另一个非空表,则不相等;如果节点类型不同,则不相等;如果节点都是原子节点且值相等,则比较下一个节点;如果节点都是子表且子表相等,则比较下一个节点;否则不相等。
阅读全文