回 帖 发 新 帖 刷新版面

主题:用存储结构表示广义表

选择合适的存储结构表示广义表,并能实现下列运算要求:

(1)用大写字母表示广义表,用小写字母表示原子,并提供设置广义表的值的功能。

(2)取广义表L的表头和表尾的函数head(L)和tail(L)。

(3)能用这两个函数的复合形式求出广义表中的指定元素。

(4)由广义表的字符串形式到广义表的转换函数Lists Str_ToLists_(S);例如

Str_ToLists_(“ (a,(a,b),c)”)的值为一个广义表。

(5)由广义表到广义表的字符串形式的转换函数char * Lists_To_Str(L)。

(6)最好能设置多个广义表 。

回复列表 (共4个回复)

沙发

有哪位大哥,帮帮忙嘛!!高手们你们就露一露吧~~把这个难题解决了

板凳


[em1]求救了!!!编程的高手们!![em13]

3 楼

主要函数列表 :
CreateGList(返回:void)创建一个广义表

PrintGList(返回:void)打印一个广义表

GListDepth(返回:int)求广义表的深度

历史:暂无修改
**************************************************/


#include <stdio.h>
#include <stdlib.h>
#define NULL 0

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;
}


/*************************************************
函数名称:CreateGList

函数功能:创建一个广义表(递归构件子表)
输入的时候是换一行输入,最后要多输右括号,是递归的原因

被本函数调用的函数清单:无

调用本函数的函数清单:无

输入参数:gl,取用指针的指针的形式,可以对其直接修改

输出参数:无

函数返回值:(void)
**************************************************/
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;
 }
}

/*************************************************
函数名称:GListDepth

函数功能:求广义表的深度(递归子表->到子表..(最长+1))

被本函数调用的函数清单:无

调用本函数的函数清单:无

输入参数:gl

输出参数:无

函数返回值:(void)
**************************************************/
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;
   }//if
  }//if
 }//for
 
 return max + 1;                            /*各元素的深度的最大值加一*/
}

/*************************************************
函数名称:PrintGList

函数功能:打印广义表(递归打印子表)

被本函数调用的函数清单:无

调用本函数的函数清单:无

输入参数:gl

输出参数:无

函数返回值:(void)
**************************************************/
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);
 }
}

4 楼

上述代码引自  龙飞   的博客。。http://ytmfcelcel.programfan.com  在此声明。。另外这个程序在他博客回复上有人说,有点错误。

我来回复

您尚未登录,请登录后再回复。点此登录或注册