//二叉查找树
#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