实现广义表求表头和表尾的运算

/*algo8-2.cpp*/
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct lnode
{
 int tag;/*结点类型标识*/
 union
 {
  ElemType data;
  struct lnode *sublist;
 }val;
 struct lnode *link;/*指向下一个元素*/
}GLNode;

GLNode *GLCopy(GLNode *p)/*p为被复制的广义表的头结点指针*/
{
 GLNode *q;
 if(p==NULL) return NULL;
 q=(GLNode *)malloc(sizeof(GLNode));
 q->tag=p->tag;
 if(p->tag==1)
  q->val.sublist=GLCopy(p->val.sublist);
 else
  q->val.data=p->val.data;
 q->link=GLCopy(p->link);
 return q;
}

GLNode *head(GLNode *h)/*h为一个广义表的头结点指针*/
{
 GLNode *p=h->val.sublist;
 GLNode *q,*t;
 if(p==NULL)
 {
  printf("空表不能求表头\n");
  return NULL;
 }
 else if(h->tag==0)
 {
  printf("原子不能求表头\n");
  return NULL;
 }
 if(p->tag==0)/*为原子结点时*/
 {
  q=(GLNode *)malloc(sizeof(GLNode));
  q->tag=0;q->val.data=p->val.data;
  q->link=NULL;
 }
 else/*为子表时,产生虚子表t*/
 {
  t=(GLNode *)malloc(sizeof(GLNode));
  t->tag=1;t->val.sublist=p->val.sublist;
  t->link=NULL;
  q=GLCopy(t);
  free(t);
 }
 return q;
}

GLNode *tail(GLNode *g)/*g为一个广义表的头结点的指针*/
{
 GLNode *p=g->val.sublist;
 GLNode *q,*t;
 if(g==NULL)/*当空表时*/
 {
  printf("空表不能求表尾\n");
  return NULL;
 }
 else if(g->tag==0)/*为原子时*/
 {
  printf("原子不能求表尾\n");
  return NULL;
 }
 p=p->link;
 t=(GLNode *)malloc(sizeof(GLNode));/*建立一个虚表t*/
 t->tag=1;t->link=NULL;
 t->val.sublist=p;
 q=GLCopy(t);
 free(t);
 return q;
}

 

 

 

/*文件名:exp8-2.cpp*/
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct lnode 
{ int tag;    /*结点类型标识*/
    union
 { 
  ElemType data;
        struct lnode *sublist;
 }val;
    struct lnode *link;    /*指向下一个元素*/
} GLNode;
extern GLNode *GLCopy(GLNode *p); /*以下外部函数在algo8-2.cpp中*/
extern GLNode *head(GLNode *h);
extern GLNode *tail(GLNode *h);
extern GLNode *CreatGL(char *&s); /*以下外部函数在algo8-1.cpp中*/
extern void DispGL(GLNode *h);
void main()
{
 GLNode *g,*gh,*gt;
 char *str1="(a,(a),((a)))";
 char *str2="(((a)))";
 char *str3="(a,(a,b),((a,b),c))";
 g=CreatGL(str1);
 printf("  广义表g1:");DispGL(g);printf("\n");
 gh=head(g);
 printf("    g1表头:");DispGL(gh);
 gt=tail(g);
 printf("    g1表尾:");DispGL(gt);printf("\n\n");
 g=CreatGL(str2);
 printf("  广义表g2:");DispGL(g);printf("\n");
 gh=head(g);
 printf("    g2表头:");DispGL(gh);
 gt=tail(g);
 printf("    g2表尾:");DispGL(gt);printf("\n\n");
 g=CreatGL(str3);
 printf("  广义表g3:");DispGL(g);printf("\n");
 gh=head(g);
 printf("    g3表头:");DispGL(gh);
 gt=tail(g);
 printf("    g3表尾:");DispGL(gt);printf("\n\n");
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值