初学数据结构——查找的基本操作

获取数据没有采用控制台输入,即顺序表和二叉排序树数据的获取参考:
https://blog.csdn.net/zss192/article/details/106713108

#include 
#include 
#include 
#include 
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100

typedef int Status;
using namespace std;
int m=0; //用来记录二叉排序树的查找次数
int k=-1;//二叉排序树的初始化计数
typedef struct
{
    int key;
}ElemType;

//-----------------折半查找---------------------
//顺序表
typedef struct
{
    ElemType *R;       //存储空间基地址
    int length;   //当前长度
}SSTable;

//创建顺序表
void CreateList(SSTable &ST)
{
    ST.R=new ElemType[MAXSIZE];
    if(!ST.R)
        exit(OVERFLOW);
    ST.length=12;
    int a[12]={1,15,20,26,30,37,45,52,61,68,79,81};
    cout<<"有序线性表创建成功,其数值为:";
    for(int i=1;i<=ST.length;i++)    //0号单元空出,从下标1开始存储
    {
        ST.R[i].key=a[i-1];    //设置初始顺序表数值
        cout<<ST.R[i].key<<" ";
    }
    cout<<endl;
}

//在有序表ST中查找元素key的位置
void Search_Bin(SSTable ST,int key)
{
    int low=1,high=ST.length,mid;  //0号单元不使用,low从1开始
    int n=0;//查找次数
    bool isHave=false;//用来记录是否查找到
    while(low<=high)
    {
        mid=(low+high)/2;
        n++;
        if(key==ST.R[mid].key)
        {
            cout<<"元素"<<key<<"为第"<<mid<<"个元素,共查找了"<<n<<"次"<<endl;
            isHave=true;
            break;
        }
        else if(key<ST.R[mid].key)
            high=mid-1;
        else
            low=mid+1;
    }
    if(!isHave)
        cout<<"元素"<<key<<"不在有序表中,共查找了"<<n<<"次"<<endl;
}
//----------------二叉排序树------------------
//二叉链表存储表示
typedef struct
{
    string key;
    int position;   //结点位置
}ElemType1;

typedef struct BSTNode
{
    ElemType1 data;           //数据域
    struct BSTNode *lchild,*rchild;  //左右孩子指针
}BSTNode,*BSTree;


//创建二叉排序树
void CreateBST(BSTree &T)
{
    string ch[13]={"46","22","12","#","#","35","#","#","50","#","90","#","#"};
    k+=1;
    if(ch[k]=="#")
        T=NULL;
    else
    {
        T=new BSTNode;
        T->data.key=ch[k];
        CreateBST(T->lchild);    //递归创建左子树
        CreateBST(T->rchild);    //递归创建右子树
    }
}

//中序遍历
void InOrderTraverse(BSTree T)
{
    if(T)
    {
        InOrderTraverse(T->lchild); //中序遍历左子树
        cout<<T->data.key<<" ";     //访问根节点
        T->data.position=m;         //遍历过后能为结点的position赋初值
        m++;
        InOrderTraverse(T->rchild); //中序遍历右子树
    }
}

//在根指针T所指二叉排序树中递归的查找某关键字等于key的元素,
//查找成功则返回指向该数据元素节点的指针,否则返回空指针
BSTree SearchBST(BSTree T,string key)
{
    m++;
    if((!T)|| key==T->data.key)
        return T;
    else if(key<T->data.key)
        return SearchBST(T->lchild,key);
    else
        return SearchBST(T->rchild,key);
}

//------------------顺序查找-----------------------
void Search_Seq(SSTable ST,int key)
{
    bool isHave=false;//用来记录是否查找到
    for(int i=ST.length;i>=1;i--)
    {
        if(ST.R[i].key==key)
        {
            cout<<"元素"<<key<<"为第"<<i<<"个元素,共查找了"<<i<<"次"<<endl;
            isHave=true;
            break;
        }
    }
    if(!isHave)
        cout<<"元素"<<key<<"不在有序表中,共查找了"<<ST.length<<"次"<<endl;
}

//------------------分块查找----------------------
//创建块间有序块内无序的顺序表
void CreateList1(SSTable &ST)
{
    ST.R=new ElemType[MAXSIZE];
    if(!ST.R)
        exit(OVERFLOW);
    ST.length=18;
    int a[18]={22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,49,86,53};
    cout<<"有序线性表创建成功,其数值为:";
    for(int i=1;i<=ST.length;i++)    //0号单元空出,从下标1开始存储
    {
        ST.R[i].key=a[i-1];    //设置初始顺序表数值
        cout<<ST.R[i].key<<" ";
    }
    cout<<endl;
}

