Insert HeadList 와 CONTAININGRECORD

1494 단어 데이터 구조
LIST_ENTRY 는 양 방향 링크 의 데이터 구 조 를 정의 합 니 다.
typedef struct _LIST_ENTRY {
  struct _LIST_ENTRY  *Flink;
  struct _LIST_ENTRY  *Blink;
} LIST_ENTRY, *PLIST_ENTRY;

 함수 InitializeListHead (BUEList) 로 초기 화 합 니 다.
데이터 구 조 를 삽입 해 야 한다 고 가정 합 니 다.
strct B_U_E{

LIST_ENTRY BUELink;

...

...

} BUE;
 
그리고 BUE 의 인 스 턴 스 대상 을 삽입 하기 시작 합 니 다. InsertHeadList () 함 수 를 호출 합 니 다.
BUE abue = ...
InsertHeadList(&BUEList, &abue->BUELink);
이렇게 하면 삽입 동작 이 완 료 됩 니 다.
 
현재 LIST 에서 BUE 의 대상 데 이 터 를 읽 으 려 고 합 니 다.CONTAINING_RECORD 이 매크로.
#define CONTAININT_RECORD(address, type, field) \
             ((type*)((PCHAR)(address) - (PCHAR)(&((type*)0)->field)))

 이 매크로 는 메모리 의 모든 구조 체 의 첫 주 소 를 가 져 오 는 데 사 용 됩 니 다. 제공 할 인 자 는 구조 체 의 한 구성원 (field) 의 주소 address, 구조 체 의 유형 type, 주 소 를 제공 하 는 그 구성원 의 이름 field 입 니 다.
그래서 만약 우리 가 첫 번 째 데 이 터 를 읽 고 싶다 면:
Link = BUEList.Flink;
            
            while (Link != &BUEList)
            {
                bue= CONTAINING_RECORD(Link,BUE, BUELink);
 

       Link = Link->Flink;
         }

 이렇게 하면 데이터 읽 기 작업 이 완 료 됩 니 다.
 누락 된 점 이 있 는 지 모르겠다.

좋은 웹페이지 즐겨찾기