Почему ошибка сегментации (код сбрасывается)? Функция удаляет узел в бинарном дереве поиска - PullRequest
0 голосов
/ 20 апреля 2020

Почему код сбрасывается? Я пытаюсь сделать двоичное дерево поиска. В программе уже есть pu sh, который принимает узел и добавляет новый узел в начале списка. Pop удалит узел в начале непустого списка и вернет данные. InsertTreeNode вставит узел дерева в отсортированный двоичный список.

    struct treeNode {
       int data;                    /* tree node value */
       struct treeNode *leftPtr;  /* pointer to left subtree */
       struct treeNode *rightPtr; /* pointer to right subtree */
    };

    struct stackEntry {
      struct treeNode *treePtr;  /* list value */
      struct stackEntry *next;   /* pointer to next entry in list */
    };

    struct stackEntry *stackHead = NULL;    /* pointer to head of stack */

pu sh - добавить новый узел в начале списка

    void push(struct treeNode *treePtr) {
      struct stackEntry *newNode;

      newNode = malloc(sizeof(struct stackEntry));

      newNode->treePtr = treePtr;
      newNode->next = stackHead;
      stackHead = newNode;
    }

pop - удалить узел в начале не пустой список и возвращает его данные

     struct treeNode *pop() {
      struct stackEntry *current;
      struct treeNode *val;

      current = stackHead;
      stackHead = current->next;
      val = current->treePtr;
      if (val != NULL) {
        free(current);
      }

      return(val);
    }

insertTreeNode - вставляет узел дерева в отсортированное двоичное дерево

    void insertTreeNode( struct treeNode **treePtr, int value )
    {
       if ( *treePtr == NULL ) {
          *treePtr = malloc( sizeof( struct treeNode ) );
          ( *treePtr )->data = value;
          ( *treePtr )->leftPtr = NULL;
          ( *treePtr )->rightPtr = NULL;
       }
       else { /* tree is not empty */
          /* data to insert is less than data in current node */
          if ( value < ( *treePtr )->data ) {
             insertTreeNode( &( ( *treePtr )->leftPtr ), value );
          }
          /* data to insert is greater than data in current node */
          else if ( value > ( *treePtr )->data ) {
             insertTreeNode( &( ( *treePtr )->rightPtr ), value );
          }
          else { /* duplicate data value ignored */
             printf( "dup" );
          }
       }
    }


     void delete( struct treeNode **treePtr, struct treeNode** rootRef )
    {
      struct treeNode *current = NULL;

      current = *treePtr;   // current is address of the parent's sub-tree pointer to the node to be deleted


      push(current->leftPtr);
      push(current->rightPtr);
      (*treePtr) = NULL;
      free(current);

      while(stackHead != NULL) {
        current = pop();
        if(*rootRef != NULL) {
          push((*rootRef)->leftPtr);
          push((*rootRef)->rightPtr);
          insertTreeNode(rootRef, stackHead->treePtr->data);
        }
      }
    }
...