数据结构-----二叉查找树 哈希表设计

//二叉查找树
#include<stdio.h>
#include<stdlib.h>

typedef struct BSTnode{
	int data;
	struct BSTnode *rchild;
	struct BSTnode *lchild;
}*BST;

//创建
int Insert(BST &B,int element){
	if (B == NULL){
		B = (BSTnode *)malloc(sizeof(BSTnode));
		B->data = element;
		B->lchild = NULL;
		B->rchild = NULL;
		return 0;
	}
	else if (B->data > element){
		Insert(B->lchild, element);
	}
	else{
		Insert(B->rchild, element);
	}
}

//查找
void CreateBST(BST &B){
	printf("共输入多少个数据?\n");
	int num;
	int message[20];
	scanf_s("%d", &num);
	printf("请依次输入数据\n");
	for (int i = 0; i < num; i++){
		scanf_s("%d", &message[i]);
	}
	for (int i = 0; i < num; i++){
		Insert(B, message[i]);
	}
	printf("创建结束。\n");
}

BST Search(BST T,int key,int length){
	++length;
	if (!T){
		printf("该二叉查找树种无此元素。\n");
	}
	else{
	if (T->data == key){
		printf("已经找到关键字为%d的元素。\n", T->data);
		printf("查找长度为%d。\n", length);
		return T;
	}
	else if (T->data > key){
		Search(T->lchild, key, length);
	}
	else{
		Search(T->rchild, key, length);
	}
	}
}

//遍历
int preOrder(BST B){
	if (B){
		printf("%d  ", B->data);
		preOrder(B->lchild);
		preOrder(B->rchild);
	}
	else{
		return 0;
	}
}

int inOrder(BST B){
	if (B){
		inOrder(B->lchild);
		printf("%d  ", B->data);
		inOrder(B->rchild);
	}
	else{
		return 0;
	}
}

int postOrder(BST B){
	if (B){
		postOrder(B->lchild);
		postOrder(B->rchild);
		printf("%d  ", B->data);
	}
	else{
		return 0;
	}
}

//格式化打印
int printBST(BST B){
	static int i = 0;
	i++;
	if (B){
		printBST(B->rchild);
		for (int j = 0; j < i; j++){
			printf("  ");
		}
		printf("%d\n", B->data);
		printBST(B->lchild);
	}
	i--;
	return 0;
}
int main(){
	BST B = NULL;
	CreateBST(B);
	int length = 0;
	int key;
	printf("你要查找的元素的关键字是什么?\n");
	scanf_s("%d", &key);
	Search(B, key, length);
	printf("先序遍历:");
	preOrder(B);
	printf("\n中序遍历:");
	inOrder(B);
	printf("\n后续遍历:");
	postOrder(B);
	printf("\n");
	printf("该查找树为:\n");
	printBST(B);
	getchar();
	getchar();
	return 0;
}

//哈希表设计
#include<stdio.h>
#include<string>

typedef struct{
	char na[20];//name
	bool exist;  //默认为false
}element;

element message[30];  //临时存放用户输入进来的信息
element hashT[37];  //创建的新的哈希表 选择37减少冲突发生的可能性 

void Input(){
	char a;
	printf("请输入30个人的名字,要求全部小写\n");
	for (int i = 0; i < 30; i++){
		printf("请输入第%d个人的名字。\n",i+1);
		a = getchar();
		for (int j = 0;a!='#' ; j++){
			(message[i].na)[j] = a;
			a = getchar();
		}
		getchar();
	}
	printf("信息输入完成。\n");
}

void Create(){  //名字不超过20个字母
	int num,index;
	for (int i = 0; i < 30; i++){
		num = (int)(message[i].na)[0]+(int)(message[i].na)[1];
		index = num % 37;
		while (hashT[index].exist!=false){
			index = (index + 1) % 37;
		}
		int length = strlen(message[i].na);
		strcpy_s(hashT[index].na,length+1,message[i].na);
		hashT[index].exist = true;
	}
	printf("哈希表创建完成。\n");
}

void Search(){
	printf("请输入你要找的名字,以'#'结束\n");
	char input[20];
	char a;
	a = getchar();
	int i;
	for (i = 0; a != '#'; i++){
		input[i] = a;
		a = getchar();
	}
	input[i] = '\0';
	int index = ((int)input[0] + (int)input[1])%37;
	while(strcmp(input, hashT[index].na) != 0 && hashT[index].exist !=false){
		index = (index + 1) % 37;
	}
	if (strcmp(input, hashT[index].na) == 0){
		printf("此元素在哈希表的第%d个位置。\n", index);
	}
	else if (hashT[index].exist == false){
		printf("在该哈希表中未查找到此元素。\n");
	}
}

int main(){
	Input();
	Create();
	Search();//用于测试找到的情况
//	Search();//用于测试与之前冲突的情况
//	Search();//用于测试不是表中元素的情况
	getchar();
	getchar();
	return 0;
}

调试感悟:

1.在最开始树的建立的时候就出现问题,无法将BSTnode*转化为BST类型,将结构的定义体改为如下即可成功。

《数据结构-----二叉查找树 哈希表设计》《数据结构-----二叉查找树 哈希表设计》

2.之前出现了各种各样的问题,出现了0xccccccc这种情况就是可能是出现了野指针,最初自己以为B->lchild和B->rchild不去管他的时候他就自己为null了,但不是这个样子的,需要手动把他们赋值为null

3.在对于输入要查找的内容的地方出现了烫烫烫,需要手动在之后加\0

4.自己在写程序的时候是一股脑把全部都写下来,并没有把需要的拆分出来,写完之后看网络上他人的程序,把插入删除各个部分区别开来,程序可读性更高,而且更易于维护。





http://blog.csdn.net/xiaoping8411/article/details/7706376

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/xueying_2017/article/details/78896652
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