主题:用存储结构表示广义表
			 yangang1120
				 [专家分:0]  发布于 2007-06-24 22:24:00
 yangang1120
				 [专家分:0]  发布于 2007-06-24 22:24:00							
			选择合适的存储结构表示广义表,并能实现下列运算要求:
(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)最好能设置多个广义表 。
			最后更新于:2007-06-24 22:25:00
			
					 
		
			
回复列表 (共4个回复)
		
								
				沙发
				
					 sujinqiang [专家分:0]  发布于 2007-12-23 19:30:00
sujinqiang [专家分:0]  发布于 2007-12-23 19:30:00				
				有哪位大哥,帮帮忙嘛!!高手们你们就露一露吧~~把这个难题解决了
							 
						
				板凳
				
					 sujinqiang [专家分:0]  发布于 2007-12-23 19:32:00
sujinqiang [专家分:0]  发布于 2007-12-23 19:32:00				
				
[em1]求救了!!!编程的高手们!![em13]
							 
						
				3 楼
				
					 beijingmaxiao [专家分:0]  发布于 2008-04-12 13:55:00
beijingmaxiao [专家分:0]  发布于 2008-04-12 13:55:00				
				主要函数列表 :
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 楼
				
					 beijingmaxiao [专家分:0]  发布于 2008-04-12 13:58:00
beijingmaxiao [专家分:0]  发布于 2008-04-12 13:58:00				
				上述代码引自  龙飞   的博客。。http://ytmfcelcel.programfan.com  在此声明。。另外这个程序在他博客回复上有人说,有点错误。
							 
									
			
我来回复