实验内容
某学籍管理系统按以下学号顺序录入并存储了10位同学的信息,18、20、3、4、15、33、25、7、16、23,每位同学的个人信息包含学号和名字,名字各人自取。以学号作为关键字用二叉排序树进行存储。编程实现信息的存储和检索。在主函数中循环输入每个待检索的学号,输出对应的学号和名字,以及查找比较次数。输入学号0表示检索结束。
要求:先按先序和中序输出所有同学的学号和名字,再查找其中2-3位同学的信息。
实验原理
查找表
查找表是由同一类型的数据元素(或记录、结点)构成的集合。一般情况下,由于“集合”中的数据元素之间存在着完全松散的关系,因此查找表是一种非常灵活方便的数据结构。
关键字
关键字是数据元素(或记录、结点)中某个数据项的值,用它可以标识或识别一个数据元素(或记录、结点)。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字;反之,则称为次关键字。当数据元素(或记录、结点)只有一个数据项时,其关键字即为该数据元素的值。
查找
查找的定义是:给定一个关键字值K,在含有n个结点的查找表中找出关键字等于给定值K的结点。若找到,则查找成功,返回该结点的信息或该结点在表中的位置;否则查找失败,返回相关的指示信息。
二叉排序树
满足以下性质的二叉树是二叉排序树:(1)若它的左子树非空,则左子树上所有结点的值均小于根节点的值。(2)若它的右子树非空,则右子树上所有结点的值均大于根节点的值。(3)左、右子树本身又各是一棵二叉排序树。
- 实验步骤和结果
- InsertBST函数
创建插入函数InsertBST,该函数返回值为BSTree类型(结构体指针类型)。该函数接收BSTree类型的变量并传递给Tptr用来对二叉树进行操作,接收整型变量传递给key和字符类型的指针变量传递给name用于将结点插入至二叉树。定义BSTNode类型的指针变量f、p并给p初始化,令p指向Tptr所指的空间。进入循环,将p作为循环条件,当p==NULL时结束循环。每次循环时首先判断p->key是否和要插入的key相等,若相等,则直接返回Tptr,表示不需要插入结点。判断完成后,令f指向p所指的位置,用于后续新结点与二叉树的连接,判断key和p->key值的大小,若前者小,则将p->lchild赋给p,否则将p->rchild赋给p,用于p指针的移动来寻找新结点的正确的位置。循环结束后,为p申请存储空间,将key的值赋给p->key,将name中的所有字符传递给p->name并将p->lchild和p->rchild置空。进行判断,若原二叉树是空树,则将Tptr指向p指向的位置并返回Tptr,否则根据key和f->key值的大小对新的结点进行安置,若前者小,则令f->lchild=p,将新结点安置在f所指结点的左侧,否则将其安置在f所指的结点的右侧。最后返回Tptr。
-
- CreateBST函数
该函数返回值为BSTree类型(结构体类型)。定义BSTree类型的变量T并令其等于NULL,定义整型类型的变量key用来接收输入的学号信息,定义字符类型的数组name1[100]用来接收相应的名字,用scanf()对学号和名字进行输入。进入循环,当key为0时循环结束。每次循环调用InsertBST函数,用T来接收此函数的返回值,之后再次进行输入学号和名字。循环结束后,返回T。
-
- SearchBST函数
该函数返回值为BSTree类型(结构体指针类型)。该函数接收BSTree类型的变量并传递给T,接收整型类型的变量并传递给key作为搜索的对象。如果T为空,直接返回T结束搜索。如果key的值和T->key的值相等,则o++进行计数,并返回T表示搜索结果在T所指的位置。之后对key和T->key的大小进行比较,若前者小则o++进行计数,返回再次调用SearchBST函数的返回值,此次调用接收T->lchild和key表示在该结点的左子树再次进行搜索。若后者较小则o++进行计数,返回再次调用SearchBST函数的返回值,此次调用接收T->rchild和key表示在该结点的右子树再次进行搜索。
-
- 使用先前实验的先根遍历和中根遍历函数进行相应学号和名字的输出。
- 结果
- 实验中出现的问题及解决方法
问题:查找时比较次数的计算。
解决:设置全局变量o,在每一次搜索之前将其置0,搜索时每比较一次,则o++,最后搜索完成后进行输出即可。
- 实验总结及体会
本次实验,我学习了有关二叉查找树的相关内容,学会了如何生成二叉查找树以及利用二叉查找树进行相应的查找。另外,我复习了有关二叉树的内容,复习了先根遍历和中根遍历二叉树以及对二叉树相关结点的操作。
本次实验,我还复习了循环语句与判断语句。将先前所学的知识与新的知识结合,能够更好地掌握新课所学知识。
五、附录
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef int KeyType;
typedef struct node
{
KeyType key;
char name[