广义表的相关操作

//Generalized.h
#pragma once 
#ifndef __GENERALIZED_H__
#define __GENERALIZED_H__

enum Type
{
	HEAD,
	VALUE,
	SUB,
};

struct GeneralizedNode
{
	Type _type;
	GeneralizedNode* _next;
	union
	{
		int _value;
		GeneralizedNode* _sublink;
	};
	GeneralizedNode()
	{}
	GeneralizedNode(Type type, const int value = 0) :_type(type), _next(NULL), _value(value)
	{}
};

class Generalized
{
public:
	Generalized();
	Generalized(const char* str);
	Generalized(const Generalized& g);
	Generalized& operator=(const Generalized& g);
	~Generalized();
	void Print()const;
	size_t Size()const;
	size_t Length()const;
	size_t Depth()const;
protected:
	GeneralizedNode* _CreateList(const char* &str);
	GeneralizedNode* _Copy(GeneralizedNode* head);
	void _Destory(GeneralizedNode* head);
	void _PrintGeneral(GeneralizedNode* head)const;
	size_t _SizeGeneralized(GeneralizedNode* head)const;
	size_t _DepthGeneralized(GeneralizedNode* head)const;
protected:
	GeneralizedNode* _head;
};

#endif /*__GENERALIZED_H__*/

Generalized.cpp:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include "Generalized.h"
#include <assert.h>

Generalized::Generalized() :_head(NULL)
{}
Generalized::Generalized(const char* str) : _head(NULL)
{
	_head = _CreateList(str);
}
GeneralizedNode* Generalized::_CreateList(const char* &str)
{
	assert(str);
	while (isspace(*str))
	{
		++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 ((*str >= ‘0‘&&*str <= ‘9‘) ||
			(*str >= ‘a‘&&*str <= ‘z‘) ||
			(*str >= ‘A‘&&*str <= ‘Z‘))
		{
			cur->_next = new GeneralizedNode(VALUE, *str);
			cur = cur->_next;
			++str;
		}
		else if (*str == ‘)‘)
		{
			++str;
			break;
		}
		else
		{
			++str;
		}
	}
	return head;
}

Generalized::Generalized(const Generalized& g)
{
	this->_head = this->_Copy(g._head);
}

GeneralizedNode* Generalized::_Copy(GeneralizedNode* head)
{
	assert(head);
	GeneralizedNode* cur = head;
	GeneralizedNode* retHead = NULL;
	GeneralizedNode* tmp = NULL;
	while (cur)
	{
		if (cur->_type == HEAD)
		{
			retHead = new GeneralizedNode(HEAD);
			tmp = retHead;
		}
		else if (cur->_type == VALUE)
		{
			tmp->_next = new GeneralizedNode(VALUE, cur->_value);
			tmp = tmp->_next;
		}
		else if (cur->_type == SUB)
		{
			tmp->_next = new GeneralizedNode(SUB);
			tmp->_next->_sublink = _Copy(cur->_sublink);
			tmp = tmp->_next;
		}
		cur = cur->_next;
	}
	return retHead;
}

Generalized& Generalized::operator=(const Generalized& g)
{
	if (this->_head != g._head)
	{
		this->_Destory(this->_head);
		this->_Copy(g._head);
	}
	return *this;
}

