【知识点】广义表初步

广义表的概念

广义表,又称列表,是一种线性存储结构,可以存储单个元素,也可以存储广义表自身。
例如(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)。

posted @ 2025-01-12 13:51  Alkaid16  阅读(51)  评论(0)    收藏  举报