回 帖 发 新 帖 刷新版面

主题:[讨论]超级简单题目  有些小问题

折半查找:
        设有8个关键字序列k={ a1 , a2, a3 , a4 , a5 , a6 , a7 , a8 },使用数组作为存储方式,用折半查找法在序列中查找key= a2和key=b的数据元素(b不存在于k中),如果查找成功,则返回该元素的位置,如果查找不成功,则返回失败。
#define N 20
#include <stdio.h>
struct list
{int a[N];
 int length;
}*l;
int search_bin(struct list *l)
{int low=1,high=l->length,mid,m;
 printf("please input the elem you want search:\n");
  scanf("%d",&m);
 while(low<=high)
{
 mid=(low+high)/2;
 if(m==l->a[mid]) return mid;
 else
    {if(m<l->a[mid]) high=mid-1;
     else low=mid+1;}
 }
 return 0;
}
void create_2(struct list *l,int n)
{int i;
 l=(struct list*)malloc(sizeof(struct list));
 printf("please input ten sorted elem(value from low to high):\n");
 for(i=1;i<=n;i++)
 scanf("%4d",&l->a[i]);
}
void print_2(struct list *l)
{int i;
 printf("the elem of the list are:\n");
 for(i=1;i<=l->length;i++)
 printf("%4d",l->a[i]);}
main()
{struct list *l;
 int x;
 l=(struct list*)malloc(sizeof(struct list));
 l->length=8;
 create_2(l,l->length);
 print_2(l);
 x=search_bin(l);
 if(x!=0)printf("The position of this elem is %d\n",x);
 else printf("Can't find this elem in this list!\n");
 }运行时有问题,不知道错在哪儿?

回复列表 (共4个回复)

沙发

大家帮帮忙吧

板凳


首先你这里没有#include<stdlib.h>此头文件;(其他见代码中的注释)
#define N 20
#include <stdio.h>
#include<stdlib.h>
struct list
{int a[N];
 int length;
}*l;
int search_bin(struct list *l)
{
    int low=1,high=l->length,mid,m;
    printf("please input the elem you want search:\n");
    scanf("%d",&m);
    while(low<=high)
    {
       mid=(low+high)/2;
       if(m==l->a[mid])
           return mid;
       else
       {
           if(m<l->a[mid])
               high=mid-1;
           else
               low=mid+1;
       }
 }
    return 0;
}
void create_2(struct list *l,int n)
{
    int i;
 //   l=(struct list*)malloc(sizeof(struct list)); 这里不需要再动态分配一个空间了,分配了的话你开始设的l->length值就被释放了
    printf("please input ten sorted elem(value from low to high):\n");
//你要输入10个数怎么l->length=8呢??
    for(i=1;i<=n;i++)
    scanf("%d",&l->a[i]);//在输入的时候最好不要对他进行格式控制没必要
}
void print_2(struct list *l)
{
    int i;
    printf("the elem of the list are:\n");
    for(i=1;i<=l->length;i++)
    printf("%4d",l->a[i]);
    printf("\n");
}
void main()
{
    struct list *l;
    int x;
    l=(struct list*)malloc(sizeof(struct list));
    l->length=10;
    create_2(l,l->length);
    print_2(l);
    x=search_bin(l);
    if(x!=0)
        printf("The position of this elem is %d\n",x);
    else 
        printf("Can't find this elem in this list!\n");
 }

你这是在熟悉链表的用法吧,如果单纯的是折半查找,根本不用这么麻烦的

[em9][em9][em9]

3 楼

[quote]
首先你这里没有#include<stdlib.h>此头文件;(其他见代码中的注释)
#define N 20
#include <stdio.h>
#include<stdlib.h>
struct list
{int a[N];
 int length;
}*l;
int search_bin(struct list *l)
{
    int low=1,high=l->length,mid,m;
    printf("please input the elem you want search:\n");
    scanf("%d",&m);
    while(low<=high)
    {
       mid=(low+high)/2;
       if(m==l->a[mid])
           return mid;
       else
       {
           if(m<l->a[mid])
               high=mid-1;
           else
               low=mid+1;
       }
 }
    return 0;
}
void create_2(struct list *l,int n)
{
    int i;
 //   l=(struct list*)malloc(sizeof(struct list)); 这里不需要再动态分配一个空间了,分配了的话你开始设的l->length值就被释放了
    printf("please input ten sorted elem(value from low to high):\n");
//你要输入10个数怎么l->length=8呢??
    for(i=1;i<=n;i++)
    scanf("%d",&l->a[i]);//在输入的时候最好不要对他进行格式控制没必要
}
void print_2(struct list *l)
{
    int i;
    printf("the elem of the list are:\n");
    for(i=1;i<=l->length;i++)
    printf("%4d",l->a[i]);
    printf("\n");
}
void main()
{
    struct list *l;
    int x;
    l=(struct list*)malloc(sizeof(struct list));
    l->length=10;
    create_2(l,l->length);
    print_2(l);
    x=search_bin(l);
    if(x!=0)
        printf("The position of this elem is %d\n",x);
    else 
        printf("Can't find this elem in this list!\n");
 }

你这是在熟悉链表的用法吧,如果单纯的是折半查找,根本不用这么麻烦的

[em9][em9][em9][/quote]
提醒一句,这是简单的顺序表,哪来的链表?程序没有一个地方做关于指针运算,除了顺序表本身用了指向表的指针和一个错误的分配空间操作之外。
如果没有malloc那句stdlib.h就可以不用导入
还有scanf("%d",&l->a[i]);可以的话避免这种写法,同时作引用和取结构体指针的值这种写法很容易招致预料外的结果。
另外,lz的程序回避了a[0]的使用,应该是从别的语言里带来的习惯吧,但是这么做并不好,降低了系统效率,希望以后能加以改进

4 楼


太感谢各位了!!!!!!!![em12]

我来回复

您尚未登录,请登录后再回复。点此登录或注册