⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree_removers.c

📁 linked list linked list tree struc
💻 C
字号:
/*
 * Wei Cui
 * 981503
 * wec924 */
 
#include <stdio.h>
#include <tree.h>

TREE *freeTreePtr;    /* next available tree */
NODE *freeNodePtr;    /* next available node */


/* the function is defined in tree_adders.c doing the necessary rotation job */
void _rotate_if_necessary(TREEPTR, NODE *);

/* tree removers : */


TITEM _sampleRemove(NODE *replace)
{
  if (!replace->right)
  {
    if (replace->parent)
    {
      if (replace->parent->left == replace)   replace->parent->left=replace->left;
      else   replace->parent->right=replace->left;
    }
    if (replace->left)   replace->left->parent=replace->parent;
  }
  else
  {
    if (replace->parent)
    {
      if (replace->parent->left == replace)   replace->parent->left=replace->right;
      else   replace->parent->right=replace->right;
    }
    replace->right->parent=replace->parent;
  }
  if (replace->next)   replace->next->prev=replace->prev;  
  if (replace->prev)   replace->prev->next=replace->next;
  replace->height = 0;
  replace->parent = NULL;
  replace->left = NULL;
  replace->right = NULL;
  replace->prev = NULL;
  replace->next = freeNodePtr;
  freeNodePtr = replace;
  return replace->item;
}


TITEM TreeRemove(TREEPTR mytree)
{
  NODE *delNode, *replace, *cpNode;
  TITEM delItem;
  if ((!mytree)||(!mytree->curr_node))
  {
    return NULL;
  }
  else
  {
    delNode = mytree->curr_node;
    delItem = delNode->item;
    cpNode = delNode->parent;
    if ((delNode->right) && (delNode->left)) /* the delNode has both subtrees */
    {
 /* choose the next node as the replacement of deletation */
      replace = delNode->next;
      cpNode = replace->parent;
      delNode->item = _sampleRemove(replace);
    }
    else                            /* the delNode doesn't have both subtrees */
    {
      if (delNode->next)   mytree->curr_node=delNode->next;
      else   mytree->curr_node=delNode->prev;
      if (mytree->root_node == delNode)   mytree->root_node = mytree->curr_node;
      delItem = _sampleRemove(delNode);
    }
    if (mytree->first_node == delNode)   mytree->first_node=mytree->curr_node;
    if (mytree->last_node == delNode)   mytree->last_node=mytree->curr_node;
    while (cpNode)
    {  
      _rotate_if_necessary(mytree, cpNode);
      cpNode = cpNode->parent;
    }
    mytree->size--;
    freeNodePtr->item = NULL;
    return delItem;
  }
}



void TreeFree(TREEPTR mytree, void itemFree(void *))
{
  NODE *tempNode;
  TITEM tempItem;
  if (mytree)
  {
    mytree->curr_node = mytree->first_node;
    while ( mytree->curr_node != NULL )
    {
      tempItem = mytree->curr_node->item;
      (*itemFree)(tempItem);
      /* call the pointer routine to deal with each item. */
      tempNode = mytree->curr_node->next;
      mytree->curr_node->next = freeNodePtr;
      freeNodePtr = mytree->curr_node;
      mytree->curr_node = tempNode;
    }
    mytree->first_node = NULL;
    mytree->last_node = (NODE *)freeTreePtr;
    mytree->root_node = NULL;
    mytree->size = 0;                       /* mytree left empty */
    freeTreePtr = mytree;                   /* but the space is available to be reused */
  }
  else printf("The tree doesn't exist!!\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -