基于C语言的广义表的运算

广义表的运算

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


typedef enum{atom,list}NodeTag;

typedef char DataType;


typedef struct GLnode{
	NodeTag tag;
	union{
		DataType data;
		struct GLnode * slink;
	};
	struct GLnode *link;
}GLNode,*Glist;


/*建立广义表函数*/
void CreatGList(Glist GL)
{
	char ch;
	scanf("%c",&ch);
	if(ch!=' ')
	{
		if(ch=' ')
		{
			GL->tag=list;
			GL->slink=(GLNode*malloc(sizeof(GLNode)));
			GL->slink=CreatGList(GL->slink);
		}
		else
		{
			GL->tag=atom;
			GL->data=ch;
		}
	}
	else
		GL=NULL;
	scanf("%c",&ch);
	if(GL!=NULL)
	{
		if(ch==',') 
			GL->link=(GLNode*) malloc(sizeof(GLNode));
			GL->link CreatGList(GL->link);
	}
	else
		GL->link=NUll;
} 

/*输出广义表函数*/
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)
			printf(")");
		if(GL->link!=NULL)
		{
			printf(",");
			printGList(GL->link);
		}
	}
}

/*广义表的查找函数*/
void FindGlistX(Glist GL,DataType x,int &mark)
{
	if(GL!=NULL)
	{
		if(GL->tag==0 && GL->data==x)
		{
			p=GL;
			mark=1;
		}
		else
			if(GL->tag==1)
				FindGlistX(GL->link,x,mark);
	}
}
 
 
 /*求广义表表头函数*/
 Glist head(Glist GL)
 {
 	Glist p;
 	if(GL!=NULL && GL->tag!=0)
 	{
 		p=GL->slink;
 		p->link=NULL;
 		return p;
	}
	else
		return NULL;
 }
 
 /*求广义表表尾函数*/
 Glist tail(Glist GL)
 {
 	Glist p;
 	if(GL!=NULL && GL->tag!=0)
 	{
 		p=GL->slink;
		p=p->link;
		GL->slink=p;
	}
	return p;
 }
 
 /*求广义表深度函数*/
 void depth(Glist GL,int &maxdh) 
 [
 	int h;
 	if(GL->tag==0) maxdh=0;
 	else
 		if(GL->tag==1 && GL->slink==NULL)
 			maxdh=1;
 		else
 		{
 			GL=GL->slink;
 			maxdh=0;
 			do{
 				depth(GL,h);
 				if(h>maxdh)maxdh=h;
 				GL=GL->link;
			}while(GL!=NULL)
			maxdh=maxdh+1;
		}
 ]

Glist p;
/*主函数*/ 
 int main(void)
 {
 	int xz=1,mark=0;
 	char x;
 	Clist GL=NULL,GL1;
 	while(xz)
	{
 		printf("***广义表的运算***\n");
 		printf("*================*\n");
 		printf("*  1 建立广义表  *\n");
 		printf("*  2 广义表查找  *\n");
 		printf("*  3 求广义表头  *\n");
 		printf("*  4 求广义表尾  *\n");
 		printf("*  5 求广义表深度*\n");
 		printf("*  0 退出表的运算*\n");
 		printf("*==================*");
 		printf("      请选择:0-5 \n");
 		scanf("%d",&xz);
 		getchar();
 		switch(xz){
 			case 1:	
			 		printf("输入广义表:");
					GL=(GLNode*)malloc(sizeof(GLNode));
					GL=CreatGList(GL);
					printf("\n");
					prtinf("输出广义表:")
					printGList(GL) ;
					printf("\n\n");
					break;
				
 			case 2:
			 		printf("输入要查找的数据值(单个字符):");
			 		scnaf("%c",&x);
			 		mark-0;
			 		FindGlistX(GL,x,mark);
			 		if(mark)
			 			printf("要查找的数据存在表中!\n\n");
			 		else
			 			printf("要查找的数据不在表中!\n\n");
			 		break;
			 		
 			case 3:	
			 		printf("输入要求表头的广义表:");
			 		GL=(GLNode*)malloc(sizeof(GLNode));
			 		GL=CreatGList(GL);
			 		GL1=head(GL);
			 		printf("广义表的表头是:");
			 		printGList(GL1);
					printf("\n\n") ;
					break;
					
 			case 4:	
			 		printf("输入要求表尾的广义表:");
			 		GL=(GLNode*)malloc(sizeof(GLNode));
			 		GL=CreatGList(GL);
			 		GL!=tail(GL);
			 		printf("(");
			 		printGList(GL1);
					printf(")");
					printf("\n\n");
					GL=NULL;
					break;
					
 			case 5:	
 					printf("输入要求深度的广义表");
 					GL=(GLNode*)malloc(sizeof(GLNode));
 					GL=CreatGList(GL);
 					depth(GL,mark);
 					printf("广义表的深度是:%5d\n\n",mark);
			 		break;
			 		
			default:
					printf("再见!\n");
					return;
		}
	}
 }
 
 
推荐大家一个小巧轻便的C语言编译工具

点击连接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值