树的hai子表示法(C语言实现)——树的存储结构

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 100 
typedef char DataType;

//	定义孩子链表结点 
typedef struct CNode	
{
	int index;
	struct CNode * next;
	
}CNode;

//	定义表头结点
typedef struct TNode	 
{
	DataType data;				//	数据域
	struct CNode * firstchild;	//	指向孩子链表的头指针 

}TNode; 
 
//	定义数组 
typedef struct
{
	TNode Tree[MaxSize];	//	用来存储结点的数组 
	int n;					//	记录结点的个数	

}Tree; 

void Creat_Tree(Tree * T);				//	创建树 
void Search_Node(Tree * T, char temp);	//	搜查某个数组结点以及它的孩子链表的孩子结点 

int main()
{
	Tree T;
	
	Creat_Tree(&T);
	Search_Node(&T, 'B');
	system("\npause");
	return 0;
} 

void Creat_Tree(Tree * T)
{
	int i,n,childnode;
	
	printf("请输入数组结点的个数:");
	scanf("%d", &(T->n));
	//	逐个赋值 
	for(i=0; i<T->n; ++i)
	{
		printf("请输入第%d个数组结点的值:",i+1);
		fflush(stdin);	//	清空输入缓冲区 
		scanf("%c",&(T->Tree[i].data));
		T->Tree[i].firstchild =  (struct CNode*)malloc(sizeof(struct CNode));//	创建一个孩子链表的头结点,表头结点指针域保存该孩子链表头结点的地址
		T->Tree[i].firstchild->next = NULL;
		printf("请输入第%d个数组结点的孩子链表的结点个数:",i+1);
		scanf("%d",&childnode);
		int j = 0;
		struct CNode * p = T->Tree[i].firstchild;	//	p也保存了孩子链表头结点的地址 
		while(j<childnode)
		{
			struct CNode * q = (struct CNode*)malloc(sizeof(struct CNode));
			q->next = NULL;
			printf("请输入第%d个数组结点的孩子链表的第%d个孩子结点的值:",i+1,j+1);
			scanf("%d",&(q->index));
			p->next = q;
			p = p->next;
			j++;
		}
		
		printf("\n"); 
	}
}


//搜索树的某个结点以及它的孩子链表的孩子结点 
void Search_Node(Tree * T, char temp)
{
	int i;
	int flag = 0;
	
	for(i=0; i<T->n; ++i)
	{
		if(T->Tree[i].data==temp)
		{
			flag = 1;
			printf("\n您所搜索的结点是:%c\n", T->Tree[i].data);
			struct CNode * p = T->Tree[i].firstchild->next;
			printf("它的孩子结点有:");
			while(p)
			{
			 	printf("%2c",T->Tree[p->index].data);
			 	p = p->next;
			}
			
			printf("\n"); 
			break;
		}
			
	}
	
	if(!flag) 
		printf("没有找到的噶!\n");
}

 

猜你喜欢

转载自blog.csdn.net/Mr_Morgans/article/details/121006244