hlist 해시 링크
struct list_head {
struct list_head *next, *prev;
};
struct hlist_head {struct hlist_node *first;}; struct hlist_node {struct hlist_node *next, **pprev;};
더 블 헤드 (next, prev) 의 더 블 링크 는 Hash 표 에 있어 '너무 낭비 적' 이기 때문에 Hash 표 전용 hlist 데이터 구 조 를 따로 설계 했다. 단일 포인터 표 두 쌍 순환 링크 표, hlist 의 표 두 는 첫 번 째 노드 를 가리 키 는 지침 만 있 고 끝 노드 를 가리 키 는 지침 이 없다.이렇게 하면 대량의 Hash 표 에 저 장 된 헤더 가 공간 소 모 를 절반 으로 줄 일 수 있다.pprev 는 hlist 가 완전한 순환 링크 가 아니 기 때문에 사용 할 수 밖 에 없습니다.list 에서 표 두 와 노드 는 같은 데이터 구조 이 고 prev 를 직접 사용 하 는 것 은 문제 가 없습니다.hlist 에서 표 두 는 prev 도 없고 next 도 없고 first 만 있 습 니 다.표 두 의 first 지침, 즉 표 두 의 first 지침 을 통일 적 으로 수정 하기 위해 서 는 새로 삽 입 된 노드 를 가리 키 는 부분 을 수정 해 야 합 니 다. hlist 는 pprev 를 설계 하 였 습 니 다.hlist 노드 의 pprev 는 이전 노드 를 가리 키 는 지침 이 아니 라 이전 노드 (표 머리 일 수 있 음) 의 next (표 머리 에 대해 first) 지침 (struct list head * pprev) 을 가리 키 며 표 머리 에 삽 입 된 동작 은 일치 하 는 '* (node - > pprev)' 을 통 해 이전 노드 의 next (또는 first) 지침 을 방문 하고 수정 할 수 있 습 니 다.주: pprev 는 이전 노드 의 next 지침 을 가리 키 며, next 는 hlist 를 가리 키 고 있 습 니 다.node 의 지침, 그래서 pprev 는 hlist 를 가리 키 는 것 입 니 다.node 의 지침.
메모: pprev 는 list 를 향 한 prev 처럼 hlist 를 가리 키 는 것 으로 이해 할 수 있 습 니 다.node 의 지침, 또 hlistnode 의 첫 번 째 요소 next 는 hlist 를 가리 키 는 것 입 니 다.node 의 지침, pprev 도 next 를 가리 키 는 지침 입 니 다. 즉, pprev 는 hlist 를 가리 키 는 지침 입 니 다.node 의 지침.
struct hlist_node Prev;
struct hlist_node *pprev = (struct hlist_node *) Prev = (struct hlist_node *) (struct hlist_node * next) = struct hlist_node ** next;
다음은 hlist 에서 자주 사용 하 는 매크로 입 니 다.
#define HLIST_HEAD_INIT { .first = NULL }
#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
#define INIT_HLIST_NODE(ptr) ((ptr)->next = NULL, (ptr)->pprev = NULL)
다음은 hlist 만 열거 합 니 다.add_before 조작 함수, 기타 hlist 링크 조작 함수 조작 방법 유사.이 함수 의 인자 next 는 비어 있 을 수 없습니다.그것 은 next 앞 에 n 노드 를 넣 었 다.함수 의 실현 은 list 에 대응 하 는 함수 와 유사 합 니 다.static inline void __hlist_del(struct hlist_node *n)
{
struct hlist_node *next = n->next;
struct hlist_node **pprev = n->pprev;
*pprev = next;
if (next)
next->pprev = pprev;
}
static inline void hlist_add_before(struct hlist_node *n,struct hlist_node *next){n->pprev = next->pprev;n->next = next;next->pprev = &n->next;*(n->pprev) = n;} #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
#define hlist_for_each(pos, head) /
for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); /
pos = pos->next)
주소http://blog.chinaunix.net/u/12592/showart.php?id=451619
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.