CSDN博客

img lxf20054658

广义表

发表于2008/10/3 21:34:00  389人阅读

分类: C++

 链表抽象类

class TGList0{
 public:
 //TGList0(){};
 //virtual ~TGList0(){};
 virtual int GetLen( TGListNode0* pNode ) = 0;
 virtual int GetDepth( TGListNode0* pH ) = 0;
 virtual TGListNode0* Copy( TGListNode0 * ph,int &k ) = 0;
 virtual TGListNode0* GetHead( TGListNode0* pNode ) = 0;
 virtual TGListNode0* GetTail( TGListNode0 * pNode ) = 0;
 
 //delete the snth node
 //virtual void DeleteNode( unsigned int sn  ) = 0;
 //delete the node between s1 and s2
 //virtual void DeleteNode( unsigned int s1,unsigned int s2 ) = 0;
 //virtual TGListNode0* InsertNode( TGListNode0* pNode,unsigned int sn ) = 0;
};

 

链表节点抽象基类

enum TTraversMode
{ PreOrder,
  LevelOrder
};
int const CNST_ListName = 10;
class TGListNode0
{ //protected:
  public:
 char name[ CNST_ListName ];
 char tag;
 unsigned int no;//编号
 
  public:
    char isList()
    { return tag;
 }; 
 
   char * GetName()
   { return name;
   };

   void SetName( char *mName )
  { strncpy(name,mName, CNST_ListName );
  };

  unsigned int GetNo()const
  { return no;
   };

  void SetNo( unsigned int mNo )
  { no = mNo;
  };

  char GetTag()const
  {  return tag;
  };
 
  void SetTag( char mTag )
  {  tag = mTag;
  };
};

#ifndef TGLISTNODE_H
#define TGLISTNODE_H
#include "TGListNode0.h"

class TGListNode : public TGListNode0
{ public:
  char visited;
  TGListNode * next;
  TGListNode* parent;
  
  union
  { char *pElem;
    TGListNode *pSub;
  };
 
  virtual TGListNode* GetNext()
  { return next;
  };
  virtual void SetNext( TGListNode* p )
  { next = p;
  };
  virtual TGListNode* GetSub()
  { return pSub;
  };
 
  virtual void SetSub( TGListNode* p )
  { pSub = p;
  };
 
  virtual char* GetElem()
  { return pElem;
  };
 
  virtual void SetElem( char *pe )
  { pElem = pe;
  };
 
  virtual TGListNode* GetParent()
  { return parent;
  };
 
  virtual void SetParent( TGListNode* p )
  { parent = p;
    tag = 1;
  };
};

#endif

#include "TGList.h"
#include<iostream>
using std::cout;
using std::endl;

#include<new>
#include<vector>
using std::vector;
#include<queue>
using std::queue;
#include<stack>
using std::stack;

TGList::TGList()
{ head = NULL;
}

TGList::~TGList()
{ ReleaseAll( head );
}

int TGList::TotalNode( TGListNode *pNode )
{  if( pNode == NULL )
 return 0;

 TGListNode* q = pNode;
 int NodeCount = 0;
    //q = head;
 
  while( q != NULL )
  {
  if( q->visited == 0 )
  {   q->visited = 1;
 
    if( q->tag == 0 )
 {
  NodeCount++;
  //q = q->next;
 } 
 else
 { NodeCount++;
  NodeCount += TotalNode( q->pSub );
 }
  }
  q = q->next;
  }//while
  return NodeCount ;
}

//return address of the snth node
TGListNode* TGList::GetNode( TGListNode* pH,unsigned int sn )
{
  TGListNode* q;
  /*q = head;
  while( q->no != sn )
  { if( q->tag == 1 && q->next != NULL )
    {
  if( (q->pSub->no < sn) && (q->next->no > sn) )
      q = q->pSub;
 
        else if( (q->pSub->no > sn) && (q->next->no < sn) )
   q = q->next;
  
     else if( (q->pSub->no < sn) && (q->next->no < sn)/
            && ( q->pSub->no < q->next->no ))
   q = q->next;
  
      else
         q = q->pSub;  
    }
   
    else if( q->tag == 0 )
 {   q = q->next;
 }
 else
  q = q->pSub;
 
 if( q->no == sn )
  return q;
  }//while
  return 0;//not found
  */
  q = pH;
  TGListNode* p = NULL;
  if( q == NULL )
   return 0;
  while( q!= NULL )
  { if( q->visited == 0 )
     {   q->visited = 1;
        
         if( q->tag == 0 )
   {     if( q->no == sn )
     { p = q;
        //return q;
     }
   }
   else
   {    if( q->no == sn )
    { p = q;
        //return q;
    }
    else
    p = GetNode( q ->pSub,sn );
   }
 q = q->next;
     }
  }//while
  return p;
}

