dasusu 2015-06-19 13:55 采纳率: 66.7%
浏览 1763
已采纳

我是初学,一个关于顺序查找和折半查找的算法有错,求解答

```#include
#define Max 256

typedef struct Keylist
{
int key[Max];
int len;
}Keylist;

void creatKlist(Keylist L)
{
int i=0;
printf("**建立静态表**\n");
printf("你需要构建多少个数据,请输入:");
scanf("%d",&L.len);
printf("\n");
for(i=0;i<L.len;i++)
{
printf("请输入100以内的数据\n");
scanf("%d",&L.key[i]);
}
}

Keylist sort(Keylist L)
{
int i,t;
for(i=0;i {
if(L.key[i]>L.key[i+1])
{
t=L.key[i];
L.key[i+1]=L.key[i];
L.key[i]=t;
}
}
return L;
}

int Seqsearch(Keylist L,int k)
{
int i;
for(i=L.len;L.key[i]!=k;i--)
return i;
}

int *Binsearch(Keylist L,int k)
{
int high=L.len,low=1,mid;
int a[1];
while(low<=high)
{
mid=(low+high)/2;
if(L.key[mid]==k)
{
a[0]=mid;
return a;
}
else if(L.key[mid]<k)
{
low=mid+1;
a[1]++;
}
else
{
high=mid-1;
a[1]++;
}
}
return a;
}

void main()
{
Keylist L;
int a[1];
creatKlist(L);
int k,i,choice;
printf("请输入你想要执行的操作序号:\n");
printf("1.顺序查找\n2.折半查找\n");
scanf("%d",&choice);
switch(choice)
{
printf("请输入关键码:\n");
scanf("%d,&k");
case'1':
i=Seqsearch(L,k);
printf("顺序查找只有一次\n");
if(i!=0)
printf("关键码的位置是第%d个",i);
if("i=0")
printf("关键码不存在!");
break;
case'2':
a=Binsearch(L,k);
printf("折半查找位置在%d\n",a[0]);
printf("总共找了%d次\n",a[1]);
break;
default:
printf("输入错误!结束进程!");
break;
}
return ;
}


  • 写回答

4条回答 默认 最新

  • shanql 2015-06-19 17:04
    关注

    #include
    #define Max 256
    typedef struct Keylist
    {
    int key[Max];
    int len;
    }Keylist;
    //void creatKlist( Keylist L)
    void creatKlist( Keylist* L)
    {
    int i=0;
    printf("**建立静态表**\n");
    printf("你需要构建多少个数据,请输入:");
    scanf("%d",&L->len);
    printf("\n");
    for(i=0;ilen;i++)
    {
    printf("请输入100以内的数据\n");
    scanf("%d",&L->key[i]);
    }
    }

    //这个函数如果是想用来排序,显然是不对的哦
    Keylist sort(Keylist L)
    {
    int i,t;
    //for(i=0;i {
    for(i=0;i < L.len; ++i )
    {
    if(L.key[i]>L.key[i+1])
    {
    t=L.key[i];
    L.key[i+1]=L.key[i];
    L.key[i]=t;
    }
    }
    return L;
    }
    //int Seqsearch(Keylist L,int k)
    int Seqsearch(Keylist* L,int k)
    {
    // int i;
    // for(i=L->len;L->key[i]!=k;i--)
    // return i;
    int i;
    for(i=L->len-1;L->key[i]!=k && i >= 0;i--)
    ;
    return i;
    }

    //int Binsearch(Keylist L,int k)
    int *Binsearch(Keylist
    L,int k)
    {
    //int high=L->len,low=1,mid;
    int high = L->len-1,low=0,mid;
    //int a[1];
    int* a = new int[2];
    a[0] = 0;
    a[1] = 0;
    while(low<=high)
    {
    mid=(low+high)/2;
    if(L->key[mid]==k)
    {
    a[0]=mid;
    return a;
    }
    else if(L->key[mid]<k)
    {
    low=mid+1;
    a[1]++;
    }
    else
    {
    high=mid-1;
    a[1]++;
    }
    }
    return a;
    }
    void main()
    {
    Keylist L;
    //int a[1];
    int* a = NULL;

    //creatKlist( L );
    creatKlist( &L );
    int k,i,choice;
    printf("请输入你想要执行的操作序号:\n");
    printf("1.顺序查找\n2.折半查找\n");
    scanf("%d",&choice);
    printf("请输入关键码:\n");
    //scanf("%d,&k");
    scanf("%d", &k);
    switch(choice)
    {
    

    // printf("请输入关键码:\n");
    // scanf("%d,&k");
    // case'1':
    case 1:
    //i=Seqsearch(L,k);

        i=Seqsearch(&L,k);
        printf("顺序查找只有一次\n");
        //if(i!=0)
        if ( i != -1 )
            printf("关键码的位置是第%d个",i+1);
        //if("i=0")
        else
            printf("关键码不存在!");
        break;
    //case'2':
    case 2:
        //a=Binsearch(L,k);
        a=Binsearch(&L,k);
        printf("折半查找位置在%d\n",a[0]+1);
        printf("总共找了%d次\n",a[1]+1);
        break;
    default:
        printf("输入错误!结束进程!");
        break;
    }
    
    //释放内存
    if ( NULL != a )
    {
        delete[] a;
        a = NULL;
    }
    return ;
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值