数据结构——广义表

实现广义表的内部基本函数,创建,拷贝,清除,计算表深度及结点个数等函数。

代码如下:

#pragma once;#include <assert.h>//表结点类型enum NodeType{ HEAD, VALUE, SUB,};//表各结点的成员struct GeneralizedNode{ NodeType _type;              //结点类型 GeneralizedNode* _next;       //指向当前层的下一个结点的指针  union {  char _value;  GeneralizedNode* _subLink;    //指向子表的指针 }; GeneralizedNode(NodeType type,char value);};//结点的构造函数GeneralizedNode::GeneralizedNode(NodeType type = HEAD,char value = 0) :_type(type) ,_next(NULL){ if(_type == VALUE)  _value = value; else if(_type == SUB)  _subLink = NULL;}//类——广义表class GeneralizedList{public: GeneralizedList(const char* str); GeneralizedList(GeneralizedList& gl); GeneralizedList& operator=(GeneralizedList gl); ~GeneralizedList(); void Print(); int Size(); int Depth();protected: GeneralizedNode* _CreateList(const char*& str); void _Print(GeneralizedNode* head); GeneralizedNode* _Copy(GeneralizedNode* head); void _Clear(GeneralizedNode* head); int _Size(GeneralizedNode* head); int _Depth(GeneralizedNode* head);protected: GeneralizedNode* _head;};//广义表的构造函数GeneralizedList::GeneralizedList(const char* str){ _head = _CreateList(str);}//创建广义表GeneralizedNode* GeneralizedList::_CreateList(const char*& str){ assert(*str == '('); GeneralizedNode* head = new GeneralizedNode(HEAD); GeneralizedNode* cur = head; str++;  while(*str != '\0') {  if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z'))  {   GeneralizedNode* val = new GeneralizedNode(VALUE,*str);   cur->_next = val;   cur = cur->_next;  }  else if(*str == '(')  {   GeneralizedNode* sub = new GeneralizedNode(SUB);   sub->_subLink = _CreateList(str);   cur->_next = sub;   cur = cur->_next;  }  else if(*str == ')')  {   return head;  }  str++; } return head;}//广义表的拷贝构造函数GeneralizedList::GeneralizedList(GeneralizedList& gl){ _head = _Copy(gl._head);}//拷贝广义表GeneralizedNode* GeneralizedList::_Copy(GeneralizedNode* head){ GeneralizedNode* cur = head; GeneralizedNode* newHead = new GeneralizedNode(HEAD); GeneralizedNode* newCur = newHead; cur = cur->_next; while(cur != NULL) {  if(cur->_type == VALUE)  {   GeneralizedNode* val = new GeneralizedNode(VALUE,cur->_value);   newCur->_next = val;  }  else  {   GeneralizedNode* sub = new GeneralizedNode(SUB);   sub->_subLink = _Copy(cur->_subLink);   newCur->_next = sub;  }  newCur = newCur->_next;  cur = cur->_next; } return newHead;}//广义表的赋值运算符重载函数GeneralizedList& GeneralizedList::operator=(GeneralizedList gl){ swap(gl._head,(*this)._head); /*if(this != &gl) {  _Clear(_head);  _head = _Copy(gl._head); }*/ return *this;}//广义表的析构函数GeneralizedList::~GeneralizedList(){ _Clear(_head);}//清除广义表void GeneralizedList::_Clear(GeneralizedNode* head){ GeneralizedNode* cur = head; while(cur != NULL) {  GeneralizedNode* del = cur;  if(cur->_type == SUB)  {   _Clear(cur->_subLink);  }  cur = cur->_next;  delete del; } head = NULL;}//广义表的深度int GeneralizedList::Depth(){ return _Depth(_head);}int GeneralizedList::_Depth(GeneralizedNode* head){ GeneralizedNode* cur = head; int depth = 1; while(cur != NULL) {  if(cur->_type == SUB)  {   if(_Depth(cur->_subLink)+1 > depth)   {    depth = _Depth(cur->_subLink)+1;   }  }  cur = cur->_next; } return depth;}//广义表中值结点个数int GeneralizedList::Size(){ return _Size(_head);}int GeneralizedList::_Size(GeneralizedNode* head){ GeneralizedNode* cur = head; int count = 0; while(cur != NULL) {  if(cur->_type == VALUE)  {   count++;  }  else if(cur->_type == SUB)  {   count += _Size(cur->_subLink);  }  cur = cur->_next; } return count;}//打印广义表void GeneralizedList::Print(){ _Print(_head); cout<<endl;}void GeneralizedList::_Print(GeneralizedNode* head){ GeneralizedNode* cur = head; cout<<"("; cur = cur->_next; while(cur != NULL) {  if(cur->_type == VALUE)  {   cout<<cur->_value;  }  else if(cur->_type == SUB)  {   _Print(cur->_subLink);  }  if(cur->_next != NULL)  {   cout<<',';  }  cur = cur->_next; } cout<<')';}


本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1750633

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值