二叉树 - 解除引用指针

时间:2012-07-16 08:59:36

标签: c

我只是想编写一个简单的二进制搜索树程序,用户可以在其中插入节点并以顺序,预订或后序模式查看树中的所有节点。我的代码是


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

struct treenode
{
int data;
struct treenode *lchild;
struct treenode *rchild;
}*root;

void insertnode(struct treenode *p,int d)
{
    if(p==NULL)
    {
         // means the tree is empty
         p=(struct treenode *)malloc(sizeof(struct treenode));
         p->data=d;
         p->lchild=NULL;
         p->rchild=NULL;
    }

    else
    {
         // start comparing the new data from root
         if( d<p->data )
             insertnode((&(p->lchild)),d);

        else
             insertnode((&(p->lchild)),d);
    }
}

void preorder(struct treenode *p)
{
    if(p==NULL)
    {
        printf("\nThe list is empty");
    }

    else
    {
        printf("%d",p->data);
        preorder(p->lchild);
        preorder(p->rchild);
    }
}

void postorder(struct treenode *p)
{
    if(p==NULL)
    {
        printf("\nThe list is empty");
    }

    else
    {
        preorder(p->lchild);
        preorder(p->rchild);
        printf("%d",p->data);
    }
}

void inorder(struct treeode *p)
{
    if(p==NULL)
    {
        printf("\nThe list is empty");
    }

    else
    {
        preorder(p->lchild);
        printf("%d",p->data);
        preorder(p->rchild);
    }
}

int main(void)
{
    root=NULL;
    int choice,data;

    while(1)
    {
         printf("\nPress 1 for inserting a node in BST fashion: ");
         printf("\nPress 2 for traversing the tree in preorder fashion :");
         printf("\nPress 3 for traversing the tree in postorder fashion :");
         printf("\nPress 4 for traversing the tree in inorder fashion :");
         printf("\nPress 5 to exit :");


         printf("\nEnter your choice: ");
         scanf("%d", &choice);

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

        case 2: preorder(root);
            break;

        case 3: postorder(root);
            break;

        case 4: inorder(root);
            break;

        case 5: exit(0);
            break;

        default: printf("\nYou have enetred an invalid choice. Please try again");
    }
}

return 0;
}

有大量错误消息说


dereferencing pointer to incomplete type

有什么问题?我也不太习惯双间接指针,所以有人可以解释我如何传递和检索双间接指针(如果我需要在上面的程序中传递它们)。

2 个答案:

答案 0 :(得分:6)

以下只是编译错误,因此修复这些错误,您的程序将编译。

问题#1
您将结构定义为:

struct treenode
{
    /* Blah blah... */
} *root;  /* Mistake: should be root, not *root */

而是将其命名为root,而不是*root


问题#2
您正在调用insertnode()错误。而不是:

insertnode((&(p->lchild)),d);  /* Mistake: taking the address of the pointer */

您应该这样称呼它:

insertnode(p->lchild,d);


问题#3
您在root错误中定义了main()

root = NULL;  /* Mistake: root is implicitly declared as int */

你应该做的是:

struct treenode* root = NULL;


问题#4

您在inorder()

的声明中有拼写错误
void inorder(struct treeode *p)  /* Typo: should be treenode and not treeode */

应该是:

void inorder(struct treenode *p)

下一组问题是程序中的逻辑错误:

问题#5
insertnode()中,您始终在左侧节点中插入新值d。您应该将其中一个递归insertnode(p->lchild, d);调用更改为:

insertnode(p->rchild, d);

取决于您希望如何组织树。


问题#6
就像AndersK指出的那样,传递的指针root在传递给insertnode()之后永远不会改变,因此这是一个主要的错误。

在您的情况下,当您想要更改传递的指针本身(即将其指向另一个地址)时,必须使用双重间接指针,而不是更改指针本身。

您想更改root内的insertnode(),因此请添加其他级别的间接并传递root &root的地址,这样也可以在函数内更改root。

相应地,insertnode()的声明应该是:

insertnode(struct treenode** p, int d)

答案 1 :(得分:1)

为了更改指针指向的数据,您需要再提供一个间接级别

e.g。你写的

insertnode(root,data);

但是root在开始时设置为NULL,并且不能像insertnode那样在函数中提供它。

而是将insertnode声明为

insertnode(struct treenode **p,int d)

并使用

调用insertnode
insertnode(&root, data);