要求:
1.编写函数,建立有序表,采用折半查找实现某一已知的关键字的查找(采用顺序表存储结构)
2.编写函数,随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树
3.编写函数,在以上二叉排序树中删除某一指定关键字元素
4.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法
代码:
#include <stdio.h>
#include <malloc.h>
#pragma warning (disable:4996)
typedef struct Node
{
int data;
struct Node *lchild, *rchild;
}NodeType;
typedef struct
{
int num;
}datatype;
typedef struct
{
datatype *data;
int length;
}S_TBL;
int SearchData(NodeType *T, NodeType **p, NodeType **q, int kx)
{
int flag = 0;
*q = T;
while (*q) {
if (kx > (*q)->data)
{
*p = *q;
*q = (*q)->rchild;
}
else {
if (kx < (*q)->data) {
*p = *q;
*q = (*q)->lchild;
}
else {
flag = 1;
break;
}
}
}
return flag;
}
int InsertNode(NodeType **T, int kx) {
int flag = 0;
NodeType *p = *T, *q, *s;
if (!SearchData(*T, &p, &q, kx))
{
s = (NodeType*)malloc(sizeof(NodeType));
s->data = kx;
s->lchild = NULL;
s->rchild = NULL;
if (p == NULL) {
*T = s;
}
else {
if (kx > p->data)
p->rchild = s;
else
p->lchild = s;
}
flag = 1;
}
return flag;
}
int DeleteNode(NodeType **T, int kx)
{
int flag = 0;
NodeType *p = *T, *q, *s, **f;
if (SearchData(*T, &p, &q, kx))
{
if (p == q)
{
f = T;
}
else
{
f = &(p->lchild);
if (kx > p->data)
f = &(p->rchild);
}
if (q->rchild == NULL)
{
*f = q->lchild;
}
else
{
if (q->lchild == NULL)
{
*f = q->rchild;
}
else
{
p = q->rchild;
s = p;
while (p->lchild)
{
s = p;
p = p->lchild;
}
*f = p;
p->lchild = q->lchild;
if (s != p)
{
s->lchild = p->rchild;
p->rchild = q->rchild;
}
}
}
free(q);
// flag = 1;
}
return flag;
}
void InOrder(NodeType *bt)
{
if (bt == NULL)
return;
InOrder(bt->lchild);
printf("\t%5d", bt->data);
InOrder(bt->rchild);
}
int Binary_Search(S_TBL *tbl, int kx) {
int low, high, mid, flag;
flag = 0;
low = 1;
high = tbl->length;
while (low <= high)
{
mid = (low + high) / 2;
if (kx < tbl->data[mid].num)
{
high = mid - 1;
}
else if (kx > tbl->data[mid].num)
{
low = mid + 1;
}
else
{
flag = mid;
break;
}
}
return flag;
}
void menu()
{
printf("################################################\n");
printf("################################################\n");
printf("#### 1.用折半查找法查找一个已知关键字 ####\n");
printf("#### 2.随机产生一组关键字,建立二叉排序树 ####\n");
printf("#### 3.删除指定关键字元素 ####\n");
printf("################################################\n");
printf("################################################\n");
printf("please enter your select:>");
}
void main()
{
int n, m = 1;
NodeType *T = NULL;
while (m)
{
menu();
scanf("%d", &n);
switch (n)
{
case 1:
{
int i, flag;
int kx;
S_TBL *tbl = (S_TBL *)malloc(sizeof(S_TBL));
printf("\t关键字长度m=");
scanf("%d", &(tbl->length));
tbl->data = (datatype *)calloc(tbl->length, sizeof(datatype));
printf("\t输入元素:");
for (i = 1; i <= tbl->length; i++)
{
scanf("%d", &((tbl->data[i]).num));
}
printf("\t输入要查找的数:");
scanf("%d", &kx);
flag = Binary_Search(tbl, kx);
if (flag == 0)
{
printf("\t查找错误\n");
}
else
{
printf("\t该关键字序号为%6d\n", flag);
}break;
}
case 2: /*插入并建立二叉树*/
{
int flag;
int kx;
printf("\t请输入一组数据(以000结尾):");
scanf("%d", &kx);
while (kx != 000) {
flag = InsertNode(&T, kx);
if (flag == 0)
{
printf("插入失败\n");
break;
}
scanf("%d", &kx);
}
printf("二叉排序树为:\n");
{
InOrder(T);
printf("\n");
break;
}
}
case 3:
{ /*删除二叉树上的结点*/
int flag;
int kx;
printf("\t输入要删除的关键字元素:");
scanf("%d", &kx);
flag = DeleteNode(&T, kx);
if (flag == 0)
{
printf("\t删除失败\n");
}
else
{
printf("\t删除成功\n");
}
printf("删除关键字元素后二叉排序树为:\n");
{
InOrder(T);
printf("\n");
break;
}}
}
}
}