#include
#include
#include
#include
const int
MAXSIZE=31;
typedef
struct
//顺序表的定义
{ int
data[MAXSIZE];
int last;
}SeqList;
SeqList
List;
typedef
struct
//索引表的定义
{
int
M_value;
//最大值
int
StartAddress;
//起始地址
}IDTable;
IDTable
Id[MAXSIZE];
typedef
struct
BiTNode
{
int
data;
//数据元素
struct
BiTNode *Lchild,*Rchild; //左,右子树指针
}BiTNode,*BiTree;
void
main()
{
BiTree
bst_T,New_1;
char
button_1,button_2;
char
finddata;
void
ShowFace_1();
void
ShowFace_2();
void
ShowFace_3();
void
Found_List();
void
Show_List();
void
Seq_Search();
void
Binsearch();
void
Insert_Search();
void
FBNQ_Search();
void
Block_Search();
void
Del_List();
int
Fbnq(int num);
//BiTree
void
Insert_bst(BiTree &T,BiTree New);
BiTree
Creat_bst();
void
Show_PreOrder(BiTree T);
void
Search_bst(BiTree T,int finddata);
void
Del_bst(BiTree T,int c);
ShowFace_1();
//开始界面(face_1)
while(1){
cout<<"请选择操作项:";
cin>>button_1;
if(button_1=='0')
break;
switch(button_1)
{
case '1':
ShowFace_2(); //功能界面(face_2)
while(1){
cout<<"请选择操作项:";
cin>>button_2;
if(button_2=='0')
break;
switch(button_2)
{ case
'1':
Found_List();
break;
//创建数据
case
'2':
Show_List();
break;
//输出数据
case
'3':
Seq_Search();
break;
//顺序查找
case
'4':
Binsearch();
break;
//折半查找
case
'5':
Insert_Search();
break;
//插入查找
case
'6':
FBNQ_Search();
break;
//斐波那契查找
case '7':
Block_Search();
break;
//分块查找
case '8':
Del_List();
break;
//删除数据
case '9':
system("cls");
ShowFace_2();
break;
default :
cout<<"输入操作错误!!!"<<endl;
cout<<"请重新输入:";
}
}
ShowFace_1();break;
case '2': ShowFace_3();
//功能界面(face_3)
while(1){
cout<<"请选择操作项:";
cin>>button_2;
if(button_2=='0')
break;
switch(button_2)
{ case
'1':
bst_T=Creat_bst();
break;
//创建二叉树
case
'2':
Show_PreOrder(bst_T);
break;
//输出二叉树
case
'3':
cout<<"请输入插入数据:";
cin>>finddata;
New_1=(BiTree)malloc(sizeof(BiTNode));
New_1->data=finddata;
New_1->Lchild=New_1->Rchild=NULL;
Insert_bst(bst_T,New_1);
break;
//插入查找
case
'4':
cout<<"请输入查找数据:";
cin>>finddata;
Search_bst(bst_T,finddata);
break;
//查找
case
'5':
cout<<"请输入删除数据:";
cin>>finddata;
Del_bst(bst_T,finddata);
break;
//删除查找
case
'6':
system("cls");
ShowFace_3();
break;
//清零
default :
cout<<"输入操作错误!!!"<<endl;
cout<<"请重新输入:";
}
}
ShowFace_1();break;
//中级查找
default :
cout<<"输入操作错误!!!"<<endl;
cout<<"请重新输入:";
}
}
return;
}
void
Found_List(){
cout<<"请输入输入数据个数:";
cin>>List.last;
cout<<"请输入一组数据(以空格分开):"<<endl;
for(int i=1;i<=List.last;i++)
cin>>List.data[i];
}
void
Del_List(){
char
ch;
cout<<"你是否确定删除该数据表?(y/n)"<<endl;
while(1){
cin>>ch;
if(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n'){
cout<<"输入错误!!!"<<endl;
cout<<"请重新输入:";
break;
}
else{
if(ch=='Y'||ch=='y'){
cout<<"如果删除就不能恢复,你确定(y/n)?";
cin>>ch;
if(ch=='N'||ch=='n'){cout<<"删除失败!!!"<<endl;
return;}
else
cout<<"删除成功!!!"<<endl;
free(List.data);
//有问题啊!!!!!!!!!!!!!!
return;}
if(ch=='N'||ch=='n') cout<<"删除失败!!!"<<endl;
return;
}
}
}
void
Show_List(){
for(int
i=1;i<=List.last;i++)
cout<<List.data[i]<<"
";
cout<<endl;
}
void
Seq_Search(){
int finddata,count;
cout<<"请输入查找数据:";
cin>>finddata;
List.data[0]=finddata;
//起用哨兵元素
count=List.last;
while(finddata!=List.data[count])
count--;
if(count){
cout<<"找到了!!!"<<endl;
cout<<"该数据的位置是:"<<count;
//count为查找数据位置
for(count=count-1;count>0;count--){
if(finddata==List.data[count])
cout<<"
"<<count;
}
cout<<endl;
return;
}
else cout<<"查找失败!!!"<<endl;
}
void
Binsearch(){
int
low=1,high=List.last;
//设置初始区间
int mid,finddata;
cout<<"请输入查找数据:";
cin>>finddata;
while(1){
if(low>high)
{cout<<"查找失败!!!"<<endl;
return;}
else{
mid=(low+high)/2;
if(finddata==List.data[mid]){
cout<<"找到了!!!"<<endl;
//查找成功
cout<<"数据位置是:"<<mid<<endl; return;
}
if(finddata>List.data[mid])
low=mid+1;//查找在右半区进行
if(finddata
high=mid-1;//查找在左半区进行
}
}
}
void
Insert_Search(){
int
low=1,high=List.last;
//设置初始区间
int mid,finddata;
cout<<"请输入查找数据:";
cin>>finddata;
while(1){
if(low>high)
{cout<<"查找失败!!!"<<endl;
return;}
else{
mid=low+(finddata-List.data[low])/(List.data[high]-List.data[low])*(high-low);
if(finddata==List.data[mid]){
cout<<"找到了!!!"<<endl;
//查找成功
cout<<"数据位置是:"<<mid<<endl; return;
}
if(finddata>List.data[mid])
low=mid+1;//查找在右半区进行
if(finddata
high=mid-1;//查找在左半区进行
}
}
}
int
Fbnq(int num){
int
value=1;
if(num==1||num==2) return
value;
//返回Fbnq的值
else
return
Fbnq(num-1)+Fbnq(num-2);
//递归调用
}
void
FBNQ_Search(){
int
F_num=1,F_len,F_mid;//F_num为FBNQ的第F_num位,F_len为查找的表的长度
int
low=1,mid,high,finddata,x;
while(Fbnq(F_num)-1!=List.last){
if(Fbnq(F_num)-1
//是否符合FBNQ查找
else
//if(Fbnq(F_num)-1>List.last)
{cout<<"该组数据不能使用FBNQ查找!!!"<<endl;
return;}
}
cout<<"该组数据能使用FBNQ查找!!!"<<endl;
cout<<"请输入查找数据:";
cin>>finddata;
high=Fbnq(F_num)-1;
F_len=Fbnq(F_num)-1;F_mid=Fbnq(F_num-1)-1;//F_len为表长,F_mid为取中点的相对偏移量
while(1){
if(low>high) {cout<<"查找失败!!!"<<endl;
return;}
else{
mid=low+F_mid;
//取中点
if(finddata==List.data[mid]){
cout<<"找到了!!!"<<endl;
//查找成功
cout<<"数据位置是:"<<mid<<endl; return;
}
if(finddata>List.data[mid]){
F_len=F_len-F_mid-1;
//调整表长F_len
F_mid=F_mid-F_len-1; //计算取占点的相对偏移量
low=mid+1;//查找在右半区进行
}
if(finddata
x=F_mid;F_mid=F_len-F_mid-1;
F_len=x;
high=mid-1;//查找在左半区进行
}
}
}
}
void
Block_Search(){
int
Max=0,k=0,Id_c;
//Max为每组最大数据
k为索引表的长度 Id_c为索引表每组数据个数
int
low1,high1;
int
low2,high2;
int
mid,finddata;
cout<<"请输入索引表每组数据个数:";
cin>>Id_c;
for(int i=1;i<=List.last;i++)
if(i%Id_c==1){
k++;
Id[k-1].StartAddress=i;
}
for(i=0;i
for(int j=1+Id_c*i;j<=Id_c*(i+1);j++)
if(Max
Id[i].M_value=Max;
}
cout<<"请输入查找数据:";
cin>>finddata;
low1=0;high1=k-1;
while(low1<=high1){
mid=(low1+high1)/2;
if(finddata<=Id[mid].M_value) high1=mid-1;
else low1=mid+1;
}
if(low1
low2=Id[low1].StartAddress;
if(low1==k-1)
high2=List.last-1;
else
high2=Id[low1+1].StartAddress-1;
}
for(i=low2;i<=high2;i++)
if(List.data[i]==finddata){
cout<<"找到了!!!"<<endl;
//查找成功
cout<<"数据位置是:"<<i<<endl;
return;
}
cout<<"查找失败!!!"<<endl;
return;
}
//BiTree
void
Insert_bst(BiTree &T,BiTree New){
//递归算法:将指针New所指的结点插入二叉排序树T中
if(T==NULL) {T=New; cout<<"插入成功!!!"<<endl; }
else if(New->data==T->data){
cout<<"该数据已存在!!!"<<endl; return; }
else
if(New->datadata)
Insert_bst(T->Lchild,New);
else
Insert_bst(T->Rchild,New);
}
BiTree
Creat_bst(){
//输入一串以'#'结束的字符序列,建立二叉排序树
BiTree
New;
BiTree
T=NULL;
int
k;
cout<<"输入数据(以'-1'结束):";
cin>>k;
while(k!=-1){
New=(BiTree)malloc(sizeof(BiTNode));
New->data=k;
New->Lchild=New->Rchild=NULL;
//T=
Insert_bst(T,New);
cin>>k;
}
return
T;
}
void
Show_PreOrder(BiTree T){
//先序遍历二叉树T
if(T==NULL){cout<<'#'<<' ';
return;}
//递归调用的结束条件
cout<<T->data<<'
';
//访问结点的数据域
Show_PreOrder(T->Lchild);
Show_PreOrder(T->Rchild);
}
void
Search_bst(BiTree T,int finddata){
//在二叉树T中查找值为finddata的结点,查找成功,返回指向该结点的指针,否则返回NULL
if(!T) {
cout<<"查找失败!!!"<<endl;
return;}
else
if(!T&&T->data==finddata){cout<<"查找成功!!!"<<endl;
return;}
else
if(finddatadata)
Search_bst(T->Lchild,finddata);
else
Search_bst(T->Lchild,finddata);
}
void
Del_bst(BiTree T,int
c){
//c为删除数据
//在二叉排序树中删除一个结点
BiTree
f,p,q,s;
if(!T)
return;
else{
p=T;
while(p){
//找值为c的结点*p和其双亲结点*f
f=p;
if(p->data==c)
break;
else if(cdata)
p=p->Lchild;
else
p=p->Rchild;
if(!p) return;
if(!p->Lchild){
/
void
ShowFace_1(void){
char *
string[]={"",
"\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓",
"\t┃
┏┯┓┏┯┓┏┯┓┏┯┓┏┯┓┏┯┓┏┯┓
┃",
"\t┃
┠数┨┠据┨┠结┨┠构┨┠双┨┠语┨┠班┨
┃",
"\t┃
┗┷┛┗┷┛┗┷┛┗┷┛┗┷┛┗┷┛┗┷┛
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
***查找技术的综合***
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
******欢迎使用******
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
本程序介绍
┃",
"\t┃
程序目的:熟悉各种查找的操作
┃",
"\t┃
设计日期:2007年9月3日
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
1.初级查找(Primary
Seeking)
┃",
"\t┃
2.中级查找(Middle
Seeking)
┃",
"\t┃
0.退出(Exit)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
¤ ╭⌒╮ ╭⌒╮
┃",
"\t┃
╱◥██◣╭╭ ⌒╮
数据结构 作品展示
┃",
"\t┃
︱田︱田田|╰----------------------------------
┃",
"\t┃
╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
┃",
"\t┃
┃",
"\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"};
system("cls");
//清屏
for(int
i=24;i>0;i--){
//将界面由上到下输出
system("cls");
//清屏
for(int
j=i;j<24;j++)
//内循环执行完再暂停
cout<<string[j]<<endl;
Sleep(5);
}
}
void
ShowFace_2(void){
char * string[]={"",
"\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓",
"\t┃
初级查找技术(Primary
Searching)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
//主要是基于初级查找的
"\t┃
1.创建数据表(Found data
List)
┃",
//顺序存储的查找技术的
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
//操作
"\t┃
2.显示数据表(Show data
List)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
3.顺序查找(Sequential
Search)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
4.有序表的折半查找(Binsearch)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
5.有序表的插入查找(Insert
Search)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
6.斐波那契查找(FBNQ
Search)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
7.分块查找(Block
Search)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
8.删除数据表(Del data
List)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
9.清屏(Clear
Screen)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
0.退出(Exit)
┃",
"\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"};
system("cls");
for(int i=24;i>0;i--){
system("cls");
for(int j=i;j<24;j++)
cout<<string[j]<<endl;
Sleep(10);
}
}
void
ShowFace_3(void){
char * string[]={"",
"\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓",
"\t┃
中级查找技术(Middle
Searching)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
1.创建二叉树(Found
Binary
Tree)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
2.显示二叉树(Show
Binary
Tree)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
3.插入数据(Insert
Data)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
4.查找(Searching)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
5.删除数据(Delete
Data)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
6.清屏(Clear
Screen)
┃",
"\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫",
"\t┃
0.退出(Exit)
┃",
"\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"};
system("cls");
for(int i=18;i>0;i--){
system("cls");
for(int j=i;j<18;j++)
cout<<string[j]<<endl;
Sleep(10);
}
}