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

来源:互联网 发布: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


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 风湿类风湿贴 风湿骨病的症状 风湿膝盖疼怎么办 风湿症状表现有哪些 风湿怎么检查 内风湿是怎么引起的 脚风湿痛的症状 风湿痛怎么缓解 得了风湿怎么办 膝盖风湿怎么办 年轻人风湿痛怎么办 手风湿痛怎么办 有风湿的症状 风湿初期症状 类风湿与风湿 风湿是什么原因引起的 风湿是怎么引起的 腿有风湿是什么症状 风湿前期症状 热风湿是什么症状 风湿早期症状都有哪些 看风湿那里好 风湿痛吃什么药 为什么会得风湿 风湿的表现有哪些 为什么得风湿 女性风湿的初期症状 风湿要注意什么 风湿了怎么办 风湿怎么来的 风湿和类风湿的症状 风湿是什么科 风湿怎么引起的 风湿什么症状 风湿的症状都有哪些 去风湿的方法 有风湿不能吃什么 风湿用什么药 看风湿哪个医院好 得风湿怎么办 风湿有那些症状