广义表

原创 2015年11月20日 17:26:43

这里写图片描述
GeneralList.h

#pragma once
#include<iostream>
using namespace std;

enum NodeType
{
    Head_Type,  //头结点
    Value_Type, //值节点
    Sub_Type,  //子表节点
};

struct GeneralListNode  //广义表节点
{
    NodeType _type;   //节点类型
    GeneralListNode* _next;
    union
    {
        char _value;    //节点的值
        GeneralListNode* _subLink;
    };

    GeneralListNode(NodeType type = Head_Type, char value = '\0')
        :_type(type)
        , _next(NULL)
        , _value(value)
        , _subLink(NULL)
    {}
};

class GeneralList
{
public:
    GeneralList(const char* str)
    :_link(NULL)
    {
        _CreatGeneralList(_link,str);
    }
    GeneralList( GeneralList& gl)
    {
        _link = _CopyGeneralList(gl._link);
    }
    GeneralList& operator=( GeneralList& gl)
    {
        if (&gl != this)
        {
            _Destory(_link);
            _link = _CopyGeneralList(gl._link);
        }
        return *this;
    }
    ~GeneralList()
    {
        _Destory(_link);
    }
    int Size() //求广义表节点数
    {
        return _Size(_link);
    }
    int Depth() //求广义表的深度
    {
        return _Depth(_link);
    }
    void Print()
    {
        _Print(_link);
        cout << endl;
    }
protected:
    void _CreatGeneralList(GeneralListNode*& link, const char*& str)
    {
        if (*str != '(' || *str == '\0')
        {
            cout << "Invaild GeneralList" << endl;
            return;
        }
        GeneralListNode* Head = new GeneralListNode(Head_Type);
        link = Head;
        GeneralListNode* begin = Head;
        str++;
        while (*str)
        {
            //值节点
            if (*str >= 0 && *str <= 9 || *str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')
            {
                GeneralListNode* tmp = new GeneralListNode(Value_Type);
                tmp->_value = *str;
                begin->_next = tmp;
                begin = begin->_next;
                str++;
            }
            else if (*str == '(')
            {
                GeneralListNode* SubNode = new GeneralListNode(Sub_Type);
                begin->_next = SubNode;
                begin = begin->_next;
                _CreatGeneralList(begin->_subLink, str);
            }
            else if (*str == ')')
            {
                str++;
                return;
            }
            else //处理 ,空格 等情况
            {
                str++;
            }
        }
    }
    int _Size(GeneralListNode*& link)
    {
        int size = 0;
        GeneralListNode* cur = link;
        while (cur)
        {
            if (cur->_type == Value_Type)
            {
                size++;
            }
            else if (cur->_type == Sub_Type)
            {
                size += _Size(cur->_subLink);
            }
            cur = cur->_next;
        }
        return size;
    }
    int _Depth(GeneralListNode*& link)
    {
        int depth = 1;
        GeneralListNode* cur = link;
        while (cur)
        {
            if (cur->_type == Sub_Type)
            {
                int subDep = _Depth(cur->_subLink);
                if (subDep + 1 > depth)
                {
                    depth = subDep + 1;
                }
            }
            cur = cur->_next;
        }
        return depth;
    }
    void _Print(GeneralListNode*& link)
    {
        GeneralListNode* cur = link;
        cout << "(";
        while (cur)
        {
            if (cur->_type == Value_Type)
            {
                cout << cur->_value;
                if (cur->_next != NULL)
                {
                    cout << ",";
                }
            }
            else if (cur->_type == Sub_Type)
            {
                _Print(cur->_subLink);
                if (cur->_next != NULL)
                {
                    cout << ",";
                }
            }
            cur = cur->_next;
        }
        cout <<")";
    }
    void _Destory(GeneralListNode*& link)
    {
        GeneralListNode* cur = link;
        while (cur)
        {
            GeneralListNode* del = cur;
            cur = cur->_next;
            delete del;
            if (cur == NULL)
            {
                return;
            }
            if (cur->_type == Sub_Type)
            {
                _Destory(cur->_subLink);
            }
        }
    }
    GeneralListNode*& _CopyGeneralList(GeneralListNode*& link)
    {
        GeneralListNode* Head = new GeneralListNode(Head_Type);
        GeneralListNode* CopyHead = Head;
        GeneralListNode* begin = CopyHead;
        while (link)
        {
            if (link->_type == Value_Type)
            {
                GeneralListNode* tmp = new GeneralListNode(Value_Type);
                tmp->_value = link->_value;
                begin->_next = tmp;
                begin = begin->_next;
            }
            else if (link->_type == Sub_Type)
            {
                GeneralListNode* SubNode = new GeneralListNode(Sub_Type);
                begin->_next = SubNode;
                begin = begin->_next;
                begin->_subLink = _CopyGeneralList(link->_subLink);
            }
            link = link->_next;
        }
          return CopyHead;
    }
private:
    GeneralListNode* _link;
};

main.cpp

#include"GeneralList.h"

void Test()
{
    char* str1 = "()";
    GeneralList gl1(str1);
    int size1 = gl1.Size();
    cout << "节点个数:" << size1 << endl;

    char* str2 = "(a, b)";
    GeneralList gl2(str2);
    gl2.Print();
    int size2 = gl2.Size();
    cout << "节点个数:" << size2 << endl;

    char* str3 = "(a,(c,d))";
    GeneralList gl3(str3);
    gl3.Print();
    int size3 = gl3.Size();
    cout << "节点个数:" << size3 << endl;

    char* str4 = "(a,(c,d),(e,(f),h))";
    GeneralList gl4(str4);
    gl4.Print();
    int depth4 = gl4.Depth();
    cout << "深度:" << depth4 << endl;
    int size4 = gl4.Size();
    cout << "节点个数:" << size4 << endl;

    char* str5 = "(((), ()))";
    GeneralList gl5(str5);
    gl5.Print();
}

void Test1()
{
    char* str = "(a,(c,d),(e,(f),h))";
    GeneralList gl(str);
    GeneralList gl1("(a, (c, d))");
    gl = gl1;
    gl1.Print();
}
int main()
{
    Test1();
    getchar();
    return 0;
}

广义表的建立与一般操作C\C++

广义表的建立与一般操作C\C++ 一、广义表的概念         广义表是线性表的推广,但线性表的元素仅限于原子项,原子作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限...
  • g15827636417
  • g15827636417
  • 2016年10月20日 20:41
  • 1758

数据结构学习笔记之广义表的相关知识点

广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广,广泛的应用于人工智能等领域的表处理语言LISP语言中,因此,掌握对广义表的基础的CRUD操作很是重要...
  • qq_24754061
  • qq_24754061
  • 2016年06月04日 00:19
  • 1348

数据结构之---C语言实现广义表头尾链表存储表示

C语言实现广义表头尾链表存储表示
  • u012965373
  • u012965373
  • 2015年06月03日 22:57
  • 1754

数据结构(c语言版)题集答案——第五章_数组和广义表.doc

  • 2011年05月07日 16:57
  • 51KB
  • 下载

广义表实现源码(C++、C)

  • 2017年03月12日 15:04
  • 3KB
  • 下载

VC++2012编程演练数据结构《16》广义表

  • 2012年11月20日 12:34
  • 7KB
  • 下载

数据结构 数组和广义表

  • 2010年10月25日 21:18
  • 430KB
  • 下载

数组与广义表

  • 2014年12月15日 12:21
  • 682KB
  • 下载

第5章 数组与广义表.ppt

  • 2011年12月06日 18:55
  • 497KB
  • 下载

第5章 数组和广义表

  • 2012年10月08日 15:01
  • 528KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:广义表
举报原因:
原因补充:

(最多只允许输入30个字)