您的位置:首页 > 其它

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

2016-07-29 19:20 363 查看


这道题的算法思想就是利用二分查找来缩短查找的时间。

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define LISTSIZE 20000

typedef struct{

    int *elem;

    int length;

    int listsize;

}Sqlist;

int Initialist(Sqlist *L){

    L->elem=(int *)malloc(LISTSIZE*sizeof(Sqlist));

    if (!L->elem) exit(-1);

    L->length=0;

    L->listsize=LISTSIZE;

    return 1;

}

int Insertlist(Sqlist *L,int i,int e){

    if (i<1||i>L->length+1) printf("ERROR");

    int *q=&(L->elem[i-1]);

    int *p;

    for (p=&(L->elem[L->length-1]);p>=q;p--){

        *(p+1)=*p;

    }

    *q=e;

    L->length++;

    return 1;

}

int Querylist(Sqlist *A,int length,int a){/*利用二分查找进行比较*/

    int i=0,j=length-1,mid;

    while (i<=j){

        mid=(i+j)/2;

    if (a<A->elem[mid])

        j=mid-1;

    else if(a>A->elem[mid])

        i=mid+1;

    else if (a==A->elem[mid])

        return (mid+1);

    }

    return -1;

}

int main(){

    int i,j,n,m,d,k;

    Sqlist A;

    Initialist(&A);

    Sqlist B;

    Initialist(&B);

    scanf("%d",&n);

    for (i=1;i<=n;i++){

        scanf("%d",&d);

        Insertlist(&A,i,d);

    }

    scanf("%d",&m);

    for (i=1;i<=m;i++){

        scanf("%d",&d);

        Insertlist(&B,i,d);

    }

    for (i=0;i<B.length;i++){

        k=Querylist(&A,A.length,B.elem[i]);

        if (k==-1){

            if (i==B.length-1)

               printf("No Found!");

            else

               printf("No Found!\n");

        }

        else{

            if(i==B.length-1)

              printf("%d",k);

            else

              printf("%d\n",k);

        }

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: