数据结构-----二叉查找树 哈希表设计
来源:互联网 发布:linux 关闭显示行数 编辑:程序博客网 时间:2024/05/17 07:38
//二叉查找树#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];//namebool 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
阅读全文