TGListNode* TGList::GetHead()const
{ return head;
}

 TGListNode0* TGList::GetHead( TGListNode0* pNode )
 { if(pNode == NULL )
  return 0;
 if( pNode->tag == 1 )
  return pNode;
  int number = pNode->no;
  TGListNode* q = GetNode( GetHead(), number - 1 );
  while( q->tag != 1)
  { q = GetNode( GetHead(), number-- );
  }//while
 
  return q;
 }
 
int TGList::GetLen( TGListNode0* pNode )
{ TGListNode* p= (TGListNode*)GetHead( pNode );
  int length =0;
  while( p != NULL )
  { p = p->next;
    length++;
  }
  return length;
}

//深度优先递归遍历
int TGList::Cluster( TGListNode0 * pH,char **pE,int &k )
{ TGListNode* q;
  if( pH == NULL )
   return 0;
  q = (TGListNode*)pH;
  while( q != NULL )
  { if( q->visited == 0 )
  {  q->visited = 1;
     if( q->tag ==0 )
   pE[k++ ] = q->name;
  else
   Cluster( q->pSub,pE,k );
  }
  q = q->next;
  }//while
  return k;
}

int TGList::Cluster( TGListNode0 * pH,char **pE )
{ int k = 0;
  return Cluster( pH,pE,k );
}

void TGList::BreadthFirst( TGListNode * pH )
{ if( pH == NULL )
 return;
 TGListNode* q = pH;
  queue<TGListNode*> team;
  while( q != NULL || !team.empty() )
  { if( q->visited == 0 )//the last node error
    {   q->visited = 1;
         if( q->tag == 0 )
         {
       cout<<q->name<<" ";
       q = q->next;
         }
   //q->tag == 1
         else
     {  //if( q->next != NULL )
      team.push( q );
        //else
   //q = q->pSub;
   q = q->next;
     }
  
        if( q == NULL && !(team.empty() ) )
        { //void pop();
   q = team.front();
    team.pop();
    q = q->pSub;
        }   
  }
  }//while
}

//非递归深度遍历并返回单元素节点的个数
int TGList::Cluster2( TGListNode0 * pH )
{ TGListNode *q;
  if( pH == NULL )
   return 0;
  q = (TGListNode*)pH;
  vector<TGListNode*> s;
  //int top = 0;
  int k = 0;
 
  while( q != NULL || !s.empty() )
  {
 if( q->visited == 0 )
      { q->visited = 1;
        k++;
 
    //当前节点指向子表,则节点入栈,访问子表 
         if( q ->tag == 1)// && q->next != NULL )
     { s.push_back( q );
      q = q->pSub;
     }
      //单元素节点输出
      else
     { cout<<q->name<<" ";
         q = q->next;
     }
 
 //当前表中元素访问完毕,退栈
    if( q == NULL && !( s.empty() ) )
    { q = s.back();
   s.pop_back();
      q = q->next;
    }
    }//if
  }//while
 
  return k;
}
//返回从pH出发,广义表的深度
int TGList::GetDepth( TGListNode0 * pH )
{ TGListNode* q;
  int dep,dep0;
  if( pH == NULL )
   return 0;
  dep = 0;
  q = ((TGListNode * )pH );//->pSub;
  while( q != NULL )
  { //单元素节点,深度定义为零
   if( q->tag == 0 )
   dep0 = 0;
 //递归子表 
      else
    dep0 = GetDepth( q->pSub );
   
 //得到两者中较大者 
   if( dep < dep0 )
    dep = dep0;
   q = q->next;
  }//while
  return dep + 1;
}

//返回任意节点所在的层
int TGList::GetLevel( TGListNode* pH /*= head*/,TGListNode *pNode )
{ /*if( pNode == NULL )
 return 0;
 int level = -1;

 TGListNode* q = pH;
 if( q == NULL )
  return 0;

 while( q != NULL )
 {  if( q->no != pNode->no) 
  if( q->visited == 0 )
        {  q->visited = 1;
   if( q->tag == 0 )
   level = 0;
      else
  {    level++;
   level += GetLevel( q->pSub,pNode );
  }
  
        }
  q = q->next;
 }//if -while
 return level + 1;
 */
 if( pH == NULL )
 return -1;
 TGListNode* q = pH;
  queue<TGListNode*> team;
  int level = 0;
  while( q != NULL || !team.empty() )
  { if( q == pNode)
   return level;
 if( q->visited == 0 )//the last node error
    {     q->visited = 1;
         if( q->tag == 0 )
         {
     //  cout<<q->name<<" ";
      q = q->next;
         }
   //q->tag == 1
         else
     {  //if( q->next != NULL )
      team.push( q );
        //else
   //q = q->pSub;
   q = q->next;
     }
  
        if( q == NULL && !(team.empty() ) )
        { //void pop();
    q = team.front();
    team.pop();
       q = q->pSub;
       level++;
        } 
   // q = q->next;
     }
 
  
  }//while
  return 0 ;
}

//广义表的逆串行化,得到广义表的内存表示
/*TGListNode**/void TGList::GListExprToGListStruc( char *glistExpre,int n )
{  int k,top;
//节点计数器
   int nodeCount = -1;
   TGListNode* h;//head
   TGListNode* pre;//prior
   TGListNode* p;
   TGListNode** stack;
  
   char firstlist;
   if( n < 3 )return /*NULL*/;
  
   if( glistExpre[ 0 ] < 'A'||glistExpre[ 0 ] > 'Z'||glistExpre[ 1 ] != '(')
    return /*NULL*/;
   stack = new TGListNode* [ n ];
   top = 0;
   k = 0;
   //a new node
   h = new TGListNode;
   //it means how many node have been produced
   nodeCount++;
  
   h->tag = 1;
   h->no = nodeCount;
   h->name[ 0 ] = glistExpre[ k ];//root information
   h->name[ 1 ] = 0;
   h->visited = 0;
   h->next = NULL;
   h->pSub = NULL;
  
   pre = NULL;
  // top++;
   //push h to stack
   stack[ ++top ] = h;
   k++;
   //表达式中上一个符号是左括号
   firstlist = 1;
   while( top > 0 && k < n- 1 )
   { k++;
     switch( glistExpre[ k ] )
     { case ',':
       case ')':
             pre = stack[ top-- ];
                //top--;
                firstlist = 0;
                break;
       case '(':
                firstlist = 1;
                continue;
 //default   
       default:
  p = new TGListNode;
  nodeCount++;
  p->visited = 0;
  p->next = NULL;
  p->pSub = NULL;
  //子表
  if( glistExpre[ k ] >= 'A' && glistExpre[ k ] <= 'Z')
  { p->tag = 1;
  // 节点编号
    p->no = nodeCount;
    p->name[ 0 ] = glistExpre[ k ];
    p->name[ 1 ] = 0;
 
  } 
  //单元素
  else
  { p->tag = 0;
    p->no = nodeCount;
    p->name[ 0 ] = glistExpre[ k ];
    p->name[ 1 ] = 0;
  }  
 
  if(firstlist)
  { //"p" is stack[top]'s child list
   stack[ top ] ->pSub = p;
  }
  else
   //prior node
   if( pre != NULL )
    pre->next = p;
  
   top++;
   stack[top] = p;
   firstlist = 0;
//end of default  
  }//switch
   }//while
   delete[] stack;
   head = h;
   return;/*h;*/
}

