디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

러스트가 인기 없는 EU

나르시갤로그로 이동합니다. 2025.07.23 15:18:36
조회 40 추천 0 댓글 0

러스트로 트리맵 구현하기 겁나 어려움

ㅋㅋㅋ


1. unsafe 써서 편한 길을 가자니 러스트 사용하는 장점이 소멸되고


2. 안전한 길을 가지니 겁나 어렵고


ㅋㅋㅋ


러스트로 개발하면 개발에 흥미 읽고

결국 5년 이내에 99%가 개발 포기하게 됩니다.

ㅋㅋㅋ



/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */

/*

 * c-tree-map.c

 * Copyright (C) 2024 Hodong Kim, All rights reserved.

 * Unauthorized copying of this software, via any medium is strictly prohibited.

 * Proprietary and confidential.

 * Written by Hodong Kim <hodong@nimfsoft.art>

*/

#include "c-tree-map.h"

#include "c-mem.h"

#include <stdlib.h>

#include <assert.h>


#define _RANK(node) ((node) ? (node)->rank : -1)

#ifdef NDEBUG

#undef NDEBUG

#endif

CTreeMap* c_tree_map_new (CCompareFunc key_compare_func,

                          CFreeFunc key_free_func,

                          CFreeFunc value_free_func)

{

  CTreeMap* map         = c_malloc (sizeof (CTreeMap));

  map->root             = nullptr;

  map->key_compare_func = key_compare_func;

  map->key_free_func    = key_free_func;

  map->value_free_func  = value_free_func;

  map->size             = 0;

  return map;

}


static void _free_node (CTreeMap* map, CTreeNode* node)

{

  if (!node)

    return;


  _free_node (map, node->left);

  _free_node (map, node->right);


  if (map->key_free_func)

    map->key_free_func (node->key);


  if (map->value_free_func)

    map->value_free_func (node->value);


  free (node);

}


void c_tree_map_free (CTreeMap* map)

{

  _free_node (map, map->root);

  free (map);

}


static void _update_rank (CTreeNode* h)

{

  h->rank = C_MAX (_RANK (h->left), _RANK (h->right)) + 1;

}


static CTreeNode* _node_new (void* key, void* value)

{

  CTreeNode* node = c_malloc (sizeof (CTreeNode));

  node->left   = nullptr;

  node->right  = nullptr;

  node->key    = key;

  node->value  = value;

  node->rank   = 0;

  return node;

}


CTreeNode* _rotate_left (CTreeNode* h)

{

  assert (h->left != nullptr);


  CTreeNode* x = h->left;

  h->left = x->right;

  x->right = h;


  _update_rank (h);

  _update_rank (x);


  return x;

}


CTreeNode* _rotate_right (CTreeNode* h)

{

  assert (h->right != nullptr);


  CTreeNode* x = h->right;

  h->right = x->left;

  x->left = h;


  _update_rank (h);

  _update_rank (x);


  return x;

}


static CTreeNode* _balance (CTreeNode* h)

{

  if ((_RANK(h->left) - _RANK(h->right) > 1))

  {

    if (_RANK(h->left->right) > _RANK(h->left->left))

      h->left = _rotate_right (h->left);


    h = _rotate_left (h);

  }

  else

  {

    if ((_RANK(h->right) - _RANK(h->left) > 1))

    {

      if (_RANK(h->right->left) > _RANK(h->right->right))

        h->right = _rotate_left (h->right);


      h = _rotate_right (h);

    }

  }


  _update_rank (h);

  return h;

}


static CTreeNode* _insert (CTreeMap* map, CTreeNode* h, void* key, void* value)

{

  if (h == nullptr)

  {

    map->size++;

    return _node_new (key, value);

  }


  int retval = map->key_compare_func (key, h->key);

  if (retval < 0)

  {

    h->left = _insert (map, h->left, key, value);

  }

  else if (retval > 0)

  {

    h->right = _insert (map, h->right, key, value);

  }

  else // replace

  {

    if (map->key_free_func)

      map->key_free_func (h->key);


    if (map->value_free_func)

      map->value_free_func (h->value);


    h->key   = key;

    h->value = value;

    return h;

  }


  return _balance (h);

}


static void _verify (CTreeNode* node, int* count)

{

  if (!node)

    return;


  _verify (node->left, count);

  _verify (node->right, count);


  (*count)++;


  // All leaf nodes have rank 0.

  if (!node->left && !node->right)

    assert (node->rank == 0);


  if (node->left && node->right && // An internal node

      !node->left->left && !node->left->right &&

      !node->right->left && !node->right->right) //  with two leaf nodes

    assert (node->rank == 1);  // has rank 1.


  // The rank difference from the parent node is 1 or 2.

  int diff;

  diff = abs (_RANK(node) - _RANK(node->left));

  assert (diff == 1 || diff == 2);

  diff = abs (_RANK(node) - _RANK(node->right));

  assert (diff == 1 || diff == 2);

  (void) diff;

}


