数据结构查找子系统.docx
《数据结构查找子系统.docx》由会员分享,可在线阅读,更多相关《数据结构查找子系统.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构查找子系统
/*
*题目:
编写循序查找程序
*编写二分查找程序
*编写建立二叉排序树的程序
*编写在二叉排序树上的查找、输入、删除结点的程序
*编写二叉排序树的中序输出的程序
*设计一个选择式菜单,一级菜单形式如下:
*查找子系统
**********************************
**1------顺序查找*
**2------二分查找*
**3------二叉排序树*
**0------返回*
**********************************
*请选择菜单号(0--3):
*二叉排序树的二级菜单如下:
*二叉排序树
*************************************
**1------更新二叉排序树*
**2------查找结点*
**3------插入结点*
**4------删除结点*
**5------中序输出排序树*
**0------返回*
*************************************
*请选择菜单号(0--5):
*/
#include
#include
#include
#defineSEARCHMAX30
typedefstructnode
{
inttrData;//根节点
structnode*lchild;//左子树
structnode*rchild;//右子树
}BtNode,*pBtNode;
voidseqSearch();
voidbinSearch();
voidbtSearch();
pBtNodecreateBT();
voidsearchBT(pBtNodeT,intk);
voidinsBT(pBtNode*T,intk);
voiddelBT(pBtNode*T,intk);
voidinorderBT(pBtNodeT);
voidmain()
{
intchoice,k=1;
while(k)
{
printf("\n查找子系统\n");
printf("*********************************\n");
printf("*1------顺序查找*\n");
printf("*2------二分查找*\n");
printf("*3------二叉排序树*\n");
printf("*0------返回*\n");
printf("*********************************\n");
printf("请选择菜单号(0--3):
");
fflush(stdin);
scanf("%d",&choice);
switch(choice)
{
case1:
seqSearch();
break;
case2:
binSearch();
break;
case3:
btSearch();
break;
case0:
k=0;
break;
default:
printf("输入错误,请重新输入。
");
getchar();
k=1;
break;
}
}
}
voidseqSearch()//顺序查找
{
inta[SEARCHMAX],x,y,i;
charch;
printf("建立一个整数的顺序表(以-1结束):
");
for(i=0;i{
scanf("%d",&a[i]);
getchar();
if(a[i]==-1)//记录结束位置,结束循环
{
y=i;
break;
}
}
printf("是否需要查找(Y/N):
");
scanf("%c",&ch);
while(ch=='y'||ch=='Y')
{
printf("请输入要查找的数据:
\n");
scanf("%d",&x);
getchar();
i=0;//找到数组的结束位置。
while(i=x)//找到要查找的数据的位置
{
i++;
}
if(i==-1)//没找到
{
printf("对不起,没有找到。
\n");
}
else
{
printf("该数据在第%d个位置上。
\n",i+1);
}
printf("是否继续查找(Y/N):
");
scanf("%c",&ch);
}
}
voidbinSearch()//二分查找
{
intb[SEARCHMAX],i,y,x,low,mid,high,n;
charch;
printf("建立递增有序的查找顺序表(以-1结束):
\n");
for(i=0;i{
scanf("%d",&b[i]);
getchar();
if(b[i]==-1)//记录结束位置,结束循环
{
y=i;
break;
}
}
printf("是否需要查找(Y/N):
");
scanf("%c",&ch);
while(ch=='y'||ch=='Y')
{
printf("请输入要查找的数据:
");
scanf("%d",&x);
getchar();
low=0;//低
high=y-1;//高
n=0;//记录次数
while(low<=high)
{
mid=(low+high)/2;
n++;
if(b[mid]>x)//在左边
{
high=mid-1;
}
elseif(b[mid]{
low=mid+1;
}
else//找到
{
break;
}
}
if(low>high)
{
printf("对不起,没有找到该数据。
\n");
printf("共进行%d次比较。
\n",n);
if(b[mid]{
mid++;
}
printf("可将此数据插入第个%d位置",mid+1);
}
else
{
printf("找到该数据在第%d个位置。
\n",mid+1);
printf("共进行%d次比较。
\n",n);
}
printf("是否需要查找(Y/N):
");
scanf("%c",&ch);
}
}
voidbtSearch()//二叉排序树
{
intchoice,x,l=1;
pBtNodeT;
printf("建立一棵二叉排序树存储\n");
T=createBT();
getchar();
while(l)
{
printf("\n二叉排序树\n");
printf("***********************************\n");
printf("*1------更新二叉排序树*\n");
printf("*2------查找结点*\n");
printf("*3------插入结点*\n");
printf("*4------删除结点*\n");
printf("*5------中序输出排序树*\n");
printf("*0------返回*\n");
printf("************************************\n");
printf("请选择菜单号(0--5):
");
fflush(stdin);
scanf("%d",&choice);
switch(choice)
{
case1:
T=createBT();
break;
case2:
printf("请输入要查找的数据:
");
scanf("%d",&x);
getchar();
searchBT(T,x);
break;
case3:
printf("请输入要插入的数据:
");
scanf("%d",&x);
insBT(&T,x);
break;
case4:
printf("请输入要删除的数据:
");
scanf("%d",&x);
delBT(&T,x);
break;
case5:
inorderBT(T);
break;
case0:
l=0;
break;
default:
printf("输入错误,请重新输入。
");
getchar();
l=1;
break;
}
}
}
pBtNodecreateBT()//建立二叉树
{
pBtNodeT;//声明指针
intx;
T=NULL;
printf("请输入一个整数(输入0结束):
");
fflush(stdin);
scanf("%d",&x);
getchar();
while(x)//输入的数据非零时
{
insBT(&T,x);//二叉树中插入数据
printf("请输入下一个整数(输入0结束):
");
fflush(stdin);
scanf("%d",&x);
getchar();
}
returnT;//返回指针
}
voidsearchBT(pBtNodeT,intk)//查找二叉树结点
{
pBtNodef=T;
while(f)
{
if(f->trData==k)//判断是否找到该数据
{
printf("已找到数据。
\n");
return;
}
f=(ktrData)?
f->lchild:
f->rchild;//判断下一个查找的位置
}
printf("没有找到数据。
\n");
}
voidinsBT(pBtNode*T,intk)//插入二叉树结点
{
pBtNodef,p;
p=(*T);//指向指针的指针
while(p)//当结点不为空
{
if(p->trData==k)
{
printf("树中已有%d,不需要插入。
",k);
return;
}
else
{
f=p;
p=(ktrData)?
p->lchild:
p->rchild;//判断插入的数据的位置
}
}
p=(BtNode*)malloc(sizeof(BtNode));//分配空间
p->trData=k;
p->lchild=p->rchild=NULL;