//索引表
typedef struct IndexType
{
    int key;
    int link;       //指向分块的起始下标
}IDX[MAXSIZE];

void IdxSearch(IDX I,int m,SSTable ST,int key)    //分块查找算法
{//m是块个数,n是顺序表的长度
    int n=ST.length;

    //count1为累计在索引表中的比较次数,count2为累计在顺序表对应块中的比较次数
    int low=0,high=m-1,mid,i,count1=0,count2=0;

    int b=n/m;              //b为块大小

    //在索引表中进行折半查找,找到的位置存放在low中
    while(low<=high)
    {
        mid=(low+high)/2;
        count1++;
        if(I[mid].key>=key)
            high=mid-1;
        else
            low=mid+1;
    }
    if(low<m)              //在索引表中查找成功后,再在线性表中进行顺序查找
    {
        i=I[low].link;
        while(i<=I[low].link+b-1 && ST.R[i].key!=key)
        {
            i++;
            count2++;
        }
        if (i<=I[low].link+b-1)
        {
            cout<<"元素"<<key<<"为第"<<i<<"个元素,共查找了"<<count1+count2<<"次"<<endl;
        }
        else
            cout<<"元素"<<key<<"不在有序表中,共查找了"<<count1+count2<<"次"<<endl;
    }
    else
        cout<<"元素"<<key<<"不在有序表中,共查找了"<<count1+count2<<"次"<<endl;
}

void show()
{
    string s1(80,'*');
    string s2(20,'*');
    cout<<s1<<endl;
    cout<<s2<<left<<setw(40)<<"1.创建有序线性表"<<s2<<endl;
    cout<<s2<<left<<setw(40)<<"2.创建块间有序块内无序的线性表"<<s2<<endl;
    cout<<s2<<left<<setw(40)<<"3.创建二叉排序树"<<s2<<endl;
    cout<<s2<<left<<setw(40)<<"4.折半查找"<<s2<<endl;
    cout<<s2<<left<<setw(40)<<"5.二叉排序树查找"<<s2<<endl;
    cout<<s2<<left<<setw(40)<<"6.分块查找"<<s2<<endl;
    cout<<s2<<left<<setw(40)<<"7.顺序查找"<<s2<<endl;
    cout<<s2<<left<<setw(40)<<"8.退出"<<s2<<endl;
    cout<<s1<<endl;
    cout<<"请输入您的选择:";

}
int main()
{
    SSTable ST,ST1; //顺序表
    BSTree T;  //二叉排序树
    IDX I;
    int key;
    string key1;

    show();
    int x;
    cin>>x;
    while(1)
    {
        switch(x)
        {
            case 1:
                CreateList(ST);
                cout<<endl;
                break;
            case 2:
                CreateList1(ST1);
                cout<<endl;
                break;
            case 3:
                CreateBST(T);
                cout<<"创建成功!"<<endl;
                cout<<"中序遍历结果为:";
                InOrderTraverse(T);
                cout<<endl;
                break;
            case 4:
                cout<<"请输入要查找的元素:";
                cin>>key;
                Search_Bin(ST,key);
                cout<<endl;
                break;
            case 5:
                cout<<"请输入要查找的元素:";
                cin>>key1;
                m=0;
                if(!SearchBST(T,key1))
                    cout<<"元素"<<key1<<"不在有序表中,共查找了"<<m<<"次"<<endl;
                else
                    cout<<"按照中序遍历的顺序排序后,元素"<<key1<<"为第"<<SearchBST(T,key1)->data.position+1<<"个元素,共查找了"<<m<<"次"<<endl;
                cout<<endl;
                break;
            case 6:
                cout<<"请输入要查找的元素:";
                cin>>key;
                I[0].key=22;I[0].link=1;
                I[1].key=48;I[1].link=7;
                I[2].key=86;I[2].link=13;
                IdxSearch(I,3,ST1,key);
                cout<<endl;
                break;
            case 7:
                cout<<"请输入要查找的元素:";
                cin>>key;
                Search_Seq(ST,key);
                cout<<endl;
                break;
            case 8:
                return 0;
            default:
                cout<<"输入不合法,请重新输入。"<<endl;
        }
        cout<<"请输入您的选择:";
        cin>>x;
    }
    return 0;
}

测试用例:
初学数据结构——查找的基本操作_第1张图片

你可能感兴趣的:(数据结构)