使用单链表实现BinarySearchTree
下面是我用来实现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
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您应该创建一个单独的函数来创建和返回节点,以及另一个添加节点(以及根节点)的函数。