数据结构第五周作业(广义表的深度、长度、存储结构)

1.

请写出下列广义表的深度和长度。

( 1 ) A = ( ) ( 2 ) B = ( a ) ( 3 ) C = ( a , b , C ) ( 4 ) D = ( a , ( A ) , ( a , ( b , ( c , C ) ) ) , d ) ( 5 ) E = ( a , ( b , c ) , ( d , ( e ) , ( f , ( g ) ) ) ) (1)A = ()\\ (2)B = ( a )\\ (3)C = ( a, b, C)\\ (4)D = ( a, (A), (a, (b, (c, C))), d )\\ (5)E = ( a, ( b, c ), ( d, ( e ), ( f, ( g )))) 1A=()2B=(a)3C=(a,b,C)4D=(a,(A),(a,(b,(c,C))),d)5E=(a,(b,c),(d,(e),(f,(g))))

广义表的长度就是广义表中第一层的元素个数。原子数据和子表都算作一个元素。

广义表的深度就是广义表中最大的嵌套次数,是广义表中所含括号的重数。是所有子表的最大深度加1

(1)长度为0,深度为1.
(2)长度为1,深度为1.
(3)长度为3,深度为1.
(4)长度为4,深度为4.
(5)长度为3,深度为4.

2.

试画出上述广义表的存储结构示意图。

3.

编写一个算法,计算如下形式广义表的长度:
A = ( a , ( b , c ) , d , ( ( e , f , ( g , h ) ) , i ) ) A = ( a, ( b, c), d, ((e, f, ( g, h)), i ) ) A=(a,(b,c),d,((e,f,(g,h)),i))

【注意】为简化操作,输入只包括字母、数字和“(”、“)”、“ ,”和空格,且任意多的空格不影响广义表的长度。

#include <stdio.h>
#include <stdlib.h>

struct Lists
{ int Flag;
union 
  {char Data;
   struct Lists *List;
  } Info; 
  struct Lists *Link;
};

void Setuplists(struct Lists **H, char *s)
{	struct Lists *p, *x;      	struct Lists *(S1[10]);   //指针栈
	int top1 = 0, i=0;    	char c;
	(*H) = (struct Lists *)malloc(sizeof(struct Lists));
	(*H)->Flag = 1;  (*H)->Info.List = 0;  (*H)->Link = 0;
	p=(*H);
	while (s[i]!='\0')
	{ c = s[i++]; 
	switch (c) { 
	case '(' : x = (struct Lists *)malloc(sizeof(struct Lists));
		x->Flag = 0;  x->Info.List = 0;  x->Link = 0;
		p->Flag = 1; p->Info.List = x;
		S1[++top1] = p;  p=x;  break; 
	case ',': 	x = (struct Lists *)malloc(sizeof(struct Lists));
		x->Flag = 0;  x->Info.List = 0;  x->Link = 0;
		p->Link = x;  p = x;  break;
	case ' ':  break;
	case ')':  p->Link = 0;  p=S1[top1--]; break;
	default : p->Flag = 0; p->Info.Data = c; p->Link = 0;
	}  }	}

void Printlists(struct Lists *H)
{	struct Lists *p;    	
       struct Lists *(S1[10]);
	int top1 = 0;
	p = H;
	while (p!=0 || top1!=0)
	{    while (p!=0)
	     {  if (p->Flag==1)   // 子表,进入下一层 //
                     { S1[++top1] = p; p=p->Info.List; printf("("); }
	       else { printf("%c",p->Info.Data); p=p->Link;   // 原子元素
                        if (p!=0) printf(","); }
	      } 
             printf(")"); // 一个子表遍历结束 //
             p = S1[top1--];     p = p->Link;     // 返回上一层,转后继 //
             if (p!=0) printf(","); 
	}
}

int Depthlists(struct Lists *H)
{ int dep=0, Maxdep=0, top1 = 0;
   struct Lists *(S1[10]), *p;
   p = H;
   while (p!=0 || top1!=0)
   {   while (p!=0)
       {  if (p->Flag==1) 
              { S1[++top1] = p; p=p->Info.List; dep++; }
           else p=p->Link; 
       }
       if (dep > Maxdep) Maxdep = dep;     
       p = S1[top1--];  dep--;  p = p->Link;  
   }
    return(Maxdep);
}

int Lenthlists(struct Lists *H)  // 长度 //
{  int n=0;
    struct Lists *p;
    p = H->Info.List;
    while (p!=0) { n++;  p = p->Link;  }
    return(n);
}

int main(){
	struct Lists *H;
	char a[100];
	char *s = gets(a);

	Setuplists(&H, s);
	Printlists(H);
	printf("\nlength  = %d",Lenthlists(H));

	return 0;
}

在这里插入图片描述

#include <stdio.h>

int main(){
	char a[100];
	char *s = gets(a);
    int max = 0,n = 0;

    while(*s){
        if(*s=='('){
            n++;
        }else if(*s==')'){
            n--;
        }
        if(max < n) max = n;
        s++;
    }
	printf("length  = %d",max);

	return 0;
}

在这里插入图片描述

  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cachel wood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值