广义表的基本操作函数

广义表:

#广义表及结点的表示法#
typedef	enum{atom,list}NodeTag;
typedef	struct GLNode{
	NodeTag tag;
	union{
		DataType	data;
		GLNode		*slink;	
	};
	GLNode		*next;
}*	Glist;		//为一个指针; 


#广义表的基本操作实现#
#1.广义表元素的添加# 
Glist	CreatGlist(Glist	GL){
	char	ch;	scanf("%c",&ch);
	if(ch != ' '){
		if(ch == '('){
			GL->tag	 = list;
			CreatGlist(GL->slink);
		}
		else{
			GL->tag = atom;
			GL->data = ch;	
		}
	}	
	else	GL=NULL;
	scanf("%c",&ch);
	if(GL != NULL)
	if(ch == ',')
		GL->link = CreatGlist(GL->link);
	else
		GL->link = NULL;
		
	return GL;
}

#2.广义表的打印输出#
void	PrintGlist(Glist GL){
	if(GL != NULL){
		if(GL->tag == list){
			printf("(");
			if(GL->slink == NULL)	printf(" ");
			else 		PrintGlist(GL->slink);	
		}	
		else	printf("%c",GL->data);
		if(GL->tag == list)
			print(")");
		if(GL->link != NULL){
			printf(",");
			PrintGlist(GL->link);	
		}
	}	
}

#3.查找广义表中的数据x#
void	FindGlistX(Glist  GL, DataType  x, int	*mask){
		if(GL != NULL){
			if(GL->tag == 0 && GL->data == x){
				p = GL;		//全部变量,标记x所在的结点; 
				*mask = 1;  //标记是否找到包含x结点的元素; 
			}	
			if(GL->tag == 1)
				FindGlistX(GL->slink, x, &mask);
			FindGlistX(GL->link,x,&mask);
		}
}
#4.求广义表的表头#
Glist	head(Glist GL){
	Glist p;
	if(GL != NULL && GL->tag != 0){
		p = GL->slink;
		p->link = NULL;
		return p;	
	}else{
		return NULL;	
	}
}
#5.求广义表的表尾#
Glist	tail(Glist  GL){
	Glist	p;
	if(GL != NULL && GL->tag != 0){ //表不为空且有表尾; 
		p = GL->slink;
		p = p->link;
		GL->slink = p; //删除广义表第一个元素 
	}	
	return p;
}

#6.求广义表的深度depth#
void	depth(Glist  GL, int *maxdh){
	int 	h;
	if(GL->tag == 0)	*maxdh = 0;
	else if(GL->tag != 0 && GL->slink == NULL)
			*maxdh = 1;
	else{
		*maxdh = 0;
		GL = GL->slink;
		do{
			depth(GL,&h)
			if(h>*maxdh)	maxdh = h;
			GL = GL->link;	
		}while(GL !=NULL);
		*maxdh = *maxdh + 1;
	}	
} 


 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值