广义表

其中包括广义表的创建、输出、拷贝构造、赋值运算符重载、析构、有效数据个数以及广义表深度

#pragma once
#include<iostream>
#include<assert.h>
#include<ctype.h>

using namespace std;

enum Type
{
 HEAD, VALUE, SUB
};//头结点、值、子表

struct GeneralizedNode
{
 Type _type;  //广义表结点类型
 GeneralizedNode* _next;  //广义表结点指针
 union
 {
  int _value;  //广义表结点存储的数据
  GeneralizedNode* _subLink; //存储的指向子表的指针
 };
 GeneralizedNode(Type type = HEAD, int value = 0)//构造
  :_type(type)
  , _next(NULL)
 {
  if (type == VALUE)
  {
   _value = value;
  }
 }

};

class GeneralizedList
{
public:
 GeneralizedList()
  :_head(NULL)
 {}
 GeneralizedList(const char* str) //创建表
 {
  _head = _CreateList(str);
 }

 //拷贝构造
 GeneralizedList(const GeneralizedList& s)
 {
  _head = _copy(s._head);
 }
 //赋值运算符重载
 GeneralizedNode* operator=(GeneralizedList s)
 {
  swap(_head, s._head);
  return _head;
 }

 //析构函数
 ~GeneralizedList()
 {
  _Dele(_head);
 }

 void PrintList()//输出
 {
  _PrintNode(_head);
 }

 size_t size()
 {
  size_t num = 0;
  _size(_head, num);
  return num;
 }

 size_t Depth()
 {
  return _depth(_head);
 }

private:

