C语言-数据结构-线性表检索和二分检索

#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef int datatype;
typedef struct
{
    datatype data[maxsize];  ///数组
    int len;   ///线性表长度
}seqlist;
///顺序查找
int seqsearch1(seqlist l,datatype key)
{
    ///记录线性表最后一个元素
    int k=l.len-1;
    while(k>=0&&l.data[k]!=key)
        k--;
    if(k>=0)
        return k;
    else
        return -1;
}
void display()
{
    seqlist l;
    int i=0,key,result;
    printf("Please input element:");
    while(1)
    {
        scanf("%d",&l.data[i]);
        i++;
        if(getchar()=='\n')
            break;
    }
    l.len=i;
    printf("please enter look up:");
    scanf("%d",&key);
    result=seqsearch1(l,key);
    if(result>=0)
       printf("key:%d",result+1);
    else
       printf("fail!");
}
///递归  顺序表l 顺序表长度n 查找的关键key
int seqsearch2(seqlist l,int n,datatype key)
{
    int k=0;
    if(n==-1)
        k=-1;
    else if(l.data[n]==key)
        k=n;
    else
        k=seqsearch2(l,n-1,key);
    return k;
}
void display2()
{
    seqlist l;
    int i=0,key,result;
    printf("Please input element:");
    while(1)
    {
        scanf("%d",&l.data[i]);
        i++;
        if(getchar()=='\n')
            break;
    }
    l.len=i;
    printf("please enter look up:");
    scanf("%d",&key);
    result=seqsearch2(l,i,key);
    if(result>=0)
       printf("key:%d",result+1);
    else
        printf("fail!");
}
///二分检索法
int binsearch(seqlist l,datatype key)
{
    int low=0,high=l.len-1,mid;
    while(low<=high)
    {
        mid=(low+high)/2;   ///二分
        if(l.data[mid]==key)
            return mid;     ///检索成功返回
        if(l.data[mid]>key)
            high=mid-1;   ///继续在前半部分二分检索
        else
            low=mid+1;     ///后半部分二分检索
    }
    //if(low>high)
    return -1;
}
void display3()
{
    seqlist l;
    int i=0,key,result;
    printf("Please input element:");
    while(1)
    {
        scanf("%d",&l.data[i]);
        i++;
        if(getchar()=='\n')
            break;
    }
    l.len=i;
    printf("please enter look up:");
    scanf("%d",&key);
    result=binsearch(l,key);
    if(result>=0)
       printf("key:%d\n",result+1);
    else
        printf("fail!");
}
///递归  顺序表l 关键字key 顺序表起点low 终点high
int binsearch2(seqlist l,datatype key,int low,int high)
{
    int mid;
    if(low>high)
        return -1;      ///检索不成功的出口条件
    else
    {
        mid=(low+high)/2;     ///二分
        if(l.data[mid]==key)
            return mid;
        if(l.data[mid]>key)
            return binsearch2(l,key,low,mid-1);   ///递归在前半部分检索
        else
            return binsearch2(l,key,mid+1,high);  ///后半部分检索
    }
}
void display4()
{
    seqlist l;
    int i=0,key,result;
    printf("Please input element:");
    while(1)
    {
        scanf("%d",&l.data[i]);
        i++;
        if(getchar()=='\n')
            break;
    }
    l.len=i;
    printf("please enter look up:");
    scanf("%d",&key);
    result=binsearch2(l,key,0,i-1);
    if(result>=0)
       printf("key:%d",result+1);
    else
        printf("fail!");
}
void myexit()
{
     int a;
     char ch;
     printf("\t是否确定退出?请选择 y or n:  ");
     getchar();
     ch=getchar();
     if(ch=='y'||ch=='Y')
        exit(0);
     else
       menu();
}
void menu()
{
    printf("\n\n\n\n");
    printf("\t\t\t\t* * * * * * * * * * 检索 * * * * * * * *  *\n");
    printf("\t\t\t\t*      0.退出                             *\n");
    printf("\t\t\t\t*      1.非递归检索                       *\n");
    printf("\t\t\t\t*      2.递归检索                         *\n");
    printf("\t\t\t\t*      3.非递归二分法检索                 *\n");
    printf("\t\t\t\t*      4.递归二分法检索                   *\n");
    printf("\t\t\t\t*      5.分块检索                         *\n");
    printf("\t\t\t\t* * * * * * * * * * * * * 强哥版权所有* * *\n\n");
    printf("\t\t\t\tChoose 0-6:");
}
int main()
{
    int n;
    menu();
    scanf("%d",&n);
    while(n)
    {
        system("cls");
        switch(n)
        {
            case 0:
                myexit();
                break;
            case 1:
                display();
                break;
            /*case 2:
                display2();
                break;
            case 3:
                display3();
                break;
            case 4:
                display4();
                break;
            case 5:
                break;
           default:break;*/
        }
       getch();
       menu();
       scanf("%d",&n);
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值