顺序表应用6:有序顺序表查询

本文介绍了一个使用二分查找算法在有序顺序表中进行查询的方法。文章详细解释了如何通过输入一组有序整数并针对这些整数进行多次查询,确定目标整数是否存在于表中,并返回其位置或未找到的消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序表应用6:有序顺序表查询

Time Limit: 7MS Memory limit: 700K

题目描述

顺序表内按照由小到大的次序存放着n个互不相同的整数(1<=n<=20000),任意输入一个整数,判断该整数在顺序表中是否存在。如果在顺序表中存在该整数,输出其在表中的序号;否则输出“No Found!"。

输入

 第一行输入整数n,表示顺序表的元素个数;
第二行依次输入n个各不相同的有序整数,代表表里的元素;
第三行输入整数t,代表要查询的次数;
第四行依次输入t个整数,代表每次要查询的数值。

输出

 输出t行,代表t次查询的结果,如果找到在本行输出该元素在表中的位置,否则本行输出No Found!

示例输入

10
1 22 33 55 63 70 74 79 80 87
4
55 10 2 87

示例输出

4
No Found!
No Found!
10

 

 

#include <stdio.h>
#include <stdlib.h>
#define maxsize 1000
typedef int element;

typedef struct
{
    element *elem;
    int length;
    int listsize;
}SqList;
void display(SqList * L);
int initList(SqList * L)
{
    L->elem = new element[maxsize];
    if(!L->elem) return -1;
    L->length = 0;
    L->listsize = maxsize;
    return 0;
}
void creat(SqList * L, int n)
{
    int i;
    for(i=0; i<n; i++)
        scanf("%d", &L->elem[i]);
    L->length =  n;
}


int binsearch(SqList * L, int s, int t, int m)//二分查找
{
    int low=s, high=t, mid;
    if(s<=t)
    {
        mid=low+(high-low)/2;
        if(L->elem[mid]==m)
        {
            printf("%d\n", mid+1);
            return 0;
        }
        if(L->elem[mid]>m)
            return binsearch(L, low, mid-1, m);
        else
            return binsearch(L, mid+1, high, m);
    }
    printf("No Found!\n");
}

 


int main()
{
    SqList L;
    int n, i, t, m;
    scanf("%d", &n);
    initList(&L);
    creat(&L, n);
    scanf("%d", &t);
    for(i=0;i<t;i++)
    {
        scanf("%d", &m);

        binsearch(&L, 0, n-1, m);

    }

 

    return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#define maxsize 20010
typedef int element;
typedef int status;
typedef struct
{
    element *elem;
    int length;
    int listsize;
} sqlist;

status initlist(sqlist &l)
{
    l.elem = new element[maxsize];
    if(!l.elem) exit(-1);
    l.length = 0;
    l.listsize = maxsize;
    return 0;
}
status create(sqlist &l, int n)
{
    int i;
    for(i=0; i<n; i++)
    {
        scanf("%d", &l.elem[i]);
    }
    l.length = n;
    return 0;
}

status loclist(sqlist &l, int le, int r, int key)
{
    while(le<=r)
    {
        int m = (le+r)/2;
        if(l.elem[m]==key)
        {
            printf("%d\n", m+1);
            return 0;
        }
        else if(l.elem[m]>key)
            r = m-1;
        else
            le = m+1;
    }
    printf("No Found!\n");

}
/*void display(sqlist &l)
{
    int i;
    for(i=0; i<l.length-1; i++)
    {
        printf("%d ", l.elem[i]);
    }
    printf("%d\n", l.elem[l.length-1]);
}*/
int main()
{
    int n, m, key;
    sqlist l;
    scanf("%d", &n);
    initlist(l);
    create(l, n);
    scanf("%d", &m);
    while(m--)
    {
        scanf("%d", &key);
        loclist(l, 0, n-1, key);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值