【数据结构】广义表
发布时间:2020-12-15 05:55:57 所属栏目:安全 来源:网络整理
导读:一、问题概述 广义表是非线性的数据结构,是由若干个元素组合而成的,广义表中可以有子表,类似这样的: 我们以C=(a,b,(c,d))为例,将它定义为这样的数据结构: 我们会给定字符串的形式,如:char * str = "(a,d))"; 然后将它转化为如上的数据结构。 二、解
|
一、问题概述 广义表是非线性的数据结构,是由若干个元素组合而成的,广义表中可以有子表,类似这样的:
我们以C=(a,b,(c,d))为例,将它定义为这样的数据结构:
我们会给定字符串的形式,如:char * str = "(a,d))"; 然后将它转化为如上的数据结构。
二、解决办法 (1)将符号'('看作是头节点,然后将是数值的部分链入当前位置的下一个位置; (2)当遇到SUB时,就链入它的_sublink(连接子表的指针),此时可用递归(子表相当于是表的子问题); (3)直到str为空时,广义表的数据结构创建完成。
三、实现代码 //GeneralizedList.h
#pragma once
#include<iostream>
using namespace std;
#include<assert.h>
enum Type
{
HEAD,VALUE,SUB,};
struct GeneralizeListNode
{
Type _type;
GeneralizeListNode* _next;
union
{
char _value;
GeneralizeListNode* _sublink;
};
GeneralizeListNode(Type type,char value = 0)
:_next(NULL),_type(type),_value(value)
{
if(type == VALUE)
{
_value = value;
}
if(type == SUB)
{
_sublink = NULL;
}
}
};
class GeneralizeList
{
typedef GeneralizeListNode Node;
public:
GeneralizeList()
:_head(NULL)
{}
//构造函数
GeneralizeList(const char* str)
{
_head = Create(str);
}
//拷贝构造函数
GeneralizeList(const GeneralizeList& g)
{
_head = _Copy(g._head);
}
//赋值运算符重载(1)
//GeneralizeList& operator=(const GeneralizeList& g)
//{
// if(this != &g)
// {
// Node* tmp = _Copy(g._head);
// delete _head;
// _head = tmp;
// }
// return *this;
//}
//赋值运算符重载(2)
GeneralizeList& operator=(const GeneralizeList& g)
{
if(_head != g._head)
{
GeneralizeList tmp(g);
swap(_head,tmp._head);
}
return *this;
}
~GeneralizeList()
{
if(_head)
{
_Destroy(_head);
_head = NULL;
}
}
void Print()
{
_Print(_head);
cout<<endl;
}
public:
Node* Create(const char*& str) //创建表
{
assert(*str == '(');
Node* head = new Node(HEAD);
++str;
Node* tail = head;
while(*str)
{
if((*str >= '0' && *str <= '9')
||(*str >= 'a' && *str <= 'z')
||(*str >= 'A' && *str <= 'Z'))
{
tail->_next = new Node(VALUE,*str);
tail = tail->_next;
++str;
}
else if(*str == '(')
{
tail->_next = new Node(SUB);
tail = tail->_next;
tail->_sublink = Create(str);
++str;
}
else if(*str == ')')
{
++str;
return head;
}
else
{
++str;
}
}
return head;
}
void _Print(Node* head)
{
assert(head);
Node* cur = head;
while(cur)
{
if(cur->_type == HEAD)
{
cout<<"(";
}
else if(cur->_type == VALUE)
{
cout<<cur->_value;
if(cur->_next != NULL)
{
cout<<",";
}
}
else if(cur->_type == SUB)
{
_Print(cur->_sublink);
if(cur->_next != NULL)
{
cout<<",";
}
}
else
{
assert(false);
}
cur = cur->_next;
}
cout<<")";
}
Node* _Copy(Node* head)
{
Node* cur = head;
Node* newHead = new Node(HEAD);
Node* newTail = newHead;
while(cur)
{
if(cur->_type == HEAD)
{
cur = cur->_next;
}
else if(cur->_type == VALUE)
{
newTail->_next = new Node(VALUE,cur->_value);
newTail = newTail->_next;
cur = cur->_next;
}
else if(cur->_type == SUB)
{
newTail->_next = new Node(SUB);
newTail = newTail->_next;
newTail->_sublink = _Copy(cur->_sublink);
cur = cur->_next;
}
else
{
assert(false);
}
}
return newHead;
}
void _Destroy(Node* head) //销毁表
{
Node* cur = head;
while(cur)
{
if(cur->_type == HEAD || cur->_type == VALUE)
{
Node* del = cur;
cur = cur->_next;
delete del;
}
else if(cur->_type == SUB)
{
Node* del = cur;
cur = cur->_next;
_Destroy(del->_sublink);
delete del;
}
else
{
assert(false);
}
}
}
size_t Size()
{
return _Size(_head);
}
size_t _Size(Node* head) //元素个数
{
assert(head);
size_t count = 0;
Node* cur = head;
while(cur)
{
if(cur->_type == VALUE)
{
++count;
}
else if(cur->_type == SUB)
{
count += _Size(cur->_sublink);
}
cur = cur->_next;
}
return count;
}
size_t Depth()
{
return _Depth(_head);
}
size_t _Depth(Node* head) //表的深度
{
Node* cur = head;
size_t MaxDepth = 1;
while(cur)
{
if(cur->_type == SUB)
{
size_t Depth = _Depth(cur->_sublink);
if(Depth+1 > MaxDepth)
{
MaxDepth = Depth+1;
}
}
cur = cur->_next;
}
return MaxDepth;
}
protected:
Node* _head;
};
void FunTest()
{
char* str = "(a,d),(e,(f),g))";
GeneralizeList g1(str);
g1.Print();
GeneralizeList g2(g1);
g2.Print();
GeneralizeList g3;
g3 = g1;
g3.Print();
cout<<g3.Size()<<endl;
cout<<g3.Depth()<<endl;
}
//GeneralizedList.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include"GeneralizedList.h"
int main()
{
FunTest();
return 0;
}
四、运行结果
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- bash – 什么是间接扩展? ${!var *}是什么意思?
- angularjs的$watch、$watchGroup、$watchCollection的区别
- 各种常用的webservice接口
- bootstrap datepicker 在bootstrap modal中不显示问题
- Scala模式匹配引用
- 如何在bash中撤消exec> / dev / null?
- 命令行 – MacVim:使用`alias mvim =“open -a macvim”从
- Bootstrap下拉菜单Dropdowns的实现代码
- scala – 关于java.lang.NoClassDefFoundError:无法初始化
- shell 练习(07)——MySQL 数据库备份
