严蔚敏数据结构

yun_5025 2005-08-09 04:25:55
原题:
5.36⑤ 试按教科书5.5节图5.8所示存储结构,编写按上题描述的格式输出广义表的递归算法。

完整的书后答案解释:
5.36 注意以下形式的递归算法是典型的错误:设过程名为P,存储结构如教科书图5.8所示结构形式:
if(Ls)
{
printf('(');
if(!Ls->tag) printf(Ls->atom);
else
{
P(Ls->ptr.hp);
printf(',');
P(Ls->ptr.tp);
}
printf(')');
}

说明:
"上题描述的格式 "是指:
假设广义表按如下形式的字符串表示:(a1,a2,...,an)n >=0其中ai或为单字母表示的原子,或为广义表;n=0时为只含空格字符的空表( ).

5.5节图5.8所示存储结构是指:
//―――――广义表的头尾链表存储表示―――――
typedef enum {ATOM,LIST}ElemTag; //ATOM==0;原子,LIST==1:子表
typedef struct GLNode
{
ElemTag tag; //公共部分,用于区分原子结点和表结点
union //原子结点和表结点的联合部分
{
AtomType atom; //atom是原子结点的值域,AtomType由用户定义
struct
{
struct GLNode *hp,*tp;
}ptr; //ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
};
}*GList; //广义表类型

问题:
为什么是典型错误?
...全文
304 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yun_5025 2005-08-11
  • 打赏
  • 举报
回复
终于明白什么是典型错误了:
printf错了是小问题,最主要的是
if(!Ls->tag) printf(Ls->atom);
如果是原子就输出,但是没有对广义表剩余部分处理. 这样递归不完整
chenzhichao2008(陈智超)所说的有道理
if(!Ls- >tag)   
{
printf(Ls->atom);
P(Ls->下一個結點);
}
chenzhichao2008 2005-08-11
  • 打赏
  • 举报
回复
假设广义表按如下形式的字符串表示:(a1,a2,...,an)
广义表是有最外层括号的呀
就是這樣,也沒錯的,
因為第一次肯定執行else語句
chenzhichao2008 2005-08-10
  • 打赏
  • 举报
回复
if(!Ls- >tag) printf(Ls- >atom);
這一句錯了,例一個廣義表為:a,b,(c,e,f),g
那樣打印冊來是不是:(a
因此改為:
if(Ls)
{

if(!Ls- >tag)   
  {
     printf(Ls- >atom);
     P(Ls- >下一個結點);
  }
else
{
    printf('(');
P(Ls- >ptr.hp);
printf(',');
P(Ls- >ptr.tp);
    printf(')');
}

}
xiaocai0001 2005-08-10
  • 打赏
  • 举报
回复
忘了广义表的定义了,数据结构书又不在身边,否则可以研究研究。
唉……
yun_5025 2005-08-10
  • 打赏
  • 举报
回复
假设广义表按如下形式的字符串表示:(a1,a2,...,an)
广义表是有最外层括号的呀

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