void c_tree_map_varify (CTreeMap* map)

{

  int count = 0;

  _verify (map->root, &count);

  assert (map->size == count);

}


void c_tree_map_insert (CTreeMap* map, void* key, void* value)

{

  map->root = _insert (map, map->root, key, value);

  c_tree_map_varify (map);

}


int c_tree_map_size (CTreeMap* map)

{

  return map->size;

}


bool c_tree_map_lookup (CTreeMap* map, const void* key, void** value)

{

  CTreeNode* node = map->root;


  while (node)

  {

    int retval = map->key_compare_func (key, node->key);

    if (retval < 0)

    {

      node = node->left;

    }

    else if (retval > 0)

    {

      node = node->right;

    }

    else

    {

      if (value)

        *value = node->value;


      return true;

    }

  }


  return false;

}


CTreeNode* _real_remove (CTreeMap* map, CTreeNode* h)

{

  if (h->left && h->right)

  {

    if (h->left->rank > h->right->rank)

    {

      h = _rotate_left (h);

      h->right = _real_remove (map, h->right);

    }

    else

    {

      h = _rotate_right (h);

      h->left = _real_remove (map, h->left);

    }

  }

  else

  {

    CTreeNode* _next = nullptr;


    if (h->left)

      _next = h->left;

    else

      _next = h->right;


    if (map->key_free_func)

      map->key_free_func (h->key);


    if (map->value_free_func)

      map->value_free_func (h->value);


    free (h);

    return _next;

  }


  return _balance (h);

}


CTreeNode* _remove (CTreeMap* map, CTreeNode* h, void* key)

{

  if (!h)

    return nullptr;


  int retval = map->key_compare_func (key, h->key);

  if (retval < 0)

  {

    h->left = _remove (map, h->left, key);

  }

  else if (retval > 0)

  {

    h->right = _remove (map, h->right, key);

  }

  else

  {

    map->size--;

    return _real_remove (map, h);

  }


  return _balance (h);

}


void c_tree_map_remove (CTreeMap* map, void* key)

{

  map->root = _remove (map, map->root, key);

  c_tree_map_varify (map);

}


static void _foreach (CTreeNode* node,

                      CTreeMapOrder order,

                      CTreeMapForEachFunc func,

                      void* user_data)

{

  if (!node)

    return;


  if (order == C_TREE_MAP_PRE_ORDER)

    func (node->key, node->value, user_data);


  _foreach (node->left, order, func, user_data);


  if (order == C_TREE_MAP_IN_ORDER)

    func (node->key, node->value, user_data);


  _foreach (node->right, order, func, user_data);


  if (order == C_TREE_MAP_POST_ORDER)

    func (node->key, node->value, user_data);

}


void c_tree_map_foreach (CTreeMap* map,

                         CTreeMapOrder order,

                         CTreeMapForEachFunc func,

                         void* user_data)