 GeneralizedNode* _CreateList(const char*& str)
 {
  //  GeneralizedList b2("(a,(b,c))");
  assert(‘(‘ == *str);
  ++str; //跳过‘(‘
  GeneralizedNode* head = new GeneralizedNode(HEAD);
  GeneralizedNode* cur = head;

  //除数字字符与‘)‘其他字符都不需要考虑,直接跳过就可以
  while (‘)‘ != *str)
  {
   if ((*str >= ‘0‘&&*str <= ‘9‘) || /*也可以使用数字字符判别函数 isdigit(*str)==-1*/
    (*str >= ‘a‘&&*str <= ‘z‘) ||
    (*str >= ‘A‘&&*str <= ‘Z‘))
   {
    cur->_next = new GeneralizedNode(VALUE, *str++);
    cur = cur->_next;
   }
   else if (‘(‘ == *str)
   {
    cur->_next = new GeneralizedNode(SUB, *str);
    cur->_next->_subLink = _CreateList(str);
    cur = cur->_next;
   }
   else
   {
    str++;
   }
  }

  str++;//跳过 ‘)‘
  return head;
 }

 GeneralizedNode* _copy(GeneralizedNode* head)
 {
  GeneralizedNode* dst = new GeneralizedNode(HEAD);
  GeneralizedNode* cur = dst;
  if (head == NULL)
   return NULL;

  while (head != NULL)
  {

   if (head->_type == VALUE)
   {
    cur->_next = new GeneralizedNode(VALUE, head->_value);
    cur = cur->_next;
   }
   else if (head->_type == SUB)
   {
    cur->_next = new GeneralizedNode(SUB);
    cur->_next->_subLink = _copy(head->_subLink);
    cur = cur->_next;
   }

   head = head->_next;

   //cur->_next = new GeneralizedNode(VALUE, head->_value);
  }

  return dst;
 }

 void _PrintNode(GeneralizedNode* head)
 {
  //  GeneralizedList b2("(a,(b,c))");
  GeneralizedNode* tmp = head;
  while (tmp != NULL)
  {
   if (HEAD == tmp->_type)
   {
    cout << "(";
    tmp = tmp->_next;
   }
   else if (VALUE == tmp->_type)
   {
    cout << (char)tmp->_value;
    tmp = tmp->_next;
    if (tmp != NULL)
    {
     cout << ", ";
    }
   }
   else
   {
    _PrintNode(tmp->_subLink);
    if (tmp->_next != NULL)
    {
     cout << ", ";
    }
    tmp = tmp->_next;
   }
  }

  cout << ")";

 }

 void _size(GeneralizedNode* head, size_t& size)
 {
  GeneralizedNode* tmp = head;
  while (tmp != NULL)
  {
   if (HEAD == tmp->_type)
   {
    tmp = tmp->_next;
   }
   else if (VALUE == tmp->_type)
   {
    ++size;
    tmp = tmp->_next;
   }
   else
   {
    _size(tmp->_subLink, size);
    tmp = tmp->_next;
   }
  }
 }

 size_t _depth(GeneralizedNode* head)
 {
  size_t depth = 1;
  size_t count = 0;
  GeneralizedNode* tmp = head;
  while (tmp != NULL)
  {
   if (SUB == tmp->_type)
   {
    size_t subdep = _depth(tmp->_subLink);

    if (subdep + 1 > depth)
    {
     depth = subdep + 1;
    }
   }
   tmp = tmp->_next;

  }

  return depth;
 }

 void _Dele(GeneralizedNode* head)
 {
  if (head == NULL)
   return;
  else if (head->_type == SUB)
  {
   _Dele(head->_subLink);
   _Dele(head->_next);//注意 在删除SUB结点后紧接着删除下一结点
   //cout << "dele" << " ";
   delete head;
  }
  else
  {
   _Dele(head->_next);
   //cout << "dele" << " ";
   delete head;
  }
 }

private:
 GeneralizedNode* _head;

};

#include"GeneralizedList.h"

void test()
{
 GeneralizedList b1("(a,b)");
 b1.PrintList();
 cout << endl;
 GeneralizedList b2("(a,(b,c))");
 b2.PrintList();
 cout << endl;
 GeneralizedList b3("(a,(b,c),d)");
 b3.PrintList();
 cout << endl;
 GeneralizedList b4("(a,(b,c),(d,(e),f),(h,i))");
 b4.PrintList();
 cout << "\n" << endl;

 cout << "b1.size = " << b1.size() << endl;
 cout << "b2.size = " << b2.size() << endl;
 cout << "b3.size = " << b3.size() << endl;
 cout << "b4.size = " << b4.size() << endl;

 cout << "b1.Depth = " << b1.Depth() << endl;
 cout << "b2.Depth = " << b2.Depth() << endl;
 cout << "b3.Depth = " << b3.Depth() << endl;
 cout << "b4.Depth = " << b4.Depth() << endl;
 GeneralizedList b5("(a,(b,c),(h,i),(d,(e),f))");
 cout << "b5.Depth = " << b5.Depth() << endl;

 GeneralizedList b6(b2);
 b6.PrintList();
 cout << endl;
 GeneralizedList b7(b3);
 b7.PrintList();

 GeneralizedList b8;
 b8 = b7;
 b8.PrintList();

 b7.PrintList();

}

int main()
{
 test();

 system("pause");
 return 0;
}
时间: 2024-08-24 21:49:15

广义表的相关文章

c++数据结构之广义表

最近学习了广义表,我们知道广义表也是一种线性表,而顾名思义广义表就是不止一个表,下面来举个栗子: A=( ) B=(1 , 2,3) C=(1 ,2 ,3, ( a , b ,c) ) D=(1, 2, 3, (a,( b,c),d),4) 以上A,B,C,D都是广义表,只不过深度不一样,也就是括号的对数不一样,A是个特殊的广义表,即空表.B里面有三个元素,C里面有6个元素,包括一个子表(a,b,c),C也同理,只不过多了一层子表.由此可总结为一句话:表里有表 这样看可能不太直观,下面以广义表C

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

本文针对 [数据结构基础系列网络课程(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;

广义表的实现

/*--------------------------------------------------------------------- 广义表的存储结构 ---------------------------------------------------------------------*/ #include<stdio.h> #include<stdlib.h> typedef char ElemType;//元素类型是字符型 //广义表的存储结构 struct GN

广义表的实现(法二)

#include<iostream> #include<string> using namespace std; enum elemTag {ATOM,LIST}; class GList; class GLnode { private: elemTag Tag; //标志是原子还是子表 0:原子 1:子表 union { char data; //原子结点值域 struct //表结点指针域 { GLnode *hp; GLnode *tp; }ptr; }; friend cl

数据结构之广义表

#include<stdio.h> //广义表的头尾链表存储结构 typedef int AtomType; typedef enum NodeType{ATOM,LIST}ElemTag;//ATOM表示原子结点,LIST表示表节点 typedef struct GLNode{ ElemTag tag; union{ AtomType atom; struct List{ struct GLNode* hp,*tp; } htp; }atom_htp; }GLNode,*GList; //求

数据结构——广义表

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

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

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

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

//广义表的头尾链表存储表示 //杨鑫 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #define MAXSTRLEN 40 ) typedef char SString[MAXSTRLEN+1]; typedef char AtomType; // 定义原子类型为字符型 typedef enum{ ATOM, LIST // ATOM==0:原