C语言求大神帮忙看看写的二叉树删除,为什么我的这道程序执行顺序异常 20C

写的一道数据结构树二叉树删除的作业
关于数据结构的正确与否不需要大神考虑,只要帮我看看为什么这道程序执行顺序这么奇怪
代码比较长:请关注main函数里面出现的几个函数就行了,其他不用管

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

typedef struct aaa {
    int key;
    char    name[20];
    char    address[100];
} element;

typedef struct node *nodePointer;

typedef struct node {
    nodePointer leftChild;

    element data;

    nodePointer rightChild;
}node;

node* add( nodePointer *q );


void printall( struct node  *q );


void searchSmallestAmongLargerNodes( nodePointer search, nodePointer* parentSmall, nodePointer *searchSmall )
{
    nodePointer temp = search->rightChild;

    if ( temp->rightChild = NULL )
    {
        *parentSmall    = search;
        *searchSmall    = temp;
    }else  { *parentSmall   = temp;
         *searchSmall   = temp->rightChild; }
}


/*  nodePointer root = NULL; */
int searchParentToInsert( struct node *root, int key, struct node **parentPtr )
{
    int     found   = 0;
    struct  node    *parent = NULL, *search = root;
    while ( search != NULL )
    {
        if ( key == search->data.key )
        {
            found = 1;
            break;
        }else  {
            parent = search;
            if ( key < search->data.key )
                search = search->leftChild;
            else
                search = search->rightChild;
        }
    }
    *parentPtr = parent;
    return(found);
}


void insertBST( struct node **rootPtr, element x )
{
    struct node *ptr, *parent;

    int found = 0;
    found = searchParentToInsert( *rootPtr, x.key, &parent );
    if ( found == 1 )
    {
        printf( "The key already exists in the tree!\n" );
    } else{
        ptr     = (node *) malloc( sizeof(node) );
        ptr->data   = x;
        ptr->leftChild  = ptr->rightChild = NULL;
        if ( *rootPtr == NULL )
        {
            *rootPtr = ptr;
        } else {
            if ( x.key < parent->data.key )
                parent->leftChild = ptr;
            else parent->rightChild = ptr;
        }
    }
}


int  deleteBST( struct node **rootPtr, int key )
{
    int     find1 = 0;
    struct node **root, **parent, *search, *parentSmall, *searchSmall;
    root    = (struct node * *    ) malloc( sizeof(struct node*) );
    *root   = *rootPtr;
    parent  = (struct node * *    ) malloc( sizeof(struct node*) );

    search      = (struct node *    ) malloc( sizeof(struct node) );
    searchSmall = (struct node *    ) malloc( sizeof(struct node) );


    find1 = searchParentToInsert( *root, key, parent );
    if ( find1 == 0 )
    {
        return(0);
    }    /* NOT FOUND} */
    /* case 1. Deletion of a leaf node. */
    if ( (search->leftChild == NULL) && (search->rightChild == NULL) )
        free( search );

    if ( (search->leftChild == NULL) || (search->rightChild == NULL) )
    {
        { if ( search->leftChild != NULL )
              (*parent) = (*parent)->leftChild;
          else
              (*parent) = (*parent)->rightChild; }

        if ( (search->leftChild != NULL) && (search->rightChild != NULL) )
        {
            /* find the smallest among the larger than the key */
            searchSmallestAmongLargerNodes( search, &parentSmall, &searchSmall );
            search->data.key = searchSmall->data.key;

            if ( search == parentSmall )
                parentSmall->rightChild = searchSmall->rightChild;
            else parentSmall->leftChild = searchSmall->rightChild;
            free( searchSmall );
        }
    }
    return(0);
}


int main( void )
{
    int     cc;
    nodePointer q;
    q = (struct node *) malloc( sizeof(struct node) );

    q = add( &q );

    cc = deleteBST( &q, 3 );

    printall( q );
}


