当我调用insert(element)函数并添加元素时,它会在程序停止工作时出错。 当我在root的左边添加第3个元素或在root的右侧添加元素时,它会出错。
请帮忙解决。
void insert(int iElement){
if(sRoot==NULL){ //Initially sRoot is NULL
sRoot=(struct Node*)malloc(sizeof(struct Node));
sRoot->iData=iElement;
sRoot->sLeft=NULL;
sRoot->sRight=NULL;
}
else{
struct Node *current=(struct Node*)malloc(sizeof(struct Node));
current->iData=iElement;
current->sLeft=NULL;
current->sRight=NULL;
struct Node *parent;
struct Node *temp;
parent=sRoot;
while(parent!=NULL){
temp=parent;
if(iElement>parent->iData){
parent=parent->sRight;
}
if(iElement<parent->iData){
parent=parent->sLeft;
}
}
if(iElement<temp->iData)
temp->sLeft=current;
else
temp->sRight=current;
}
}
答案 0 :(得分:1)
函数中有两个错误,第一个是循环中使用了两个if语句而不是if-else if语句。
With a AS (
SELECT id, name from Nesting
)
SELECT id, name, ParentName from a
OUTER APPLY (
SELECT name as ParentName from Nesting n where n.parentid = a.id
) AS FOO
因此,如果执行了第一个if语句,那么 while(parent!=NULL){
temp=parent;
if(iElement>parent->iData){
parent=parent->sRight;
}
if(iElement<parent->iData){
parent=parent->sLeft;
}
}
可以设置为parent
。但是,在第二个语句中,您尝试访问数据成员NULL
以获取此类iData
指针。
所以必须至少
NULL
此循环的第二个问题是,如果used将提供重复值,则此循环将是无限的,因为指针 while(parent!=NULL){
temp=parent;
if(iElement>parent->iData){
parent=parent->sRight;
}
else if(iElement<parent->iData){
parent=parent->sLeft;
}
}
未更改。
此外还会有内存泄漏,因为已经为指针parent
分配了内存,尽管在重复值的情况下不应附加任何节点。
因此,当用户提供重复值时,您需要处理该案例。
该功能可以按照以下方式实施,如演示程序中所示。
current
考虑到当函数依赖于全局变量时,这是一个坏主意。
因此最好将其声明为另外一个参数
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int iData;
struct Node *sLeft;
struct Node *sRight;
};
struct Node *sRoot = NULL;
int insert( int iElement )
{
int success = 1;
struct Node **current = &sRoot;
while ( success && *current != NULL )
{
if ( iElement < ( *current )->iData )
{
current = &( *current )->sLeft;
}
else if ( ( *current )->iData < iElement )
{
current = &( *current )->sRight;
}
else
{
success = 0;
}
}
if ( success )
{
*current = malloc( sizeof( struct Node ) );
success = *current != NULL;
if ( success )
{
( *current )->iData = iElement;
( *current )->sLeft = NULL;
( *current )->sRight = NULL;
}
}
return success;
}
int main(void)
{
insert( 10 );
insert( 9 );
insert( 11 );
insert( 12 );
insert( 8 );
insert( 7 );
return 0;
}
答案 1 :(得分:0)
这是修改过的,我在评论中保留的解释。
void insert(int iElement){
if(sRoot==NULL){ //Initially sRoot is NULL
sRoot=(struct Node*)malloc(sizeof(struct Node));
sRoot->iData=iElement;
sRoot->sLeft=NULL;
sRoot->sRight=NULL;
}
else{
struct Node *current=(struct Node*)malloc(sizeof(struct Node));
current->iData=iElement;
current->sLeft=NULL;
current->sRight=NULL;
struct Node *parent;
struct Node *temp;
parent=sRoot;
while(parent!=NULL){ /* it fails when parent is NULL */
if(iElement > parent->iData){
if(parent->sRight ! = NULL)/* need to check if parent->right is null or not */
parent->sRight = current;/*if not NULL then put i
t here */
else
parent = parent->sRight;/* update the parent */
}
if(iElement < parent->iData){
if(parent->sLeft ! = NULL)
parent->sLeft = current;
else
parent=parent->sLeft;
}
}
}
}