디시인사이드 갤러리

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

갤러리 본문 영역

러스트가 인기 없는 EU

나르시갤로그로 이동합니다. 2025.07.23 15:18:36
조회 35 추천 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/21 - -
2875044 1978년 7월 서울 남산동에서 무더운 여름 밤이계속되자 발명도둑잡기(39.7) 00:33 27 0
2875043 일본에서 실제로 일어난 사건 [1] 발명도둑잡기(39.7) 00:31 46 0
2875041 40도가 넘는 천막에서 민주노총과 진보당은 발명도둑잡기(39.7) 00:30 24 0
2875040 C #은 마이크로소프트 소속언어인데 왜이렇개 병신같을까 뒷통수한방(1.213) 00:24 45 0
2875038 공수처 검찰청 경찰청 국제수사 과학수사 포랜식수사 기무사 국정원 존재이유 뒷통수한방(1.213) 00:14 16 0
2875037 전기 모기채 발명한 사람이 번 돈 발명도둑잡기(39.7) 00:14 30 0
2875034 지잡대 컴공 한국나이 28살 졸업이면 많이 늦은거냐 [1] 프갤러(119.193) 07.26 101 0
2875033 에반게리온 구극장판에서 달콤한죽음대신 이노래 어떰? ㅇㅇ(183.101) 07.26 32 0
2875031 사도마조히즘 노예들 해방 중 발명도둑잡기(39.7) 07.26 23 0
2875029 오늘의 소설, 영화 실마리: 모기 유전자조작으로 전염병을 퍼뜨리며 전쟁 발명도둑잡기(118.216) 07.26 26 0
2875025 아 ㅅㅂ 자려는데 모기잇는듯 개빡치넹 [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.26 55 0
2875023 갑부 칸예도 파이럿베이에서 가상악기 불법 다운로드 발명도둑잡기(118.216) 07.26 26 0
2875022 '후방 ) 권은비 일본 공연 중 꼭노 프갤러(58.224) 07.26 51 0
2875020 '후방 ) 권은비 일본 공연 중 꼭노 프갤러(58.224) 07.26 33 0
2875018 칸예 나치 관련 이상한 점 [1] 발명도둑잡기(118.216) 07.26 38 0
2875017 언어 한번 만들어보고 싶지 않냐 [5] ㅆㅇㅆ(124.216) 07.26 79 0
2875016 C# 최대 단점, FreeBSD에서 사용하기 뭐 같음 나르시갤로그로 이동합니다. 07.26 39 0
2875015 백악관 개빡돌게 만든 사우스파크 에피소드 발명도둑잡기(118.216) 07.26 24 0
2875011 ❤✨☀⭐⚡☘⛩나님 탈갤합니당⛩☘⚡⭐☀✨❤ [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.26 41 0
2875008 프갤 또 뉴스탈듯.. 운명은 바꿀수 없는걸깡.. [2] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.26 63 0
2875004 C# 진짜 해보면 만족도가 너무 높긴함 [2] ㅆㅇㅆ(124.216) 07.26 84 0
2875003 성냥사세양..성냥사세양.. 성냥말구 다른것두 팔아양.. [4] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.26 63 0
2875002 C#에 절여져서 다른 언어를 못하겠다 [4] 루도그담당(58.239) 07.26 80 0
2874999 군대에서 프로그래밍 공부하는법 [3] 프갤러(58.232) 07.26 102 0
2874997 "폭염때문에 너무 뜨거워 마트서 사온 '오리 알'이 부화했어요" 발명도둑잡기(39.7) 07.26 24 0
2874995 커피를 마시며 명상을 하려고 합니다 [15] 아스카영원히사랑해갤로그로 이동합니다. 07.26 90 0
2874993 나님 제 2의 원종이가 나오지 않도록 멍유 케어해주고 있는데.. 뭔가.. [9] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.26 65 0
2874991 아스카영원히사랑해씨 출입증 나왔습니다 [13] 헬마스터갤로그로 이동합니다. 07.26 69 2
2874989 sap ui5 개좆같다 ㄹㅇ [2] ㅇㅇ(39.7) 07.26 38 0
2874988 저는 크몽, 숨은 고수에서 5만원에 소통과 이야기 할 수 있습니다. [4] ㅆㅇㅆ(124.216) 07.26 66 0
2874986 베르세르크 작가의 생애. ㅇㅇ(183.101) 07.26 30 0
2874984 ㅆㅇㅆ과 진지한 대화를 하고 싶다 [3] 아스카영원히사랑해갤로그로 이동합니다. 07.26 68 0
2874983 뉴프로 전환율을 높이기 위해 비회원 댓글창을 표시하다 헬마스터갤로그로 이동합니다. 07.26 28 0
2874982 요즘 인싸들 진격거보고 꺼드럭거리는거 개빡침 [4] 어린이노무현갤로그로 이동합니다. 07.26 70 2
2874981 원종이 IQ 높았냐? [4] ㅇㅇ(211.234) 07.26 58 0
2874980 누가 나님 냥덩이 만진거야? [7] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.26 59 0
2874978 흔한 화상회의 ㅇㅇ(183.101) 07.26 28 0
2874977 자기가 조건을 거는 순간 보지가 조건을 걸어도 인정을 해야지; [4] ㅆㅇㅆ(124.216) 07.26 67 0
2874974 유니티 발 문제 해결했다 [4] 루도그담당(58.239) 07.26 61 0
2874971 나님 인간 공부즁.. [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.26 42 0
2874966 칸예가 지지했던 트럼프가 당선돼야 발명도둑잡기(39.7) 07.26 26 0
2874964 난 남자지만 여자들이 차 없는 남자 안만나는거 이해함 [4] ㅇㅇ(211.234) 07.26 68 2
2874963 멱등성이라는 개념이랑 불변성 헷갈렸는데 [6] ㅆㅇㅆ(124.216) 07.26 50 0
2874962 인류말살계획 ㅇㅅㅇ [1] 어린이노무현갤로그로 이동합니다. 07.26 46 0
2874961 오늘도 코드 공부를 끝냈다. Saga패턴을 오늘도 완벽히 구현한 나 [3] ㅆㅇㅆ(124.216) 07.26 41 0
2874960 <어쩔 수가 없다> 발명도둑잡기(39.7) 07.26 25 0
2874959 플러터 인형 갖고싶댱❤ [7] 어린이노무현갤로그로 이동합니다. 07.26 54 0
2874958 호감고닉 등장 [4] 호감고닉(121.168) 07.26 43 0
2874957 러스트 정신병자 특) 나르시갤로그로 이동합니다. 07.26 32 0
2874955 신주라는 문화에 대해서 알고있다면 [2] 개멍청한유라갤로그로 이동합니다. 07.26 55 0
뉴스 제니엄마 김금순, 브라질에서 충격적인 강도 사건...돌싱으로서 두 아들 키우는 생계형 배우 디시트렌드 07.26
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2