nodePointer add( nodePointer *q )
{
    int coun = 0;

    while ( 1 )
    {
        struct node *newnode = NULL;
        newnode = (struct node *) malloc( sizeof(struct node) );
        scanf( "%d,", &newnode->data.key );
        if ( newnode->data.key == -1 )
        {
            return(*q);
        }
        newnode->leftChild  = NULL;
        newnode->rightChild = NULL;
        scanf( "%[^,]%[^\n]", newnode->data.name, newnode->data.address );
        fflush( stdin );
        /* gets_s(newnode->add); */

        if ( coun == 0 )
        {
            *q = newnode;
            coun++;
        }else  { insertBST( q, newnode->data ); }
    }

    return(*q);
}


void printall( struct node  *q )  /* inorder */
{
    struct node *temp = q;
    if ( temp )
    {
        printall( temp->leftChild );
        printf( "%d %s %s\n", temp->data.key, temp->data.name, temp->data.address );
        printall( temp->rightChild );
    }
}

我输入了测试代码是
1,asdf,sdf
2,dsf,sdf
3,sdf,sdf
-1

首先看下 nodePointer add(nodePointer *q) 函数(add函数建立二叉树)
循环输入知道输入-1结束
但是当我输入第一行1,asdf,sdf结束的时候,就会main函数从上到下过一下(我用了断点调试)
输入第二行第三行也是这样

输入-1结束输入的时候

cc=deleteBST(&q, 3);这一行直接跳过
(按照顺序执行,这一行应该执行啊)
(deleteBST删除二叉树中的 3 )
图片说明

请大神输入我的测试代码调试一下
20分等解决问题的大神来拿哦

6个回答

图片说明
照着你的输入了下,你的问题是跳过了delete还是删除不成功?

weixin_40182907
坚持可持续 应该是跳过了delete,我再delete函数部分也用了断点测试,没有运行这个函数
一年多之前 回复

你free了以后有将前根置空?你可以将存的东西改改试试,就一个free没报非法访问就不错了

将free(S) 放在 renturn 0; 前面
因为 return 0;后程序退出, 不会调用free(S) 去释放内存

运行了啊,你是删除不成功吧,图片说明,看图

没有注释也不想去看你的逻辑问题,程序是运行了的

图片说明
这里貌似search指针无法通过searchParentToInsert更改,从而下面两个所有if都会被跳过,导致整个函数没有实际执行,所以编译器直接在main函数里把deleteBST的调用优化掉了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

4
交换二叉树中每个结点的左孩子和右孩子C++语言
2
[LeetCode]018-4-Sum的c++解法:只能用哈希表和二叉树搜索方法
2
求限定子树数量的二叉树的最大子树和
1
数据结构求二叉树的宽度问题
2
C语言构造二叉树的问题,二叉树从键盘的输入
1
一棵非空的二叉树在中序线索化后,其中值为空的链域的个数是 A 不确定B.0 C.1D.2
2
一棵非空的二叉树的先序序列和后续序列正好相同,则该二叉树一定满足?
1
如何用c语言实现二叉树
0
当所有结点的权值都相等时,用这些结点构造的二叉树上只有?
1
一个二叉树的遍历方面的问题求问下各位大神了
1
二叉树的搜索和查询的算法问题,用C语言看看是怎么实现的过程的方式?
0
C语言如何输入两个二叉树的二进制判断二叉树是否是相等的
0
二叉树的对称和旋转的问题,如何利用C语言实现这个问题的解答
0
二叉树的链表存储,线索二叉树的算法问题,怎么使用C语言实现节点遍历
0
关于二叉树的路径的相似行的判断的问题,如何使用C语言解决啊
1
初学二叉树的初始化,为什么一定要定义一个指针型变量
2
初学者刚学二叉树,请问为什么这个创建并遍历线索二叉树的程序不出结果
1
二叉树的顺序存储结构的一个小问题
0
二叉树的相等性的判断算法问题,运用C语言具体怎么实现的一个思路?
0
分型二叉树的相似性的判断算法,如何利用C语言编程技术的实现的