建立顺序表,实现顺序查找,折半查找,递归折半查找

#include<iostream>
using namespace std;

const int MAXSIZE = 100;
typedef int KeyType;
struct datanode
{
    KeyType key;
//    char ch;
};

class Sqtable
{
private:
    datanode r[MAXSIZE];
    int n;
public:
    Sqtable(int nn);
    void Creat();
    void Output();
    void Sq_Search(KeyType K);
    void Binary_Search(KeyType K);
    void D_Search(int m, int k,KeyType K);
};

Sqtable::Sqtable(int nn)
{
    n = nn;
    for(int i=0; i<n; i++)
        r[i].key = 0;
}

void Sqtable::Creat()
{
    KeyType kk;
    cout<<"\n 输入第1个参数,以-1结束";
    cin>>kk;
    int i=0;
    while(kk!=-1 && i<n)
    {
        r[i].key = kk;
        i++;
        cout<<"\n 输入第"<<i+1<<"个参数,以-1结束";
        cin>>kk;
    }
}

void Sqtable::Output()
{
    int i=0;
    cout<<"\n";
    while(r[i].key!=0)
    {
        cout<<r[i].key<<"\t";
        i++;
    }
}

void Sqtable::Sq_Search(KeyType K)
{
    int i=0;
    while(r[i].key != K)
        i++;
    if(i<n)
    {
        cout<<"\n查找成功,在位置"<<i+1;
    }
    else
        cout<<"\n 查找失败";
}

void Sqtable::Binary_Search(KeyType K)
{
    int m,low,high,find;
    low = 0;
    high = n-1;
    find = 0;
    do
    {
        m = (low+high)/2;
        if(K==r[m].key)
        {
            cout<<"\n查找成功,该数据在位置:"<<m+1;
            find = 1;
        }
        else if(K<r[m].key)
            high = m-1;
        else
            low = m+1;
    }while(low<=high && find ==0);
    if(find == 0)
        cout<<"\n 查找失败";
}
void Sqtable::D_Search(int low,int high, KeyType K)
{
    int m = (low+high)/2;
    if(r[m].key==K)
        cout<<"\n查找成功,位置在:"<<m+1;
    else if(low==high && K!=r[m].key)
        cout<<"\n查找失败";
    else if(K<r[m].key)
        D_Search(low, m-1, K);
    else
        D_Search(m+1,high,K);
}

int main(int argc, char *argv[])
{
    int m,K,nn;
    cout<<"\n输入顺序表长度";
    cin>>nn;
    Sqtable ss(nn);
    cout<<"\n    1.建立顺序表";
    cout<<"\n    2.顺序查找";
    cout<<"\n    3.折半查找";
    cout<<"\n    4.递归折半查找";
    cout<<"\n    5.程序结束";
    cout<<"\n请输入你的选择(1,2,3,4,5)";
    cin>>m;
    while(m>0 && m<5)
    {
        switch(m)
        {
            case 1:
                ss.Creat();
                ss.Output();
                break;
            case 2:
                cout<<"\n请输入要查找的元素";
                cin>>K;
                ss.Sq_Search(K);
                break;
            case 3:
                cout<<"\n请输入要查找的元素";
                cin>>K;
                ss.Binary_Search(K);
                break;
            case 4:
                cout<<"\n请输入要查找的元素";
                cin>>K;
                ss.D_Search(0,nn-1,K);
                break;
            default:
                break;
        }
        cout<<"\n请输入你的选择(1,2,3,4,5)";
        cin>>m;
    }
    cout<<"\n程序结束";
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值