TGListNode0* TGList::Copy( TGListNode0 * ph,int &k )
{ TGListNode *q, *p,*pHead,*pRear;
  if( ph == NULL )
   return 0;
  pRear = NULL;
  q = ( TGListNode*)ph;
  while( q != NULL )
  { if( q->visited == 0 )
  { k++;
    p = new TGListNode;
 p->tag = q->tag;
 p->no = q ->no;
 p->visited = 0;
 p->next = NULL;
 strcpy(p->name,q->name );
 
 if( pRear != NULL )
  pRear->next = p;
 else
  pHead = p;
 //move pRear to end of list
 pRear = p;
 q->visited = 1;
 //signal element
 if( q->tag ==0 )
 { p->pElem = q->pElem;
 }
 else
  p->pSub = (TGListNode*)Copy( q->pSub,k );
 
  }//if
  q = q->next;
  }//while
  return (TGListNode0*)pHead;
}

TGListNode0* TGList::GetTail( TGListNode0 * pNode )
{ TGListNode *p,*q;
  int k = 0;
  if( pNode == NULL || pNode ->tag == 0 || /
  ( (TGListNode*)pNode )->pSub->next == NULL)
  return NULL;
  //p is head of current list
  p = (TGListNode*)Copy( pNode,k );
  //q point to p's child list
  q = p->pSub;
  p->pSub = q ->next;
  delete q;
  return static_cast<TGListNode*>(p);
}

//delete the pointed node,default node to delete is the first node
void TGList::DeleteNode( unsigned int sn = 1 )
{  TGListNode* p = GetNode( GetHead(),sn );
   TGListNode* ph = (TGListNode*)GetHead( p );
   TGListNode* q = ph;
  
   while( q->no != sn  && q->next != NULL )
   {   p = q;
    q = q ->next;
   }
   if( q != NULL )
   { //p = q;
    // q = q->next;
    if( q->tag == 0 )
   { p->next = q->next;
     delete q;
   }
   //deal with the child list
   else
   { p->pSub = q->pSub;
     p->next = q->next;
  delete q;
   }
   }//if
}

void TGList::DeleteNode( unsigned int s1,unsigned int s2 )
{
}

TGListNode0* TGList::InsertNode( TGListNode0* pNode,unsigned int sn )
{ /*TGListNode* q;
  q = GetNode( sn );
  if( q->tag == 0 )
   q*/
 return 0;
}

void TGList::ReleaseAll( TGListNode* pNode )
{ TGListNode* q = NULL;
  q = pNode;
  if( q == NULL )
   return;
  TGListNode* p = NULL;
  vector<TGListNode*> sPnode;
  while( q != NULL )
  { if(q->tag == 1 )
     { sPnode.push_back( q );
       q = q->pSub;
     }
    else
 { p = q;
   q = q->next;
   delete p;
 }
 
 if( q == NULL && !sPnode.empty() )
 { q = sPnode.back();
   sPnode.pop_back();
   p = q;
   q = q->next;
   delete p;
 }
  }
}

void TGList::SetVisit( TGListNode* pH )
{ TGListNode* q = pH;
if( q== NULL )
 return;
while( q != NULL )
{ if(q->visited == 1 )
     { q->visited = 0;
         if( q->tag == 0 )
    ;
   else
    SetVisit( q->pSub );
  }
  q = q->next;
}
}
//串行化广义表表达式
deque<char*> TGList::GListStrucToGListExpr()
{ TGListNode* q = head;
  vector<TGListNode*> s;
 
  deque<char*> chQueue;
  while( q != NULL || !s.empty() )
  {
 if( q->visited == 0 )
      { q->visited = 1;
 
    //当前节点指向子表,则节点入栈,访问子表 
         if( q ->tag == 1)// && q->next != NULL )
     { cout<<q->name<<"(";
    chQueue.push_back( q->name );
       chQueue.push_back( "(" );
    s.push_back( q );
       q = q->pSub;
     }
      //单元素节点输出
      else
     { cout<<q->name;
      chQueue.push_back(q->name);
   if(q->next != NULL )
   { chQueue.push_back(",");
    cout<<",";
   } 
   else
   {   chQueue.push_back(")");
       chQueue.push_back(",");
    cout<<")"<<",";
   }
         q = q->next;
     }
 
 //当前表中元素访问完毕,退栈
    if( q == NULL && !( s.empty() ) )
    { q = s.back();
   s.pop_back();
      q = q->next;
    }
  
    }//if
  }//while

  //chQueue.pop_back();
  return chQueue;
}

0 0

相关博文

我的热门文章

img
取 消
img