【知识点】广义表初步
广义表的概念
广义表,又称列表,是一种线性存储结构,可以存储单个元素,也可以存储广义表自身。
例如(a,(b,c),d)就是一个广义表。
上面这个广义表,表头为a,表尾为((b,c),d),长度为3,深度为2;
某个广义表中的单个元素称为原子,广义表元素被称为子表。
广义表的存储结构
用tag标记该结点是原子还是子表。如果是原子则停止,如果是子表则包含其表头指针和表尾指针。
接下来这段代码用这种存储结构,声明了形如(a,(b,c),d)的广义表,并且进行了输出。
#include <iostream>
using namespace std;
typedef struct GybNode{
int tag; // tag为0代表原子,为1代表子表
union {
char data; // 原子项
struct {
GybNode *hp, *tp; // 子表的头部和尾部指针
} ptr;
} datas;
} *GybList;
// 创建一个原子节点
GybList CreateAtom(char c){
GybList node = new GybNode;
node->tag = 0;
node->datas.data = c;
return node;
}
// 创建一个子表节点
GybList CreateSublist(GybList head, GybList tail){
GybList node = new GybNode;
node->tag = 1;
node->datas.ptr.hp = head;
node->datas.ptr.tp = tail;
return node;
}
void print(GybList now){
if(now->tag == 0) printf("%c",now->datas.data);
else{
printf("(");
print(now->datas.ptr.hp);
print(now->datas.ptr.tp);
printf(")");
}
return;
}
int main() {
// 创建原子节点
GybList A = CreateAtom('A');
GybList B = CreateAtom('B');
GybList C = CreateAtom('C');
GybList D = CreateAtom('D');
// 创建子表节点 (B,C)
GybList BC = CreateSublist(B, C);
// 创建广义表 (A,(B,C),D)
GybList ABCD = CreateSublist(A, CreateSublist(BC, D)); // (A,(B,C),D)
//打印
print(ABCD);
return 0;
}
输出结果为
(A((BC)D))
广义表的长度、深度
长度是指该广义表的元素个数,宽度是指最深的括号层次(也有定义是:只有原子的广义表深度为1,广义表深度是其表尾的深度+1)。

浙公网安备 33010602011771号