主题:用存储结构表示广义表
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:32:00
[em1]求救了!!!编程的高手们!![em13]
3 楼
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
上述代码引自 龙飞 的博客。。http://ytmfcelcel.programfan.com 在此声明。。另外这个程序在他博客回复上有人说,有点错误。
我来回复