文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>广义表的扩展定义之后的实现代码

广义表的扩展定义之后的实现代码

时间:2010-04-23  来源:sjtlqy


/*************************************************
CreateGList(返回:void)创建一个广义表
PrintGList(返回:void)打印一个广义表
GListDepth(返回:int)求广义表的深度
**************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef enum{ATOM, LIST}ElemTag;         /*ATOM==0:原子,LIST==1:子表*/
typedef struct GLNode
{
 int               tag;               /*公共部分,区分原子和表结点*/
 union                                /*原子结点和表结点的联合部分*/
 {
     char          atom;              /*原子结点的值域*/         
  struct GLNode *sublist;          /*表结点表头指针*/
 };
 struct GLNode     *next;             /*下一个元素结点*/
}GList;
void  CreateGList(GList **gl);
void  PrintGList(GList *gl);
int   GListDepth(GList *gl);
int main(void)
{
 GList *gl;
 printf("建立一个广义表,以右括号结束\n");
 CreateGList(&gl);
    printf("输出广义表:");
 PrintGList(gl);
 printf("\n");
    printf("广义表的深度:");
    printf("%d\n", GListDepth(gl->sublist));
 return 0;
}
void CreateGList(GList **gl)
{
 char ch;
 scanf("%c", &ch);
 getchar();                               /*吞食scanf留下的换行*/
 if(ch == '#')                            /*如果输入的是#表示为空*/
 {
  *gl = NULL;
 }
 else if(ch == '(')                       /*如果是左括号就递归构件子表*/
 {
        *gl = (GList *)malloc(sizeof(GList));
  (*gl)->tag = LIST;
  CreateGList(&((*gl)->sublist));
 }
 else                                     /*就是只有原子的情况下*/
 {
  *gl = (GList *)malloc(sizeof(GList));
  (*gl)->tag = ATOM;
  (*gl)->atom = ch;
 }
 scanf("%c", &ch);                        /*此处输入的必为逗号或者右括号*/
 getchar();
 if((*gl) == NULL)
 {
  ;
 }
 else if(ch == ',')                       /*如果是逗号就递归构件下一个子表*/
 {
  CreateGList(&((*gl)->next));
 }
 else if(ch == ')')                       /*如果是右括号就结束*/
 {
  (*gl)->next = NULL;
 }
}

int  GListDepth(GList *gl)
{
 int max, dep;
 if(!gl)
  return 1;
 for(max = 0; gl; gl = gl->next)
 {
  if(gl->tag == LIST)
  {
   dep = GListDepth(gl->sublist);     /*求以gl->sunlist的子表深度*/
   
   if(dep > max)
   {
    max = dep;
   }
  }
 }
 
 return max + 1;                            /*各元素的深度的最大值加一*/
}

void PrintGList(GList *gl)
{
 if(gl->tag == LIST)                       
 {
  printf("(");                          /*先输出左括号*/
  if(gl->sublist == NULL)
  {
   printf("#");
  }
  else
  {
   PrintGList(gl->sublist);          /*递归打印子表*/
  }
  printf(")");                          /*结束打印右括号*/
 }
 else
 {
  printf("%c", gl->atom);
 }
 if(gl->next != NULL)                      /*如果没结束就继续递归打印子表*/
 {
  printf(", ");
  PrintGList(gl->next);
 }
}
 
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载