Generalized::~Generalized()
{
	this->_Destory(this->_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 Generalized::Print()const
{
	this->_PrintGeneral(this->_head);
}
void Generalized::_PrintGeneral(GeneralizedNode* head)const
{
	assert(head);
	GeneralizedNode* cur = head;
	while (cur)
	{
		if (cur->_type == HEAD)
		{
			std::cout << "(";
		}
		else if (cur->_type == VALUE)
		{
			std::cout << (char)cur->_value;
			if (cur->_next)
			{
				std::cout << ",";
			}
		}
		else if (cur->_type == SUB)
		{
			//(a,b,(c,d),(e,(f),h)) 
			_PrintGeneral(cur->_sublink);
			if (cur->_next)
			{
				std::cout << ",";
			}
		}
		cur = cur->_next;
	}
	std::cout << ")";
}

size_t Generalized::Size()const
{
	return this->_SizeGeneralized(this->_head);
}

size_t Generalized::_SizeGeneralized(GeneralizedNode* head)const
{
	if (head == NULL)
	{
		return 0;
	}
	size_t iCount = 0;
	GeneralizedNode* cur = head;
	while (cur)
	{
		if (cur->_type == VALUE)
		{
			++iCount;
		}
		else if (cur->_type == SUB)
		{
			iCount += _SizeGeneralized(cur->_sublink);
		}
		cur = cur->_next;
	}
	return  iCount;
}

size_t Generalized::Length()const
{
	if (this->_head == NULL)
	{
		return 0;
	}
	GeneralizedNode* cur = this->_head->_next;
	size_t iCount = 0;
	while (cur)
	{
		++iCount;
		cur = cur->_next;
	}
	return iCount;
}

size_t Generalized::Depth()const
{
	return this->_DepthGeneralized(this->_head);
}

size_t Generalized::_DepthGeneralized(GeneralizedNode* head)const
{
	assert(head);
	// D = (a,b,(c,d),(e,(f),h))
	GeneralizedNode* cur = head;
	size_t max = 0;
	size_t d = 0;
	while (cur)
	{
		if (cur->_type == SUB)
		{
			d = _DepthGeneralized(cur->_sublink);
			if (max < d)
			{
				max = d;
			}
		}
		cur = cur->_next;
	}
	return max + 1;
}
时间: 2025-01-01 10:51:48

广义表的相关操作的相关文章

oracle——数据表的相关操作——删除数据表

创建数据表; create table 表名 ( 列明1 数据类型1 [约束性条件], 列明1 数据类型1 [约束性条件], …… ) tablespace 表空间 create table student05 ( student_id number not null, student_name varchar2(20), student_age number, status varchar2(2), version number default 0 ) tablespace test sele

oracle——数据表的相关操作——重新命名一个列名

create table student05 ( student_id number not null, student_name varchar2(20), student_age number, status varchar2(2), version number default 0 ) tablespace test select * from student05; 数据表的相关操作 1.增加新列 alter table student 用于修改表的结构,add用于增加列,注意此处没有co

oracle——数据表的相关操作——删除已有列

create table student05 ( student_id number not null, student_name varchar2(20), student_age number, status varchar2(2), version number default 0 ) tablespace test select * from student05; 数据表的相关操作 1.增加新列 alter table student 用于修改表的结构,add用于增加列,注意此处没有co

oracle——数据表的相关操作——转移表空间

创建数据表; create table 表名 ( 列明1 数据类型1 [约束性条件], 列明1 数据类型1 [约束性条件], …… ) tablespace 表空间 create table student05 ( student_id number not null, student_name varchar2(20), student_age number, status varchar2(2), version number default 0 ) tablespace test sele

MySQL数据库和表的相关操作

执行如下命令,查看系统库 show databases; 求救语法: help create database; 创建数据库语法 CREATE DATABASE 数据库名 charset utf8; 数据库相关操作 #查看数据库show databases;#查看当前库show create database db1;#查看所在的库select database(); #选择数据库use 数据库名 #删除数据库DROP DATABASE 数据库名;# 修改数据库alter database db

线性表的相关操作

1.对线性表的操作 #include <stdio.h>#include "2-1.h" List* List_Create(){    return NULL;} void List_Destroy(List* list){ } void List_Clear(List* list){ } int List_Length(List* list){    return 0;} int List_Insert(List* list, ListNode* node, int p

第六课 线性表的相关操作

线性表的讨论 线性表的操作 线性表的一些常用操作 创建线性表 销毁线性表 清空线性表 将元素插入线性表 将元素从线性表中删除 获取线性表中某个位置的元素 获取线性表的长度 先把方法声明出来,下一节课开始实现: #ifndef _EG_2_1_H_ #define _EG_2_1_H_ typedef void List; typedef void ListNode; /* 该方法用于创建并且返回一个空的线性表 */ List* List_Create(); /* 该方法用于销毁一个线性表list

数据表的相关操作

1.主键约束 特点非空,只用于表示当前的记录. 设置主键:create table 表名(sid int primary key); 删除主键:alter table 表名 drop primary key ; 主键自动增长:主键字段后加 auto_increment ,只适用于masql 2.常见的表操作 查看数据库中的所有的表: show table; 查看表的结构:desc 表名: 删除表:drop table 表名: 3.修改表的结构 添加列: alter table 表名 add 列名

oracle——数据表的相关操作——插入数据以及批量插入数据

SQL更新数据 1.插入数据——insert操作 语法格式如下: insert into 表名 (列名1,列名2……,列名n) values (值1,值2……,值n); 在insert操作中,列名列表中的各列需要以逗号分隔:而值列表指定各列的值,列名与值需要一一对应. 如果insert语句所指定的列名列表包含了表中的所有列,那么可以将列名列表省略. create table student08 ( id number, name varchar2(20), sex varchar2(20), a