32. 数据结构笔记之三十二广义表实现一

32.数据结构笔记之三十二广义表实现一

“谁要是游戏人生,他就一事无成;谁不能主宰自己,永远是一个奴隶。--歌德”

我们来看下广义表的代码实现。

 

1.  广义表实现一

1.1         main

输入一个数字,调用函数creatglist创建广义表。

广义表的内容是一个char,超过一个char就失效。

 

 

1.2         定义

typedefstructgnode

{

           inttag;

           union

           {

                     charatom;

                     structgnode*sublist;

           }val;

           structgnode*link;

}*Gnode;

1.3         creatglist

createglist函数,参数是我们输入的一个数字。

如果不是‘\0’,创建一个头节点(malloc)。

如果是’(‘ 表示是子表,则设置tag为1,创建子表链

否则为tag为0。

然后读取下一字符,如果不是‘,’则设置为NULL。

Gnode creatglist(char *s)

{//创建广义表

           Gnodeh;

           charch;

           ch=*s;

           s++;

           if(ch!='\0')          //串未结束判断

           {

                     h=(Gnode)malloc(sizeof(Gnode));

                     if(!h)printf("存储空间分配失败\n");

                     if(ch=='(')

                     {

                                h->tag=1;

                                h->val.sublist=creatglist(s);   //递归创建广义表

                     }

                     elseif(ch==')')  h=NULL;

                     else

                     {

                                h->tag=0;

                                h->val.atom=ch;

                     }

           }

           elseh=NULL;

           ch=*s;

           s++;

           if(h!=NULL)

           {

                     if(ch==',')

                                h->link=creatglist(s);

                     else

                                h->link=NULL;

           }

           returnh;

}

 

 

1.4         empty

判断广义表是否为空。

1.5         length

计算广义表的长度。

1.6         Copy

复制广义表。

1.7         insert

向广义表中插入一个字符。

1.8         depth

计算广义表的深度。

1.9         output

输出广义表。

 

1.10     delfirstnode

删除第一个元素。

1.11     源码

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR -1
#define status int
typedef struct gnode
{
 int tag;
 union
 {
  char atom;
  struct gnode *sublist;
 } val;
 struct gnode *link;
} *Gnode;
Gnode creatglist(char *s)
{//创建广义表
 Gnode h;
 char ch;
 ch=*s;
 s++;
 if(ch!='\0')          //串未结束判断
 {
  h=(Gnode)malloc(sizeof(Gnode));
  if(!h) printf("存储空间分配失败\n");
  if(ch=='(')
  {
   h->tag=1;
   h->val.sublist=creatglist(s);   //递归创建广义表
  }
  else if(ch==')')  h=NULL;
  else
  {
   h->tag=0;
   h->val.atom=ch;
  }
 }
 else h=NULL;
 ch=*s;
 s++;
 if(h!=NULL)
 {
  if(ch==',')
   h->link=creatglist(s);
  else
   h->link=NULL;
 }
 return h;
}
void output(Gnode h)
{
 if(h!=NULL)
 {
  if(h->tag==1)
  {
   printf("(");
   if(h->val.sublist==NULL)
    printf(" ");
   else
    output(h->val.sublist);
  }
  else
   printf("%c",h->val.atom);
  if(h->tag==1)
   printf(")");
  if(h->link!=NULL)
  {
   printf(",");
   output(h->link);
  }
 }
}
void empty(Gnode h)
{
 if(h->val.sublist==NULL)
  printf("广义表为空\n");
 else
  printf("广义表非空\n");
}
int length(Gnode h)
{
 Gnode p=h;
 int len=0;
 if(p==NULL)
  return len;
 else
  return length(h->link)+1;
}
Gnode copy(Gnode h)
{
 Gnode b;
 if(h==NULL) return NULL;
 b=(Gnode)malloc(sizeof(Gnode));
 b->tag=h->tag;
 if(h->tag==1)
  b->val.sublist=copy(h->val.sublist);
 else
  b->val.atom=h->val.atom;
 b->link=copy(h->link);
 return b;
}
void insert(Gnode &h,char e)
{//把元素e插入广义表h,为其第一个元素
 Gnode p;
 p=(Gnode)malloc(sizeof(Gnode));
 p->tag=0;
 p->val.atom=e;
 p->link=h->val.sublist;
 h->val.sublist=p;
}
int depth(Gnode h)
{//求广义表的深度
 int max=0,dep;
 while(h!=NULL)
 {
  if(h->tag==1)
  {
   dep=depth(h->val.sublist);
   if(dep>max)
    max=dep;
  }
  h=h->link;
 }
 return max+1;
}
void delfirstnode(Gnode &h)
{//删除第一元素并输出其值
 Gnode p,q;
 p=(Gnode)malloc(sizeof(Gnode));
 p=copy(h);
 p->val.sublist->link=NULL;
 printf("广义表的第一元素为:   ");
 output(p->val.sublist);printf("\n");
 q=h->val.sublist;
 h->val.sublist=q->link;
 printf("删除第一元素后,广义表h为:\n");
 output(h);
}
void main()
{
 int len,dep;
 char s[50],elem;
 Gnode h,b;
 scanf("%s",s);

 h=creatglist(s);

 empty(h);

 printf("广义表h为\n");
 output(h);printf("\n");
 
 printf("广义表的长度为:  ");
 len=length(h->val.sublist);
 printf("%d\n",len);

 b=copy(h);
 printf("广义表b为:  ");
 output(b);printf("\n");
 insert(b,'e');
 printf("广义表b为:  ");
 output(b);printf("\n");

 printf("广义表h的深度为:\n");
 dep=depth(h->val.sublist);
 printf("%d\n",dep);

 delfirstnode(b);
}

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
更新内容:1.增加了设置命令流字体背景和边框颜色的功能;2.增加了可保存整个命令流为文本的功能;3.调整了部分右键菜单的位置和快捷键;4.修正了个别情况下打开命令流显示错误的问题;5.修正了一些情况下垂直滚动条出错的问题;6.修正自动滚屏低部留有空白的问题;7.修正不能实时读取命令流的问题。 操作提示: 1、该程序无须放在ABAQUS的工作目录下,可随意放置。另外程序可以随时打开,无须考虑与ABAQUS CAE的打开次序; 1、程序第一次运行时需要指定abaqus.rpy的位置,以后运行会自动加载上一次设置; 2、在窗口中拖动右键可以移动窗口位置; 3、把鼠标移动到窗口边缘可以拖动改变窗口大小。 该程序主要是给使用ABAQUS的朋友们学习Python用的,可以作为ABAQUS PDE的辅助工具, 对于ABAQUS和Python的关系我就不多说了,在ABAQUS CAE中的每一个菜单或按钮操作都是被解释为Python语句,然后才提交上去。 而这些Python语句被适时地保存在工作目录下的abaqus.rpy文件中,这就给我们提供了一个绝好的Python学习途径:进行CAE的操作,然后查看abaqus.rpy文件中的对应的Python语句// 该程序会适时的读取abaqus.rpy文件,以便你把相应的CAE操作对照起来// 如果对该程序有什么好的建议或意见,或需要添加什么样的功能, 或者发现什么bug,可以直接给我联系, Email:ck436#126.com(把#改为@). ========================================================== 如果你根本就不能运行本程序,那很有可能你还没有安装.NET Framework 2.0以上的平台. .NET Framework是在Microsoft .NET平台上进行程序开发和程序运行的基础. 给出解决方法: 你可以通过以下几个网址下载: http://www.onlinedown.net/soft/38669.htm http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&DisplayLang=zh-cn#QuickInfoContainer 如果安装.NET Framework时提示installer错误,则你需要先安装Windows Installer(一般不会遇到): http://www.onlinedown.net/soft/12668.htm http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=889482fc-5f56-4a38-b838-de776fd4138c

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值