C++ 数据结构 广义表

GeneralList-广义表

广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。

广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。

<1> A = ()

<2> B = (a,b)

<3> C = (a,b,(c,d))

<4> D = (a,b,(c,d),(e,(f),h))

<5> E = (((),()))

#define _CRT_SECURE_NO_WARNINGS 1

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

#include <assert.h>

using namespace std;

enum Type

{

HEAD,

VALUE,

SUB

};

struct GeneralizedNode

{

Type _type; // 类型

GeneralizedNode* _next; // 指向同层下一个结点

union

{

//int _value;

char _value;

GeneralizedNode* _subLink; // 指向子表的指针

};

GeneralizedNode(Type type = VALUE, const int value = 0)

:_type(type)

,_next(NULL)

,_value(value)

{}

};

class Generalized

{

public:

Generalized()

:_head(NULL)

{}

Generalized(const char* str)

:_head(NULL)

{

_head = _CreateList(str);

}

void Print() const

{

_Print(_head);

cout<<endl;

}

size_t Size() const

{

return _Size(_head);

}

size_t Depth() const

{

return _Depth(_head);

}

//===========新加的

Generalized(const Generalized& g);

Generalized& operator=(Generalized g);    //  现代写法

~Generalized();

protected:

GeneralizedNode* _CreateList(const char*& str);

void _Print(GeneralizedNode* head) const;

bool _IsValue(char ch);

size_t  _Size(GeneralizedNode* head) const;

size_t _Depth(GeneralizedNode* head) const;

GeneralizedNode* _Copy(const GeneralizedNode* head);

void _Destory(GeneralizedNode* head);

protected:

GeneralizedNode* _head;

};

bool Generalized:: _IsValue(char ch)

{

if ((ch >= ‘0‘ && ch <= ‘9‘)

|| (ch >= ‘a‘ && ch <= ‘z‘)

|| (ch >= ‘A‘ && ch <= ‘Z‘))

{

return true;

}

else

{

return false;

}

}

GeneralizedNode* Generalized::_CreateList(const char*& str) // 注意&

