Page 440 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 440

20    Node *temp;
                     21    while(p != NULL) {
                     22      if(p->data.no == x->no)         /* 이 키는 이미 등록됨 */
                     23        return 1;                   /* 추가   실패 */
                     24      p = p->next;                  /* 다음 노드를 선택 */
                     25    }
                     26    if((temp = calloc(1, sizeof(Node))) == NULL)
                     27      return 2;
                     28    SetNode(temp, x, h->table[key]);     /* 추가하는   노드에 값을 설정 */
                     29    h->table[key] = temp;
                     30    return 0;                       /* 추가   성공 */
                     31  }
                     32                                                      (실습 11-4[C]에서 계속)



                   요소를 추가하는 Add 함수

                   포인터 x가 가리키는 데이터를 추가하는 함수입니다.

                   13을 추가하는 경우(그림 11-7  a  )

                   13의 해시 값은 0이고 table[0]은 NULL입니다.  b  와 같이 13을 저장하는 노드를 새로 만들
                   고 그 노드에 대한 포인터를 table[0]에 대입합니다.


                   46을 추가하는 경우(그림 11-7  a  )

                   46의 해시 값은 7이고 table[7]의 버킷에는 20과 33을 연결하는 리스트의 포인터가 저장되
                   어 있습니다. 이 리스트에는 추가할 값(46)이 존재하지 않으므로 리스트의 맨 앞에 46을 삽입
                   합니다. 좀 더 자세히 설명하면 추가할 값(46)을 저장하는 노드를 새로 만들고 그 노드에 대한

                   포인터를 table[7]에 대입합니다. 그리고 삽입한 노드가 갖는 다음 노드에 대한 포인터(next)
                   가 20을 저장한 노드를 가리키도록 업데이트합니다( b ).


                   요소를 추가하는 과정을 정리하면 아래와 같습니다.



                     1. 해시 함수가 키 값을 해시 값으로 변환합니다.
                     2. 해시 값을 인덱스로 하는 버킷을 선택합니다.
                     3.   버킷에 저장된 포인터가 가리키는 연결 리스트를 처음부터 순서대로 검색합니다. 키 값과 같은 값을 찾으면
                       키 값이 이미 등록된 상태이므로 추가에 실패합니다. 끝까지 스캔하여 찾지 못하면 리스트의 맨 앞 위치에
                       노드를 삽입합니다.





                   440   C 알고리즘
   435   436   437   438   439   440   441   442   443   444   445