본문 바로가기
Computer Science

Generic Hash 타입 설계

by OKOK 2021. 4. 29.
void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
{
	struct hlist_node *first = h->first;
	n->next = first;
    if(first)
    	first->pprev = &n->next;
    h->first = n;
    n->pprev = &h->first;
}

h->first 가 포인터이기때문에 이것을 가리키기 위해서 이중 포인터를 사용함.

first 는 기존 노드를 가리킴. 그래서 새로운 노드가 들어왔을떄.

n->next = first; 했을 때 같은 곳을 가리킴

first->pprev . first가 기존 노드를 가리키는 포인터이므로 first->pprev 는 &n->next를 가리킴

노드가 오든 포인터이든 둘 다 가리킬 수 있음. 

 

sturct hlist_node *first = h->first; next, pprev 를 따로 쓰지 않고, 가리키는 위치는 next임.

 

#include <stdio.h>
#include <stdlib.h>

struct hlist_head {
	struct hlist_node* first;
};

struct hlist_node {
	struct hlist_node* next, ** pprev;
};

void hlist_add_head(struct hlist_node* n, struct hlist_head* h)
{
	struct hlist_node* first = h->first;
	n->next = first;
	if (first)
		first->pprev = &n->next;
	h->first = n;
	n->pprev = &h->first;
}
/*
#define offsetof(TYPE, MEMBER)	((size_t)&((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({                      \
	const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
	(type *)( (char *)__mptr - offsetof(type,member) );})
//-------------------------------------------------
*/

#define  container_of(ptr, type, member) (type*)((char*)ptr-(unsigned long)&((type*)0)->member)
#define  HASH_MAX   8

typedef struct
{
	int sno;
	struct hlist_node hash;
} SAWON;

int hash_sno(int sno)
{
	return sno % HASH_MAX;
}

void display(struct hlist_head* heads)
{
	int i;
	struct hlist_node* temp;
	SAWON* s;
	system("clear");
	for (i = 0; i < HASH_MAX; i++)
	{
		printf("[%d]", i);
		for (temp = heads[i].first; temp; temp = temp->next)
		{
			s = container_of(temp, SAWON, hash);
			printf("<->[%d]", s->sno);
		}
		printf("\n");
	}
	getchar();
}

int main()
{
	struct hlist_head heads[HASH_MAX] = { 0, };
	SAWON s[30] = { 0, };
	int i;
	int sno;

	display(heads);
	for (i = 0; i < 30; i++)
	{
		sno = 1000 + i;
		s[i].sno = sno;
		hlist_add_head(&s[i].hash, &heads[hash_sno(sno)]);
		display(heads);
	}
	return 0;
}

'Computer Science' 카테고리의 다른 글

증강 트리  (0) 2021.04.30
Generic Hash 2  (0) 2021.04.29
Generic Hash  (0) 2021.04.29
최신 매크로 분석 container_of  (0) 2021.04.29
타입의 의존성 제거(container_of 버전)  (0) 2021.04.28

댓글