查找,这个程序为什么折半查找和二叉排序树查找输出错误

#include<stdio.h>

#include<stdlib.h>

typedef struct

{

    int key;

    float weight;

}elemtype;

typedef struct{

    elemtype *elem;

    int length;

}sstable;

#define overflow -2

#define max 5

#define false 0

 

typedef int keytype;

typedef elemtype bitelemtype;

typedef struct bitnode

{

bitelemtype data;

bitnode *lchild;

bitnode *rchild;

}bitnode;

typedef bitnode *bitree;

int eq(int a,int b)

{

    if (a==b)return 1;

    else return 0;

}

int searchseq(sstable st,keytype key)

{ int i;

    st.elem[0].key=key;

    for(i=st.length;!eq(st.elem[i].key,key);i--);

    return i;

}

int lt(int a,int b)

{

    if(a<b) return 0;

    else return 1;

}

int searchbin(sstable st,keytype key){

    int low,high,mid;

    low=1;high=st.length;

    while(low<=high)

    {

        mid=(low+high)/2;

        if(eq(key,st.elem[mid].key))return mid;

        else if(lt(key,st.elem[mid].key))high=mid-1;

        else low=mid+1;

    }

    return 0;

}

bitree searchbit1(bitree t,keytype key)

{if(!t||eq(key,t->data.key))return(t);

else if (lt(key,t->data.key)) return(searchbit1(t->lchild,key));

else return(searchbit1(t->rchild,key));

}

int create(sstable &t,int n)

{

    int i,a;

    float b;

    t.elem=(elemtype*)malloc((n+1)*sizeof(elemtype));

    if(!(t.elem))

    exit(overflow);

    for(t.length=0,i=1;i<=n;i++)

    {

        scanf("%d,%f",&a,&b);

        t.elem[i].key=a;

        t.elem[i].weight=b;

        t.length++;

    }

}

int searchbit2(bitree bst,keytype key,bitree f,bitree p)

{

    if(!bst)

    {

        p=f;

        return false;

    }

    else if(eq(key,bst->data.key))

    {

        p=bst;

        return true;

    }

    else if(lt(key,bst->data.key))

    return searchbit2(bst->lchild,key,bst,p);

    else return searchbit2(bst->rchild,key,bst,p);

 } 

int insertbit(bitree &bst,elemtype e)

{

    bitree p,s;

    if(!searchbit2(bst,e.key,NULL,p))

    {

        s=(bitree)malloc(sizeof(bitnode));

        s->data=e;

        s->lchild=s->rchild=NULL;

        if(!p)

        bst=s;

        else if(lt(e.key,p->data.key))

        p->lchild=s;

        else p->rchild=s;

        return 1;

    }

    else return false;

};

int createbitree(bitree &bst,sstable t)

{

    int i;

    bst=NULL;

    if(t.length)

    {

        for(i=1;i<=t.length;i++)

        insertbit(bst,t.elem[i]);

    }

    return 1;

}

int main()

{

    sstable t;

    bitree bst;

    keytype key;

    create(t,max);

    scanf("%d",&key);

    searchseq(t,key);

    printf("%d",searchseq(t,key));

    searchbin(t,key);

    printf("%d",searchbin(t,key));

    createbitree(bst,t);

    searchbit1(bst,key)==NULL?printf("不 在"):printf("zai");

    return 0;

}

参考GPT和自己的思路:

折半查找和二叉排序树查找输出错误的问题可能出现在以下几个方面:

  1. 数据输入错误:程序中使用create函数读取数据,如果输入的数据不符合要求(如数据类型不匹配、缺少逗号等),可能会导致程序出错。

  2. 数组越界:在searchseq函数中,当查找不到对应的元素时,i会变成0,但是数组下标是从1开始的,如果直接返回i,可能会导致数组越界。

  3. searchbin函数中的返回值错误:当查找不到对应的元素时,searchbin函数返回的是0,但是0可能是查找到的元素的下标,这样可能会导致程序输出错误的结果。

  4. insertbit函数中的返回值错误:在insertbit函数中,当插入成功时,返回的是1,但是返回值应该是true(即非0),因为在main函数中使用的是三目运算符判断结果非0表示查找成功。

  5. searchbit1函数中的逻辑错误:在searchbit1函数中,eq、lt函数的返回值取反了,导致查找结果相反。应该把eq函数返回1表示相等,lt函数返回0表示小于。

以上这些问题需要具体情况具体分析和调试,才能保证程序正确运行。