数据结构--基本查找方法实现程序代…

本文深入探讨了数据结构和算法优化的关键概念和技术,通过实例分析了如何在实际编程中应用这些理论,以提高程序效率和解决问题的能力。

 

 

#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_numFBNQ的第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             设计日期:200793                            ",

                                        "\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);

                   }

}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值