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 알고리즘