Guest User

Untitled

a guest
Nov 15th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. #include <stdio.h>
  2. #define HSZ 127 //해쉬 크기
  3. #define HASHING(x) ((x)%HSZ)
  4. struct node_t {
  5. int val;
  6. struct node_t * next;
  7. }node_t;
  8.  
  9. struct node_t hash_table[HSZ];
  10.  
  11. void init(void) {
  12. for (int i = 0; i < HSZ; i++) {
  13. hash_table[i].next= NULL; /*hash_table[i]->val = NULL 이라고했다가 에러 떴음*/
  14. }
  15. }
  16.  
  17. /*해쉬테이블을 node_t의 포인터형식이 아니라 (헤드포인터 못쓰게함!) hash_table[].next를 첫 요소로 썼다. */
  18.  
  19. void insert_hash(int value) {
  20. int hash_adress = HASHING(value);
  21. struct node_t* node = hash_table[hash_adress].next; //첫요소.
  22. //포인터형식으로 받아야지 링크타고 계속 옆으로 가기 때문에..next를 첫요소로 받아야한다.
  23. struct node_t* node_before = NULL;
  24. for (; node; node_before = node, node = node->next) {
  25. if (node->val > value) break; //node->val이 value보다 크면 멈춘다 -> 이 이전에 삽입해줘야함 (node_before)
  26. }
  27. struct node_t* new_node = (struct node_t*)malloc(sizeof(struct node_t));
  28. new_node->val = value;
  29. if (node_before) //이전 노드가 있다면
  30. node_before->next = new_node; //이전노드의 링크가 new_node가 된다.
  31. else //이전노드가 없다면 맨 앞에 추가해야줘야 한다.
  32. hash_table[hash_adress].next = new_node;
  33.  
  34. if (node) //만약 node (뒤에 나올 노드가) 존재한다면
  35. new_node->next = node;
  36. else //뒤에 나올 노드가 존재하지 않는다면..null로
  37. new_node->next = NULL;
  38.  
  39.  
  40. }
  41.  
  42.  
  43.  
  44. int delete_hash(int value)
  45. {
  46. int hash_adress = HASHING(value);
  47. struct node_t* node = hash_table[hash_adress].next; //첫 노드를 next로.
  48. struct node_t* node_before = NULL;
  49. for (; node ; node_before = node, node = node->next) {
  50. if (node->val==value) { //만약 node->val과 지우려는 value가 같은 값을 갖는다면
  51. if (node_before != NULL) { //만약 이전 노드가 존재한다면 (맨 첫노드가 아니라면)
  52. node_before->next = node->next; //이전 노드가 지우려는 노드의 다음 노드를 가리키도록..(null일수도)
  53. }
  54. else if (node_before == NULL && node->next) { //만약 이전노드는 존재 안하는데 (첫요소) node->next는 존재한다면
  55. //즉 지우려는 요소가 첫요소라면
  56. hash_table[hash_adress].next = node->next; //첫요소를 그 다음 노드로 바꿔줌
  57. }
  58. else { //지우려는 요소가 첫요소고 그 다음 요소도 없다면 그냥 아예 첫요소를 null로 해줘야함
  59. //이거 안하니까 free된 heap영역 접근했다고 에러뜸
  60. hash_table[hash_adress].next= NULL;
  61. }
  62. //그 후 해제한다.
  63. free(node);
  64. return 1;
  65. }
  66. }
  67. return 0;
  68. }
  69.  
  70. void print_hash(int value)
  71. {
  72. int hash_adress = HASHING(value);
  73. struct node_t* node = hash_table[hash_adress].next;
  74. if (!node) printf(" there is no node");
  75. while (node) {
  76. printf("%d ", node->val);
  77. node = node->next;
  78. }
  79. }
  80.  
  81. int main()
  82. {
  83. init();
  84. insert_hash(6);
  85. insert_hash(127);
  86. insert_hash(0);
  87. insert_hash(8);
  88. insert_hash(25);
  89. insert_hash(35);
  90. insert_hash(45);
  91. insert_hash(36);
  92. //printf("%d %d", HASHING(0), HASHING(127));
  93. print_hash(0);
  94. puts("");
  95. printf("%d", delete_hash(25));
  96. puts("");
  97. print_hash(25);
  98. }
Add Comment
Please, Sign In to add comment