广义表

// 广义表.cpp : 定义控制台应用程序的入口点。

 

#include "stdafx.h"

#include

using namespace std;

typedef struct lnode

{

   int tag;

   union

   {

      char  data;

      struct lnode* sublist;

   }val;

   struct lnode *link;

}GLNode;

 

GLNode* copy(GLNode *g)//复制广义表

{

   if(g == NULL)

   {

  

      return NULL;

   }

   GLNode * p;

   p = new GLNode;

   p->tag = g->tag;

   if(g->tag == 1)//如果是表节点

   {

      p->val.sublist = copy(g->val.sublist);

   }

   else//是原子

   {

      p->val.data = g->val.data;

   }

   p->link = copy(g->link);

   return p;

}

GLNode *createGL(char *s)

{

   GLNode *h;

   char ch;

   ch = *s;

   s++;

   if (ch !='\0')//串未结束判断

   {

      h = new GLNode;

      if(ch == '(')

      {

        h->tag = 1;

        h->val.sublist = createGL(s);//递归构造字表并链到表头结点

      }

      else if (ch == ')')

      {

        h = NULL;//遇到)字符,字表为空

      }

      else

      {

        h->tag = 0;

        h->val.data = ch;//原子结点

      }

   }

   else

   {

      h = NULL;

   }

   ch = *s;//取下一个字符

   s++;

  

   if(h != NULL)

   {

      if(ch == ',')

      {

        h->link = createGL(s);//link指向下一个元素所在结点的地址

      }

      else

      {

        h->link = NULL;

      }

   }

   return h;

}

 

//广义表的长度定义为最外层包含元素个数,即相应的同层结点所构成的单链表的长度

int getLength(GLNode *g)//非递归取得广义表的长度

{

   int n = 0;

   g = g->val.sublist;//从广义表的第一个元素开始(因为是采用头结点)

   while (g != NULL)

   {

      n++;

      g = g->link;

   }

   return n;

}

int getLength1(GLNode *g)//采用递归获得广义表的长度

{

   if(g != NULL)

      return 1+ getLength(g->link);

   else

   {

      return 0;

   }

}

 

//广义表的深度:将广义表展开后所含括号的最大嵌套层数称为深度

int getDepth(GLNode* g)

{

   int max = 0,dep;

   if(g->tag == 0)//是原子

   {

      return 0;

   }

   g = g->val.sublist;

   if(g == NULL)//空表

   {

      return 1;

   }

   while (g != NULL)

   {

      if(g->tag == 1)//元素为字表

      {

        dep = getDepth(g);

        if(dep > max)

        {

           max = dep;

        }

      }

      g = g->link;

   }

   return (max + 1);

}

void display(GLNode *g)

{

   if(g != NULL)

   {

      if(g->tag == 1)//为表结点

      {

        cout<<"";

        if(g->val.sublist == NULL)

        {

           cout<<"";

        }

        else

        {

           display(g->val.sublist);//递归输出字表

        }

      }

      else//是原子

      {

        cout<val.data;

      }

      if(g->tag == 1)

        cout<<"";

      if(g->link != NULL)

      {

        cout<<",";

        display(g->link);//递归输出后续表内容

      }

   }

}

 

int _tmain(int argc, _TCHAR* argv[])

{

   char *s = "(a,(b,c,d)))";

   GLNode *g = createGL(s);

   GLNode *p = copy(g);

   display(p);

   return 0;

}

 

你可能感兴趣的:(初学数据结构)