Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用单链表实现BinarySearchTree_C_Algorithm_Data Structures_Binary Tree - Fatal编程技术网

使用单链表实现BinarySearchTree

使用单链表实现BinarySearchTree,c,algorithm,data-structures,binary-tree,C,Algorithm,Data Structures,Binary Tree,下面是我用来实现BinarySearchTree的代码。不知何故,它无法构建二进制树。有人能帮忙解决问题吗 typedef struct BinarySearchTree { struct BinarySearchTree *left; int nodeval; struct BinarySearchTree *right; } BST; BST *root=NULL; void addrootnode(BST *,int ); void addnode(B

下面是我用来实现BinarySearchTree的代码。不知何故,它无法构建二进制树。有人能帮忙解决问题吗

typedef struct BinarySearchTree

{

    struct BinarySearchTree *left;
    int nodeval;
    struct BinarySearchTree *right;

} 
BST;

BST *root=NULL;

void addrootnode(BST *,int );

void addnode(BST *,int );

void deletenode(int );

void printnodes();

main()

{

    int nodeval;
    char choice;
    printf("\n r->rootnode \n a->add \n d->delete \n p->print \n e->exit\n");
    while (1)
    {   
        printf("\nEnter your choice:");
        scanf("%c",&choice);
        switch (choice)
        {
        case 'r':
            printf("\nEnter the root node value to add: ");
            scanf("%d",&nodeval);
            addrootnode(root,nodeval);
            break;
        case 'a':
            printf("\nEnter the node value to add: ");
            scanf("%d",&nodeval);
            addnode(root,nodeval);
            break;
        case 'd':
            printf("\nEnter the node value to delete: ");
            scanf("%d",&nodeval);
            break;
        case 'p':
            //printf("\n");
            printnodes(root);
            break;
        case 'e':           
            exit(0);
        default:
            break;
        }
    }
    getchar();

}//end of main

//addrootnode

void addrootnode(BST *ptr,int num)

{

    if(ptr==NULL)
    {
        ptr=(BST *) malloc(sizeof(BST));
        ptr->left=NULL;
        ptr->nodeval=num;   
        ptr->right=NULL;        
        root=ptr;       
    }
}
//add node

void addnode(BST *ptr,int num)
{

    if(ptr==NULL)
    {
        ptr=(BST *) malloc(sizeof(BST));
        ptr->left=NULL;
        ptr->nodeval=num;   
        ptr->right=NULL;        


    }
    else if(num < ptr->nodeval )
    {       
        addnode(ptr->left,num);
    }
    else
    {

        addnode(ptr->right,num);
    }

}

//delete functionality

void deletenode(int nodeval)
{
}

//print all nodes

void printnodes(BST *ptr)

{

    if (ptr)

    {
        printnodes(ptr->left);
        printf("%d\t",ptr->nodeval);
        printnodes(ptr->right);
    }

}
typedef结构二进制搜索树
{
结构二进制搜索树*左;
int nodeval;
结构二进制搜索树*右;
} 
英国理工学院;
BST*root=NULL;
void addrootnode(BST*,int);
void addnode(BST*,int);
无效删除节点(int);
void printnodes();
main()
{
int nodeval;
字符选择;
printf(“\n r->rootnode\n a->add\n d->delete\n p->print\n e->exit\n”);
而(1)
{   
printf(“\n输入您的选择:”);
scanf(“%c”,选择(&c));
开关(选择)
{
案例“r”:
printf(“\n输入要添加的根节点值:”;
scanf(“%d”和&nodeval);
addrootnode(root,nodeval);
打破
案例“a”:
printf(“\n输入要添加的节点值:”;
scanf(“%d”和&nodeval);
addnode(根,nodeval);
打破
案例“d”:
printf(“\n输入要删除的节点值:”);
scanf(“%d”和&nodeval);
打破
案例“p”:
//printf(“\n”);
打印节点(根);
打破
案例“e”:
出口(0);
违约:
打破
}
}
getchar();
}//干管末端
//addrootnode
void addrootnode(BST*ptr,int num)
{
如果(ptr==NULL)
{
ptr=(BST*)malloc(sizeof(BST));
ptr->left=NULL;
ptr->nodeval=num;
ptr->right=NULL;
根=ptr;
}
}
//添加节点
void addnode(BST*ptr,int num)
{
如果(ptr==NULL)
{
ptr=(BST*)malloc(sizeof(BST));
ptr->left=NULL;
ptr->nodeval=num;
ptr->right=NULL;
}
否则如果(numnodeval)
{       
addnode(ptr->left,num);
}
其他的
{
addnode(ptr->右,num);
}
}
//删除功能
void deletenode(int nodeval)
{
}
//打印所有节点
无效打印节点(BST*ptr)
{
如果(ptr)
{
打印节点(ptr->左);
printf(“%d\t”,ptr->nodeval);
打印节点(ptr->右侧);
}
}

不应将
BST*ptr
用作addnode的参数。您试图为其赋值,但此时
ptr
是函数addnode的局部变量,不会改变父节点的预期左或右指针


试着考虑改用BST**ptr。

您是否尝试过在调试器中单步执行代码?在检查变量和指针的同时,逐行执行此操作。您应该创建一个单独的函数来创建和返回节点,以及另一个添加节点(以及根节点)的函数。因此,正如CubeSchrauber所提到的,您将能够避免出现此问题。有没有一种方法可以在不使用指针指向指针的情况下实现相同的功能?@krrishna您应该创建一个单独的函数来创建和返回节点,以及另一个添加节点(以及根节点)的函数。