在C程序中不工作的搜索函数在二叉树上执行函数

在C程序中不工作的搜索函数在二叉树上执行函数,c,struct,tree,binary,C,Struct,Tree,Binary,我一直在尝试让这个搜索函数工作,但它说即使元素在树中也找不到元素。其他所有功能都可以工作 #include<stdio.h> #include<stdlib.h> struct node { struct node *lchild; int info; struct node *rchild; }; int flag; struct node *root = NULL; struct node *insert(struct

我一直在尝试让这个搜索函数工作,但它说即使元素在树中也找不到元素。其他所有功能都可以工作

#include<stdio.h>
#include<stdlib.h>

struct node
{
        struct node *lchild;
        int info;
        struct node *rchild;
};
int flag;
struct node *root = NULL;
struct node *insert(struct node *ptr, int ikey);
void in_order_search(struct node *ptr, int val);
void display(struct node *ptr,int level);

int main( )
{
        struct node *root=NULL,*ptr;
        int choice,k,v;

        while(1)
        {
                printf("\n");
                printf("1.Insert\n");
                printf("2.Display\n");
                printf("3.Search\n");
                printf("\nEnter your choice : ");
                scanf("%d",&choice);

                switch(choice)
                {
                case 1:
                        printf("\nEnter the key to be inserted : ");
                        scanf("%d",&k);
                        root = insert(root, k);
                        break;

                case 2:
                        printf("\n");
                        display(root,0);
                        printf("\n");
                        break;

                case 3:
                        printf("\nEnter the key to be searched : ");
                        scanf("%d",&v);
                        in_order_search(root, v);
                        if (flag==1)
                        {
                            printf("Element present in the binary tree\n");
                        }
                        else
                        {
                            printf("Element not present in the binary tree\n");
                        }
                        break;
                 default:
                        exit(1);
                }
        }

        return 0;

}


struct node *insert(struct node *ptr, int ikey )
{
        if(ptr==NULL)
        {
                ptr = (struct node *) malloc(sizeof(struct node));
                ptr->info = ikey;
                ptr->lchild = NULL;
                ptr->rchild = NULL;
        }
        else if(ikey < ptr->info) /*Insertion in left subtree*/
                ptr->lchild = insert(ptr->lchild, ikey);
        else if(ikey > ptr->info) /*Insertion in right subtree */
                ptr->rchild = insert(ptr->rchild, ikey);
        else
                printf("\nDuplicate key\n");
        return ptr;
}

void in_order_search(struct node *ptr, int val)
{
    if (!ptr)
    {
        return;
    }
    in_order_search(ptr->lchild, val);
    if(ptr->lchild == val)
    {
        printf("\nElement present in the binary tree.\n");
        flag = 1;
    }
    in_order_search(ptr->rchild, val);


}

void display(struct node *ptr,int level)
{
        int i;
        if(ptr == NULL )
                return;
        else
    {
                display(ptr->rchild, level+1);
                printf("\n");
                for (i=0; i<level; i++)
                        printf("    ");
                printf("%d", ptr->info);
                display(ptr->lchild, level+1);
        }
}
#包括
#包括
结构节点
{
结构节点*lchild;
国际信息;
结构节点*rchild;
};
int标志;
结构节点*root=NULL;
结构节点*插入(结构节点*ptr,int-ikey);
按顺序搜索时无效(结构节点*ptr,int val);
无效显示(结构节点*ptr,整数级);
int main()
{
结构节点*root=NULL,*ptr;
整数选择,k,v;
而(1)
{
printf(“\n”);
printf(“1.插入\n”);
printf(“2.显示\n”);
printf(“3.Search\n”);
printf(“\n输入您的选择:”);
scanf(“%d”,选择(&C);
开关(选择)
{
案例1:
printf(“\n输入要插入的密钥:”);
scanf(“%d”和“&k”);
根=插入(根,k);
打破
案例2:
printf(“\n”);
显示(根,0);
printf(“\n”);
打破
案例3:
printf(“\n输入要搜索的密钥:”);
scanf(“%d”和“&v”);
按顺序搜索(根,v);
如果(标志==1)
{
printf(“二叉树中的元素\n”);
}
其他的
{
printf(“二叉树中不存在的元素\n”);
}
打破
违约:
出口(1);
}
}
返回0;
}
结构节点*插入(结构节点*ptr,int-ikey)
{
如果(ptr==NULL)
{
ptr=(结构节点*)malloc(sizeof(结构节点));
ptr->info=ikey;
ptr->lchild=NULL;
ptr->rchild=NULL;
}
else if(ikeyinfo)/*插入左子树*/
ptr->lchild=插入(ptr->lchild,ikey);
else if(ikey>ptr->info)/*插入右子树*/
ptr->rchild=insert(ptr->rchild,ikey);
其他的
printf(“\n复制键\n”);
返回ptr;
}
按顺序搜索无效(结构节点*ptr,int val)
{
如果(!ptr)
{
返回;
}
按顺序搜索(ptr->lchild,val);
如果(ptr->lchild==val)
{
printf(“\n二叉树中存在元素。\n”);
flag=1;
}
按顺序搜索(ptr->rchild,val);
}
无效显示(结构节点*ptr,整数级)
{
int i;
如果(ptr==NULL)
返回;
其他的
{
显示(ptr->rchild,级别+1);
printf(“\n”);
对于(i=0;iinfo);
显示(ptr->lchild,级别+1);
}
}
6879342


这是我输入的树,我搜索其中的所有元素,但它仍然表示二叉树中不存在元素。我一直在尝试将这个搜索功能集成到我在互联网上找到的另一个代码中,所以如果它看起来很凌乱,请原谅我。我也是一个初学者,所以如果我不确定这是否是一个愚蠢的错误。

以下是我所做的更改及其效果:

void in_order_search(struct node *ptr, int val)
{
    if (!ptr)
    {
        return;
    }
    in_order_search(ptr->lchild, val);
    if(ptr->info == val)
    {
/*         printf("\nElement present in the binary tree.\n"); to prevent double printing
 */        flag = 1;
            return;/* no need to go to the next line*/
    }
    in_order_search(ptr->rchild, val);
}
此外,还要注意seg故障引起的线路:

ptr->lchild == val
这条线不好

if(ptr->info == val)

如果(ptr->val==value)甚至无法编译,则这是更正<代码>值不是定义的变量,
val
不是结构中的字段。请显示实际代码。
ptr->lchild==val
应该是
ptr->info==val
,这样它就可以工作,不会导致seg故障@SwaggerLagger10@SwaggerLagger10检查此注释(在注释中)