fork download
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Node
{
  int value;
  struct Node *left;
  struct Node *right;
};

struct Node *newNode(int value)
{
  struct Node *p = malloc(sizeof(*p));
  p->value = value;
  p->left = NULL;
  p->right = NULL;
  return p;
}

struct Node *addNode(struct Node *p, int value)
{
  if (p == NULL)
  {
    return newNode(value);
  }
  else
  {
    if (value < p->value)
    {
      p->left = addNode(p->left, value);
    }
    else
    {
      p->right = addNode(p->right, value);
    }

    return p;
  }
}

struct Node *deleteMinNode(struct Node *p)
{
  struct Node* r;

  if (p == NULL)
  {
    return NULL;
  }
  else
  {
    if (p->left == NULL)
    {
      r = p->right;
      free(p);
      return r;
    }
    else
    {
      p->left = deleteMinNode(p->left);
      return p;
    }
  }
}

struct Node *deleteNode(struct Node *p, int value, int *deleted)
{
  struct Node *r;
  struct Node *n;

  if (p == NULL)
  {
    *deleted = 0;
    return NULL;
  }
  else
  {
    if (value < p->value)
    {
      p->left = deleteNode(p->left, value, deleted);
      return p;
    }
    else if (p->value < value)
    {
      p->right = deleteNode(p->right, value, deleted);
      return p;
    }
    else
    {
      if (p->left == NULL)
      {
        r = p->right;
        free(p);
      }
      else if (p->right == NULL)
      {
        r = p->left;
        free(p);
      }
      else
      {
        n = p->right;

        while (n->left != NULL)
        {
          n = n->left;
        }

        p->value = n->value;
        p->right = deleteMinNode(p->right);
        r = p;
      }

      *deleted = 1;
      return r;
    }
  }
}

void writeNode(struct Node *p)
{
  if (p == NULL)
  {
    printf("_ ");
  }
  else
  {
    printf("[ %d ", p->value);
    writeNode(p->left);
    writeNode(p->right);
    printf("] ");
  }
}

void destroyNode(struct Node *p)
{
  if (p == NULL)
  {
    return;
  }
  else
  {
    destroyNode(p->left);
    destroyNode(p->right);
    free(p);
  }
}

int main(int argc, char *argv[])
{
  int i;
  int deleted;
  struct Node *p = NULL;

  for (i = 1; i < argc; i++)
  {
    if (strcmp(argv[i], "--") == 0)
    {
      break;
    }
    else
    {
      p = addNode(p, atoi(argv[i]));
    }
  }

  printf("入力データ ");
  writeNode(p);
  printf("\n");

  for (i = i + 1; i < argc; i++)
  {
    printf("deleteNode(%d)\n", atoi(argv[i]));
    p = deleteNode(p, atoi(argv[i]), &deleted);

    if (deleted)
    {
      printf("==> ");
      writeNode(p);
      printf("\n");
    }
    else
    {
      printf("deleteNode: 指定キーのノードがありません\n");
    }
  }

  destroyNode(p);

  return 0;
}
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty