typedef struct TreeNode{
 int key;
 struct TreeNode *left,*right;
}TreeNode;

//삭제
void delete_node(TreeNode** root, int key){
 TreeNode *p,*child,*succ,*succ_p,*t;

 p = NULL;
 t= *root;

 while(t != NULL && t->key != key){
  p=t;
  t=(key < t->key) ? t->left : t->right;
 }
 if( t== NULL){
  printf("Key is not in the tree");
  return ;
 }
 // 단말노드인 경우
 if((t->left == NULL) && (t->right == NULL)){
  if(p != NULL){
   if(p->left == t)
    p-left = NULL;
  }
  else
   *root = NULL;
 }
 //하나의 자식만 가지는 경우
 else if((t->left == NULL) || (t->right == NULL)){
  child = (t->left != NULL) ? t->left : t->right;
  if(p != NULL){
   if(p->left == t)
    p->left = child;
   else p->right = child;
  }
  else
   *root = child;
 }
 else{
  succ_p = t;
  succ = t->right;
  while(succ->left != NULL){
   succ_p = succ;
   succ = succ->left;
  }
  if(succ_p-<left == succ)
   succ_p->left = succ->right;
  else succ_p->right = succ->right;

  t->key = succ->key;
  t=succ;
 }
 free(t);
}

블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,



typedef struct node* node_pointer;
typedef struct node{
           node_pointer llink;
           element data;
           node_pointer rlink;
};



#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>


typedef int element;
typedef struct DlistNode{
 element data;
 struct DlistNode* llink;
 struct DlistNode* rlink;
}DlistNode;

void init(DlistNode* phead)
{
 phead->llink=phead;
 phead->rlink=phead;
}

void display(DlistNode* phead)
{
 DlistNode* p;
 for(p=phead->rlink ; p!=phead ; p=p->rlink)
 {
  printf("<---| %x | %d | %x |--->\n",p->llink , p->data, p->rlink);
 }
 printf("\n");
}

void dinsert_node(DlistNode* before , DlistNode *new_node)
{
 new_node->llink = before;
 new_node->rlink = before->rlink;
 before->rlink->llink = new_node;
 before->rlink = new_node;
}
// 삽입함수


 

void dremove_node(DlistNode *phead_node , DlistNode* removed)
{
 if(removed == phead_node) return;
 removed->llink->rlink = removed->rlink;
 removed->rlink->llink = removed->llink;
 free(removed);
}
//삭제함수

main()
{
 DlistNode head_node;
 DlistNode* p[10];
 int i;

 init(&head_node);
 for(i=0 ; i<5 ; i++)
 {
  p[i] = (DlistNode*)malloc(sizeof(DlistNode));
  p[i]->data = i;

  dinsert_node(&head_node,p[i]);
 }
 dremove_node(&head_node,p[4]);
 display(&head_node);
}

블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,

void romove_node(ListNode** phead, ListNode* p, ListNode* removed)
{
 if(p==NULL)
  *phead=(*phead)->link;
 else
  p->link = removed->link;
 free(removed);
}


블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,