링크 ux 에서 링크 사용

Liux 에서 링크 의 사용 방법 은 우리 가 일반적인 것 과 다 릅 니 다. 일반적인 상황 에서 링크 의 next 지침 은 노드 의 시작 위 치 를 가리 키 지만 Liux 에서 링크 는 다음 노드 에서 링크 가 있 는 주 소 를 가리 키 는데 이것 은 좋 은 처리 방법 입 니 다. 데이터 구 조 를 바 꿀 때마다 처리 하지 않 아 도 됩 니 다.이런 방법의 난점 은 링크 주소 에서 원시 구조 체 의 주 소 를 추산 하 는 데 있다.
   정 리 된 코드 는 다음 과 같 습 니 다.
list.h
#ifndef _LIST_H_
#define _LIST_H_

/**********************************************************
  :   MEMBER   TYPE        
**********************************************************/
#define offsetof(TYPE, MEMBER)  (unsigned long)(&(((TYPE*)0)->MEMBER))


/**********************************************************
  :            
  : 
	ptr:	type         
	type:	     
	member:	      
**********************************************************/
#define container_of(ptr, type, member)	(type *)((char*)(ptr) - offsetof(type, member))

#define LIST_HEAD_INIT(name)	{&(name), &(name)}

struct list
{
	struct list *prev, *next;
};

static inline void list_init(struct list *list)
{
	list->next = list;
	list->prev = list;
}

static inline int list_empty(struct list *list)
{
	return list->next == list;
}

//  new_link   link  
static inline void list_insert(struct list *link, struct list *new_link)
{
	new_link->prev		 = link->prev;
	new_link->next		 = link;
	new_link->prev->next = new_link;
	new_link->next->prev = new_link;
}

/**********************************************************
  :  new_link     list   
**********************************************************/
static inline void list_append(struct list *list, struct list *new_link)
{
	list_insert(list, new_link);
}

/**********************************************************
	  :         
**********************************************************/
static inline void list_remove(struct list *link)
{
	link->prev->next = link->next;
	link->next->prev = link->prev;
}

/**********************************************************
  link            
link:         
type:         
member:         
**********************************************************/
#define list_entry(link, type, member)  container_of(link, type, member)


/**********************************************************
                 
list:        
type:         
member:         
Note:
                 ,      ,     
**********************************************************/
#define list_head(list, type, member) list_entry((list)->next, type, member)

/**********************************************************
                 
list:        
type:         
member:         
**********************************************************/
#define list_tail(list, type, member) list_entry((list)->prev, type, member)

/**********************************************************
                 
elm:           
type:         
member:         (     )
**********************************************************/
#define list_next(elm,type,member) list_entry((elm)->member.next, type, member)

/**********************************************************
              
pos :      
type :       
list :      
member :         (     )
Note :       ,       ,pos             
**********************************************************/
#define list_for_each_entry(pos, type, list, member)	\
for (pos = list_head(list, type, member);				\
	&pos->member != (list);								\
	pos = list_next(pos, type, member))


/**********************************************************
example function
**********************************************************/
void list_example(void);
#endif

테스트 코드:
list.cpp
#include "stdafx.h"


#include "list.h"
#include <stdlib.h>

struct list g_list = LIST_HEAD_INIT(g_list);

struct test
{
    int a;
    int b;
    char c;
    struct list link;
};

void CreateData(int a, int b, char c)
{
    struct test *pdata = (struct test *)malloc(sizeof(struct test));
    pdata->a = a;
    pdata->b = b;
    pdata->c = c;
    list_append(&g_list, &(pdata->link));
}

void listTest(void)
{
    //     
    CreateData(0,0,0);   
    CreateData(10,11,12);
    CreateData(20,21,22);
    CreateData(30,31,32);
    CreateData(40,41,42);
    
    //    
    struct list *templist = &g_list; 
    struct test *pdata;
    pdata = list_entry(templist->next, struct test, link); 

    templist = templist->next;
    pdata = list_entry(templist->next, struct test, link);

    //   1
    for (templist = g_list.next; templist != &g_list; templist = templist->next)
        pdata = list_entry(templist, struct test, link);

    //   2
    //pdata = list_head(&g_list, struct test, link);
    for (pdata = list_head(&g_list, struct test, link); &(pdata->link) != &g_list; pdata = list_next(pdata, struct test, link))
    {
        pdata->a = 1;
    }

    //   3
    list_for_each_entry(pdata, struct test, &g_list, link)
    {
        pdata->b = 2;    
    }
    

}

 

좋은 웹페이지 즐겨찾기