{

  _foreach (map->root, order, func, user_data);

}


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 반응이 재밌어서 자꾸만 놀리고 싶은 리액션 좋은 스타는? 운영자 25/07/28 - -
2874107 2찢명 매번 미국에 입구컷 쫓겨나는꼴 ㄹㅇ 현웃터짐 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 39 0
2874106 2찢명 사람 쓰고 버리기 스킬 ㅆㅅㅌㅊ! ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 33 0
2874105 짱깨들도 2찢명 쿠폰으로 한국세금 달달하거이 빨아먹는즁 ㅋㅅㅋ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 32 0
2874104 물리 배우다 프로그래밍으로 넘어가서 편했던점 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 07.24 71 0
2874103 나님만큼 최신 기술에 거부감 없이 잘쓰는 인재는 드뭄 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 41 0
2874102 여기서 조언바래봤자 딴데 가는게 나음 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 07.24 57 0
2874101 나님이 이번에 실험중인 항목들 ㅇㅅㅇ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 31 0
2874100 2ㅌㅊ 까지는 올해마무리 할지 모르겠넹 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 36 0
2874099 늒비 간곡한 조언 부탁드립니다 [1] 프갤러(203.10) 07.24 46 0
2874098 요즘 사람들 이를 안 닦나보군요 루도그담당(211.184) 07.24 50 0
2874097 중간 일정까지 고려하면 올해 간당하겠고 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 28 0
2874096 단순 계산으로 75면.. 흠.. ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 29 0
2874095 내일 출근 안합니다 ㅋ 루도그담당(211.184) 07.24 42 0
2874093 지방은 경력 10년도 연봉 5천 미만 수두룩하네 프갤러(218.238) 07.24 49 0
2874092 웹 영상 drm 걸린건 왠만해선 복호화 불가능함? [8] ㅇㅇ(110.10) 07.24 94 0
2874091 프로그래밍 솔직히 한 5~6년전 코드보면 기억 안나서 느끼는거지만 [1] ㅆㅇㅆ(124.216) 07.24 60 0
2874090 나님 통찰력 ㄱㅆㅅㅌㅊ.. ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 34 0
2874089 언젠간 이 문서를 완성하는게 내 개인적 목표임 [2] ㅆㅇㅆ(124.216) 07.24 56 0
2874088 저기 밑에 WPF 예제 추천해줌 ㅇㅇ [4] ㅆㅇㅆ(124.216) 07.24 73 0
2874087 C#에서 고급 문법이랄게 뭐가 있을까 [1] 루도그담당(211.184) 07.24 56 0
2874086 C# WPF에 윈폼이면 그렇게 어려울거 없이 1년투자하면 될거같은데 [5] ㅆㅇㅆ(124.216) 07.24 92 0
2874085 내가 느끼는건 프로그래밍하다보면 자신만의 기술 개념의 계층이 필요함 [2] ㅆㅇㅆ(124.216) 07.24 65 0
2874083 나는 항상 프로그래밍 메타 따라갈려고 체크중인데 내가 느끼는게 ㅆㅇㅆ(124.216) 07.24 49 0
2874082 마음아프고 애정결핍애들 애반게리온 필수시청 [4] 프갤러(183.101) 07.24 48 0
2874081 날씨 미쳤네 진짜 루도그담당(211.184) 07.24 39 0
2874080 공수처 검찰청 경찰청 국제수사 과학수사 포랜식수사 기무사 국정원 존재이유 뒷통수한방(1.213) 07.24 28 0
2874079 봇찌 css로 만들어봄 [5] ㅇㅇ(125.205) 07.24 67 1
2874078 근데 권도형 미국 갔잖아 그래서 뭐 언급없는거 아닌가? [3] ㅆㅇㅆ(124.216) 07.24 56 0
2874076 님들 루나코인 폭락 사건 알음? [1] 프갤러(222.114) 07.24 58 0
2874075 오 대기업들 슬슬 시작하려는듯 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 49 0
2874074 인정에서 발전이 시작되는법 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 36 0
2874073 나님 회복탄력성 실험즁❤+ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 39 0
2874072 나님 25억 인증❤+ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 45 0
2874071 개인적으로 느끼는거지만 결국 프로그래밍은 어떤 글쓰기 스타일이냐가 [2] ㅆㅇㅆ(124.216) 07.24 82 2
2874070 길가다 찍은 일본의 묘한 선거포스터 [9] 아스카영원히사랑해갤로그로 이동합니다. 07.24 101 0
2874069 최악무능 친중좌파 2찢명 입구컷! ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 44 0
2874068 신입, 주니어 취준생들 이력서 첨삭해줌 프갤러(221.148) 07.24 42 0
2874067 우낏낏끼! 우키킼! [1] 통암기원숭이(211.235) 07.24 54 0
2874066 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 33 0
2874065 파이어 베이스 쓰는게 나을까? 프갤러(39.118) 07.24 35 0
2874064 MSA가 꼭 크기는 클 필요 없긴함 ㅆㅇㅆ(124.216) 07.24 41 0
2874063 30대 모솔아다 지잡 비전공 백수 무직 [2] 어린이노무현갤로그로 이동합니다. 07.24 84 0
2874061 msa 개인프로젝트는 뭐 어케하는거냐 [2] 밀우갤로그로 이동합니다. 07.24 63 0
2874060 스킬은 바뀐다 하지만 프갤러(211.234) 07.24 36 0
2874059 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 31 0
2874058 [2찢명] 자녀특혜비리의혹 최휘영 제2의 조국사태 터질 조짐 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 54 0
2874057 공수처 검찰청 경찰청 국제수사 과학수사 포랜식수사 기무사 국정원 존재이유 뒷통수한방(1.213) 07.24 30 0
2874055 이갤엔 마음이 아픈 애들이 참 많구낭.. ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.24 50 0
2874054 회사에서 권고사직만 허락해주면 바로나갈껀데.. [2] ㅇㅇ(211.235) 07.24 72 0
2874053 양자역학은 세상이 확률적이라고 하는데... ㅇㅇ(183.101) 07.24 48 0
뉴스 배우 정호연, 붉은 수영복 입고 독보적 몸매와 모델다운 포즈 뽐내...여름의 청량함 가득담아 디시트렌드 07.26
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2