我只是想编写一个简单的二进制搜索树程序,用户可以在其中插入节点并以顺序,预订或后序模式查看树中的所有节点。我的代码是
#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
有什么问题?我也不太习惯双间接指针,所以有人可以解释我如何传递和检索双间接指针(如果我需要在上面的程序中传递它们)。
答案 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)
并使用
调用insertnodeinsertnode(&root, data);