{

assert(str);

assert(*str == ‘(‘);

// D = (a,b,(c,d),(e,(f),h))

GeneralizedNode* head = new GeneralizedNode(HEAD);

GeneralizedNode* cur = head;

++str;

while (*str != ‘\0‘)

{

if (*str == ‘(‘) // 有子层

{

cur->_next = new GeneralizedNode(SUB);

cur = cur->_next;

cur->_subLink = _CreateList(str); // 下一层

}

else if(_IsValue(*str))

{

cur->_next = new GeneralizedNode(VALUE, *str);

cur = cur->_next;

++str;

}

else if (*str == ‘)‘)

{

++str; // **********更新上一层的str

break;

}

else // 其他情况 *str为 逗号 空格 制表符 等

{

++str;

}

}

return head;

}

void Generalized::_Print(GeneralizedNode* head) const

{

assert(head && head->_type == HEAD);

GeneralizedNode* cur = head->_next;

cout<<"(";

while(cur)

{

if (cur->_type == VALUE)

{

cout<<cur->_value;

cur = cur->_next;

if (cur != NULL)

{

cout<<",";

}

}

else if (cur->_type == SUB)

{

_Print(cur->_subLink);

cur = cur->_next;

if (cur != NULL)

{

cout<<",";

}

}

}

cout<<")";

}

size_t  Generalized::_Size(GeneralizedNode* head) const

{

assert(head && head->_type == HEAD);

GeneralizedNode* cur = head->_next;

size_t count = 0;

while(cur)

{

if (cur->_type == VALUE)

{

count++;

}

else if(cur->_type == SUB)

{

count += _Size(cur->_subLink);

}

cur = cur->_next;

}

return count;

}

// 有问题

//size_t Generalized::_Depth(GeneralizedNode* head) const

//{

// assert(head && head->_type == HEAD);

// GeneralizedNode* cur = head->_next;

// size_t depth = 1;

// while(cur)

// {

// if (cur->_type == SUB)

// {

// depth += _Depth(cur->_subLink);

// }

//

// cur = cur->_next;

// }

//

// return depth;

//}

size_t Generalized::_Depth(GeneralizedNode* head) const

{

assert(head && head->_type == HEAD);

GeneralizedNode* cur = head->_next;

size_t depth = 1;

while (cur)

{

if (cur->_type == SUB)

{

size_t SubDepth = _Depth(cur->_subLink);

if (depth < 1 + SubDepth)   //  找最大的 depth      注意 不要用 depth = depth + SubDepth

{

depth = 1 + SubDepth;

}

}

cur = cur->_next;

}

return depth;

}

Generalized:: Generalized(const Generalized& g)

{

_head = _Copy(g._head);

}

GeneralizedNode* Generalized::_Copy(const GeneralizedNode* head)

{

assert(head && head->_type == HEAD);

const GeneralizedNode* cur =  head->_next;

GeneralizedNode* retHead = new GeneralizedNode(HEAD);

GeneralizedNode* newNode = retHead;

while (cur)

{

if (cur->_type == VALUE)

{

newNode->_next = new GeneralizedNode(VALUE, cur->_value);

newNode = newNode->_next;

}

else if (cur->_type == SUB)

{

newNode->_next = new GeneralizedNode(SUB);

newNode = newNode->_next;

newNode->_subLink = _Copy(cur->_subLink);

}

cur = cur->_next;

}

return retHead;

}

Generalized& Generalized::operator=(Generalized g)    //  现代写法

{

swap(_head, g._head);

return *this;

}

Generalized::~Generalized()

{

_Destroy(_head);

}

void Generalized::_Destory(GeneralizedNode* head)

{

GeneralizedNode* cur = head;

while (cur)

{

GeneralizedNode* del = cur;

cur = cur->_next;

if (del->_type == SUB)

{

_Destory(del->_subLink);

}

delete del;

del = NULL;

}

}

void test_G_chuangjian()

{

char* str = "(a,b,(c,d))";

Generalized g(str);

g.Print();

cout<<g.Size()<<endl;

cout<<g.Depth()<<endl;

cout<<"============"<<endl;

char* str2 = "(a,b,(c,d),(e,(f),h))";

Generalized g2(str2);

g2.Print();

cout<<g2.Size()<<endl;

cout<<g2.Depth()<<endl;

cout<<"============"<<endl;

Generalized g3(g2);

g3.Print();

cout<<g3.Size()<<endl;

cout<<g3.Depth()<<endl;

cout<<"============"<<endl;

Generalized g4;

g4 = g2;

g4.Print();

cout<<g4.Size()<<endl;

cout<<g4.Depth()<<endl;

}

int main()

{

test_G_chuangjian();

return 0;

}

时间: 2024-11-07 05:41:57

C++ 数据结构 广义表的相关文章

数据结构——广义表

定义 Python中的list就是一种广义表,使用起来非常方便.广义表的特点就是能够存储不同类型的元素,也支持嵌套使用,即表中还有表.关于广义表的定义还有几本操作归纳如下: ADT Linear List: 元素组成: 能存储不同元素类型的表结构叫做广义表,支持嵌套操作. 基本操作: InitGList() 创建一个空表 DestoryGList() 销毁一个表 GListLength()  获取表的长度 GListDepth()  获取表的深度 PrintList() 遍历一次表 Insert

数据结构 - 广义表

广义表 什么是广义表呢? (1)广义表是由零个或多个原子或子表组成的有限序列,是线性表的推广 (2) 广义表一般记作:LS=(d1,d2,-,dn) (3)di可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表 广义表概念 (1)当广义表LS非空时,称第一个元素d1为LS的表头(Head),称其余元素组成的子表(d2,-,dn)是LS的表尾(Tail) (2)非空广义表可唯一分解成表头和表尾:反过来,由表头和表尾可唯一组成一个广义表 (3)广义表括号的层数定义为广义表的深度 广义表特

数据结构广义表实验

一.问题描述: 1.题目内容:识别广义表的“头”或“尾”的演示 写一个程序,建立广义表的存储结构,演示在此存储结构上实现的广义表求头/求尾操作序列的结果. 2.基本要求 (1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限长的仅字母或数字组成的串. (2)广义表采用如教材中结点的存储结构,试按表头和表尾的分解方法编写建立广义表存储结构的算法. (3)对已建立存储结构的广义表施行操作,操作序列为一个仅由“t“或”h”组成的串,它可以是空串(此时印出整个广义表),自左至右施行各操作

数据结构实践项目——数组和广义表

本文针对 [数据结构基础系列网络课程(5):数组和广义表] 1. 数组的基本概念与存储结构 2. 特殊矩阵的压缩存储 3. 稀疏矩阵的三元组表示 4. 稀疏矩阵的十字链表表示 5. 广义表 6. 广义表的存储结构及基本运算的实现 [项目1 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和n,输出猴子离开圈子的顺序,从中也可以看出最后为大王是几号

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1:

javascript实现数据结构:广义表

原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an) LS是广义表的名称,n是它的长度,ai可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表.习惯上,用大写字母表示广义表的名称,小写字母表示原子.当广义表LS非空时,称第一个元素a1为LS的表头,称其余元素组成的表(a2, a3, ..., an)是LS的表尾. 下面列举一些广义表的例

数据结构算法C语言实现(十九)--- 5.5&amp;5.6&amp;5.7广义表

一.简述 传说Lisp的基本数据结构就是广义表,广义表也是具有典型递归属性的数据结构,此外,由于建表要处理字符串,用C语言处理起来也是一脸懵逼.....最后自己还想写一个将广义表还原成字符串的函数,一是使其可视化,而是验证算法5.6.花了不少功夫才写出来(强烈建议自己动手写一写),最后是借助树形结构的角度才找到一个不错的解决办法.按照<数据结构编程实验>的分类,数据结构无非线性结构.树状结构.图结构,可以说树是特殊的图(图的最小生成树),线性表示特殊的树.....扯远了! 二.头文件 补充版字

数据结构期末复习第五章数组和广义表

数据结构期末复习第五章 数组和广义表 二维数组A[m][n]按行优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((i-1)*n+j-1)*d     设数组的基址为LOC(a00) :LOC(aij)=LOC(a00)+( i*n+j )*d    二维数组A[m][n]按列优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((j