C++:广义表的实现

GeneralList.hpp            

#pragma once

#include<iostream>
#include<string>
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){
		if (type == VALUE_TYPE){
			_value = value;
		}
		else if (type == SUB_TYPE)
		{
			_subLink = NULL;
		}
	}
};

class GeneralList{
public:
	GeneralList(const char* str) :_link(NULL){      //构造函数
		_CreateGeneralList(_link, str);
	}
	GeneralList(const GeneralList& gl){             //拷贝构造函数
			_link = _Copy(gl._link);
	}
	GeneralList& operator=(const GeneralList& gl){   //重载函数
		if (this != &gl){
		        _Delete(_link);
			 _Copy(gl._link);
		}
		else
		    return *this;
	}  
	~GeneralList(){                                 //析构函数
		 _Delete(_link);
	}

	void Print()                                   //显示函数
	{
		_Print(_link);
		cout << endl;
	}

	int Size(){                        //计算广义表的大小,最外层的元素个数
		GeneralListNode* begin = _link;
		int size = 0;

		if (begin->_type == HEAD_TYPE)
			return 1;
		else{
			while (begin){
				size++;
				begin = begin->_next;
			}
		}
		return size;
	}

	int Depth(){					//计算广义表的深度
		return _Depth(_link);
	}
protected:
	const char* _CreateGeneralList(GeneralListNode*& link, const char*str){  //构造函数的实现
		GeneralListNode* begin = NULL;
		char* compareStr = "()";     //定义检查是否为()的字符串

		while (isspace(*str))          //检查是否有空格
			str++;
		if (*str != ‘(‘){            //检查输入是否合法
			cout << "input illeagle!" << endl;
			exit(-1);
		}

		if (strcmp(str, compareStr) == 0){                    //判断是否为head_type
			GeneralListNode* head = new GeneralListNode(HEAD_TYPE);   //创建结点
			link = head;
			begin = head;
		}

		str++;          //从第一个左括号后开始
		//判断类型,为其创建结点
		while (*str != ‘\0‘){
			if (*str == ‘,‘)
				str++;
			while (isspace(*str))          //检查是否有空格
				str++;
			if (*str == ‘(‘)    {         //如果是sub_type
				GeneralListNode* subNode = new GeneralListNode(SUB_TYPE);
				if (begin == NULL){
					begin = subNode;
					link = begin;
					 str = _CreateGeneralList(begin->_subLink, str);   //递归建立子表
				}
				else{
					begin->_next = subNode;
					begin = begin->_next;
					str = _CreateGeneralList(begin->_subLink, str);
				}
			}
			else if (*str == ‘)‘ && *++str != ‘\0‘){               //递归结束条件
				return str;
			}
			else if (*str != ‘)‘ && *str != ‘\0‘){         //如果是value_type
				GeneralListNode* valueNode = new GeneralListNode(VALUE_TYPE, *str);
				if (begin == NULL){
					begin = valueNode;
					link = begin;
				}
				else{
					begin->_next = valueNode;
					begin = begin->_next;
				}
			}
			str++;
		}
	}

	GeneralListNode* _Copy(GeneralListNode* link){               //拷贝构造的实现
		GeneralListNode* _new = NULL;

		if (link){
			_new = new GeneralListNode(link->_type);             //创建头结点
			_new->_next = link->_next;
			switch (_new->_type)
			{
			case HEAD_TYPE:                                 
				_new->_value = link->_value;
				break;
			case VALUE_TYPE:
				_new->_value = link->_value;
				break;
			case SUB_TYPE:
				_new->_subLink = link->_subLink;
				break;
			default:
				break;
			}
			_new->_next = _Copy(link->_next);                  //递归创建其余结点
		}
		return _new;
	}

	GeneralListNode*  _Delete(GeneralListNode* link){     //析构函数的实现从右到左,从下到上
		GeneralListNode* begin = link;

		if (begin){
			switch (begin->_type){
			case HEAD_TYPE:
				break;
			case VALUE_TYPE:
				_Delete(begin->_next);
				break;
			case SUB_TYPE:
				_Delete(begin->_next);
				_Delete(begin->_subLink);
				break;
			default:
				break;
			}
			delete begin;
		}
		return begin;
	}

	void _Print(GeneralListNode* link){                   //显示函数的实现
		GeneralListNode* begin = link;
		cout << "(";
		while (begin){
			if (begin->_type == HEAD_TYPE){
				cout << ")";
			}
			else if (begin->_type == VALUE_TYPE){
				cout << begin->_value;
				if (begin->_next){
					cout << ",";
				}
				else{
					cout << ")";
				}
			}
			else if (begin->_type == SUB_TYPE){
				_Print(begin->_subLink);
				if (begin->_next){
					cout << ",";
				}
			}
			begin = begin->_next;
		}
	}

	int _Depth(GeneralListNode* link){             //深度的计算,找到子表个数最多
		GeneralListNode* begin = link;
		int depth = 0;
		int max = 0;

		while (begin){
		if (begin->_type == HEAD_TYPE)
			return 1;
		else if (begin->_type == VALUE_TYPE){
			begin = begin->_next;
		}
		else if (begin->_type == SUB_TYPE){
			depth = _Depth(begin->_subLink);
			if (depth > max)
				max = depth;
			begin = begin->_next;
		}
		}
		return max+1;
	}
private:
	GeneralListNode* _link;
};
时间: 2024-10-03 20:40:47

C++:广义表的实现的相关文章

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

广义表

其中包括广义表的创建.输出.拷贝构造.赋值运算符重载.析构.有效数据个数以及广义表深度 #pragma once #include<iostream> #include<assert.h> #include<ctype.h> using namespace std; enum Type {  HEAD, VALUE, SUB };//头结点.值.子表 struct GeneralizedNode {  Type _type;  //广义表结点类型  Generalize

数据结构之广义表

#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:原