关于广义表的问题

zhenzhenjiajia888 2016-09-03 01:33:49
Status CreateGList(GList *L,SString S) /* 算法5.7 */
{ /* 采用头尾链表存储结构,由广义表的书写形式串S创建广义表L。设emp="()" */
SString sub,hsub,emp;
GList p,q;
StrAssign(emp,"()");
if(!StrCompare(S,emp))
*L=NULL; /* 创建空表 */
else
{
*L=(GList)malloc(sizeof(GLNode));
if(!*L) /* 建表结点 */
exit(OVERFLOW);
if(StrLength(S)==1) /* S为单原子 */
{
(*L)->tag=ATOM;
(*L)->a.atom=S[1]; /* 创建单原子广义表 */
}
else
{
(*L)->tag=LIST;
p=*L;
SubString(sub,S,2,StrLength(S)-2); /* 脱外层括号 */
do
{ /* 重复建n个子表 */
sever(sub,hsub); /* 从sub中分离出表头串hsub */
CreateGList(&p->a.ptr.hp,hsub);
q=p;
if(!StrEmpty(sub)) /* 表尾不空 */
{
p=(GLNode *)malloc(sizeof(GLNode));
if(!p)
exit(OVERFLOW);
p->tag=LIST;
q->a.ptr.tp=p;
}
}while(!StrEmpty(sub));
q->a.ptr.tp=NULL;
}
}
return OK;
}

 void sever(SString str,SString hstr) /* 算法5.8  SString是数组,不需引用类型 */
{ /* 将非空串str分割成两部分:hsub为第一个','之前的子串,str为之后的子串 */
int n,k,i; /* k记尚未配对的左括号个数 */
SString ch,c1,c2,c3;
n=StrLength(str);
StrAssign(c1,",");
StrAssign(c2,"(");
StrAssign(c3,")");
SubString(ch,str,1,1);
for(i=1,k=0;i<=n&&StrCompare(ch,c1)||k!=0;++i)
{ /* 搜索最外层的第一个逗号 */
SubString(ch,str,i,1);
if(!StrCompare(ch,c2))
++k;
else if(!StrCompare(ch,c3))
--k;
}
if(i<=n)
{
SubString(hstr,str,1,i-2);
SubString(str,str,i,n-i+1);
}
else
{
StrCopy(hstr,str);
ClearString(str);
}
}

这个一个博客大神的代码,有一个地方有点不明白,如果广义表是((a,b))只脱一次括号后,变成了(a,b)然后用sever函数取逗号前面的串,取完了是(a,然后在递归函数放入广义表里,那不是多了一个(吗,如果是这样(a,(c,d))倒是可以,但是这样的话(a,((c),d))就不行了,是我哪里理解错了吗?
...全文
304 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
as12cs 2018-07-19
  • 打赏
  • 举报
回复
注意条件内有k这个变量,还未遇到又括号的时候因为k!=0不会跳出循环,所以会一次性读入(a,b)作为表头,表尾为空。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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