二叉树实现!

调试如图:














/*                 tree.h
                 于2016-8-14完成
*/


#ifndef _TREE_H_
#define _TREE_H_
#include<stdbool.h>
typedef struct item
{
	char name[40];
	short score;
}Item;

typedef struct node
{
	struct node* left;
	struct node* right;
	Item item;
}Node;

typedef struct tree
{
	Node *root;
	int size;
}Tree;


/**************************
**函数原型
**操作:把一个树初始化为空树
**操作前:ptree指向一个树
**操作后:该树已被初始化为空树
***************************/
void InitializeTree(Tree *ptree);


/**************************
**函数原型
**操作:确定数是否为空
**操作前:ptree指向一个数
**操作后:树为空返回true;否则返回false
***************************/
bool TreeIsEmpty(const Tree *ptree);


/**************************
**操作:把一个树初始化为空树
**操作前:ptree指向一个树
**操作后:该树已被初始化为空树
***************************/
void InitializeTree(Tree *ptree);


/**************************
**操作:确定树中项目的个数
**操作前:ptree指向一个树
**操作后:函数返回树中项目的个数
***************************/
int TreeItemCount(const Tree *ptree);


/**************************
**操作:向数添加一个项目
**操作前:item是待添加的项目
         ptree指向已经初始化的数
**操作后:函数返回树中项目的个数
***************************/
void AddItem( const Item *item,Tree *ptree);

/**************************
**操作:把一个函数作用于树中的每一个项目
**操作前:ptree指向一个树
         pfun指向一个没有返回值的函数
		 该函数接受一个Item作为参数
**操作后:pfun指向的函数被作用于树中每一个项目一次
***************************/
void Traverse(const Tree* ptree, void(*pfun)(Item item));

/**************************
**操作:从树中删除所有节点
**操作前:ptree指向一个已经初始化的树
**操作后:该数为空树
***************************/
void DeleteAll(Tree *ptree);




/**************************
**操作:查找指定分数的学生
**操作前:ptree指向一个树;socre为要查找的分数
**操作后:输出分数为socre的学生姓名
***************************/
void FindByScore(int score, Tree *ptree);






#endif // !






/*                 tree.c
于2016-8-14完成
*/

#define _CRT_SECURE_NO_WARNINGS
#include"tree.h"
#include<stdlib.h>
#include<string.h>
static bool Toleft(const Item root_item, const Item new_item);
static bool ToRight(const Item root_item, const Item new_item);
static void AddNode(Node *new_node, Node *root);
static void FreeNode(Node *root);
static void LookForByScore(int socre, Node *root);

void InitializeTree( Tree * ptree)
{
	ptree->root = NULL;
	ptree->size = 0;
}

int TreeItemCount(const Tree * ptree)
{
	return ptree->size;
}

void AddItem(const Item *item, Tree * ptree)
{
	Node* new_node = (Node *)malloc(sizeof(Node));
	strcpy(new_node->item.name, item->name);
	new_node->item.score = item->score;
	new_node->left = new_node->right = NULL;
	if (ptree->root == NULL)
	{
		ptree->root = new_node;
		ptree->size++;
		return;
	}
	ptree->size++;
	AddNode(new_node, ptree->root);
}

void Traverse(const Tree * ptree, void(*pfun)(Item item))
{

}

void DeleteAll(Tree * ptree)
{
	FreeNode(ptree->root);
	ptree->root = NULL;
}

void FindByScore(int score, Tree * ptree)
{
	if (ptree->root->item.score == score)
		printf("%s、", ptree->root->item.name);
	LookForByScore(score, ptree->root);

}

bool TreeIsEmpty(const Tree * ptree)
{
	if(ptree->size==0)
	return true;
	else return false;
}

bool Toleft(const Item root_item, const Item new_item)
{
	if (root_item.score >= new_item.score)
		return true;
	else
	return false;
}

bool ToRight(const Item root_item, const Item new_item)
{
	if (root_item.score < new_item.score)
		return true;
	else
	return false;
}

void AddNode(Node *new_node, Node * root)
{
	if (Toleft(root->item, new_node->item))
	{
		if (root->left == NULL)
		{
			root->left = new_node;
			return;
		}
		AddNode(new_node, root->left);
	}
	else if (ToRight(root->item, new_node->item))
	{
		if (root->right == NULL)
		{
			root->right = new_node;
			return;
		}
		AddNode(new_node, root->right);
	}

}

void FreeNode(Node * root)
{
	if (root->left != NULL)
	{
		FreeNode(root->left);
		free(root->left);
	}
	if (root->right != NULL)
	{
		FreeNode(root->right);
		free(root->right);
	}
}

void LookForByScore(int score, Node * root)
{
	if (root->left != NULL)
	{
		if (root->left->item.score == score)
			printf("%s、", root->left->item.name);
		LookForByScore(score, root->left);
	}
	if (root->right != NULL)
	{
		if (root->right->item.score == score)
			printf("%s、", root->right->item.name);
		LookForByScore(score, root->right);
	}
}






/*                 main.c
                  于2016-8-14完成
*/
#define _CRT_SECURE_NO_WARNINGS
#include"tree.h"
#include<string.h>
#include<stdlib.h>
#include<stdio.h>

int main(void)
{
	Tree *tree = (Tree*)malloc(sizeof(Tree));
	Item *item = (Item*)malloc(sizeof(Item));
	char name[40]; int score; 
	printf("请输入学生名字(直接回车退出,英文):");
	InitializeTree(tree);
	while (gets_s(name, 6)!=NULL&&name[0]!='\0')
	{
		
		strcpy(item->name, name);
		printf("请输入学生分数:");
		scanf("%d", &score);
		while (getchar() != '\n');
		item->score = score;
		AddItem(item, tree);
		printf("请输入学生名字:");
	}
	printf("请输入您要查找的学生的分数:");
	scanf("%d", &score);
	FindByScore(score, tree);
	DeleteAll(tree);
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值