os_dl_list

// dl_list.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

#define OS_OK        (1)
#define OS_FAIL        (0)
#define OS_ERROR    (~1)

typedef unsigned long UINT32;
#define OS_PRINT printf
#define OS_OFF_SET_OF(type, member) ((long)&(((type *)0)->member))
#define OS_DL_LIST_ENTRY(item, type, member) \
    ((type *)((char *)item - OS_OFF_SET_OF(type, member))) \

#pragma pack(1)
typedef struct OS_DL_LIST {//双向链表,内核最重要结构体
#ifdef _DEBUG
    struct OS_DL_LIST *self;
#endif 
    struct OS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node *///前驱节点(左手)
    struct OS_DL_LIST *pstNext; /**< Current node's pointer to the next node *///后继节点(右手)
} OS_DL_LIST;
#pragma pack()

#ifdef _DEBUG
#define OS_DL_LIST_STATIC(name) OS_DL_LIST name = {&name,NULL,NULL}
#else
#define OS_DL_LIST_STATIC(name) OS_DL_LIST name = {NULL,NULL}
#endif

//初始化链表:对链表进行初始化。
void OS_ListInit(OS_DL_LIST *list)
{
#ifdef _DEBUG
list->self = list;
#endif
    list->pstNext = list;
    list->pstPrev = list;
}
                                                             
//增加节点:将新节点添加到链表中。
void OS_ListAdd(OS_DL_LIST *list, OS_DL_LIST *node)
{      
#ifdef _DEBUG
    node->self = node; 
#endif
    node->pstNext = list->pstNext;
    node->pstPrev = list;
    list->pstNext->pstPrev = node;
    list->pstNext = node;
}

//删除节点:将指定的节点从链表中删除。
void OS_ListDelete(OS_DL_LIST *node)
{
    node->pstNext->pstPrev = node->pstPrev;
    node->pstPrev->pstNext = node->pstNext;
    node->pstNext = NULL;
    node->pstPrev = NULL;
}
//判断双向链表是否为空:判断链表是否为空
int OS_ListEmpty(OS_DL_LIST *list)
{
    if ((list->pstPrev==NULL)||(list->pstNext==NULL))
        return OS_ERROR;
    else if ((list->pstPrev==list)&&(list->pstNext==list))
        return OS_OK;
    else
        return OS_FAIL;
}
//删除节点并初始化链表:将指定的节点从链表中删除,使用该节点初始化链表。
void OS_ListDelInit(OS_DL_LIST *node)
{
    node->pstNext->pstPrev = node->pstPrev;
    node->pstPrev->pstNext = node->pstNext;
    node->pstNext = node;
    node->pstPrev = node;
}

//链表中插入节点:从头部插入节点。
void OS_ListHeadInsert(OS_DL_LIST *list, OS_DL_LIST *node)
{
    OS_ListAdd(list,node);     
}
//在链表尾端出插入节点:将节点插入到双向链表尾端。
void OS_ListTailInsert(OS_DL_LIST *list, OS_DL_LIST *node)
{
    OS_ListAdd(list->pstPrev, node);
}
                                  
//链表中插入链表:两个循环链表合成一个大循环链表。
void OS_ListAddList(OS_DL_LIST *oldList, OS_DL_LIST *newList)
{                                                  
    newList->pstPrev->pstNext = oldList->pstNext;
    oldList->pstNext->pstPrev = newList->pstPrev;
    newList->pstPrev = oldList;
    oldList->pstNext = newList;
}

//链表中插入链表:从头部插入链表。
void OS_ListHeadInsertList(OS_DL_LIST *oldList, OS_DL_LIST *newList)
{
    OS_ListAddList(oldList, newList);    
}

//链表中插入节点:从尾端插入链表。
void OS_ListTailInsertList(OS_DL_LIST *oldList, OS_DL_LIST *newList)
{
    OS_ListAddList(oldList->pstPrev, newList);     
}

static UINT32 DLlist_sample()
{ 
    OS_DL_LIST_STATIC(DLlist);
    OS_DL_LIST_STATIC(DLlistNode01);
    OS_DL_LIST_STATIC(DLlistNode02);
    OS_DL_LIST_STATIC(DLlistNode03);  

    OS_PRINT("Initial head\n");
    OS_ListInit(&DLlist);

    OS_ListAdd(&DLlist,&DLlistNode01);
    if (DLlistNode01.pstNext == &DLlist && DLlistNode01.pstPrev == &DLlist)
    {
        OS_PRINT("Add DLlistNode01 success \n");
    }

    OS_ListTailInsert(&DLlist,&DLlistNode02);
    if (DLlistNode02.pstNext == &DLlist && DLlistNode02.pstPrev == &DLlistNode01)
    {
        OS_PRINT("Tail insert DLlistNode02 success \n");
    }

    OS_ListHeadInsert(&DLlistNode02,&DLlistNode03);
    if (DLlistNode03.pstNext == &DLlist && DLlistNode03.pstPrev == &DLlistNode02)
    {
        OS_PRINT("Head insert DLlistNode03 success \n");
    }

    OS_ListDelInit(&DLlistNode03);
    OS_ListDelete(&DLlistNode01);
    OS_ListDelete(&DLlistNode02);

    if (OS_ListEmpty(&DLlist)==OS_OK)
    {
        OS_PRINT("Delete success \n");
    }

    return OS_OK;
}

static UINT32 DLlist_sample_2()
{ 
    OS_DL_LIST_STATIC(DLlist01);
    OS_DL_LIST_STATIC(DLlist01Node01);
    OS_DL_LIST_STATIC(DLlist01Node02);
    OS_DL_LIST_STATIC(DLlist01Node03); 
    OS_DL_LIST_STATIC(DLlist02);
    OS_DL_LIST_STATIC(DLlist02Node01);
    OS_DL_LIST_STATIC(DLlist02Node02);
    OS_DL_LIST_STATIC(DLlist02Node03);

    OS_PRINT("Initial head 2\n");
    OS_ListInit(&DLlist01);

    OS_ListAdd(&DLlist01,&DLlist01Node01);
    OS_ListAdd(&DLlist01,&DLlist01Node02);
    OS_ListAdd(&DLlist01,&DLlist01Node03);

    OS_ListInit(&DLlist02);
    OS_ListAdd(&DLlist02,&DLlist02Node01);
    OS_ListAdd(&DLlist02,&DLlist02Node02);
    OS_ListAdd(&DLlist02,&DLlist02Node03);

    OS_ListAddList(&DLlist01,&DLlist02);
    if (DLlist01.pstNext == &DLlist02 && DLlist02.pstPrev == &DLlist01)
    {
        OS_PRINT("DLlist01 insert DLlist02 success \n");
    }
    /*OS_ListTailInsertList(&DLlist01,&DLlist02);
    if (DLlist01.pstPrev == &DLlist02Node03 && DLlist02.pstPrev == &DLlist01Node03)
    {
        OS_PRINT("DLlist01 insert DLlist02 success \n");
    }*/
    OS_DL_LIST *curr = &DLlist01;
    do 
    {
        OS_PRINT("curr = 0x%x\n", curr);
        curr = curr->pstNext;
    } while (curr != &DLlist01);

    OS_PRINT("\\\\\\\\\\\\\\\\\\\\\\\n");
    do 
    {
        OS_PRINT("curr = 0x%x\n", curr);
        curr = curr->pstPrev;
    } while (curr != &DLlist01); 
    return OS_OK;
}

typedef struct Student_Struct
{
    OS_DL_LIST dlist;
    char name[16];
} stStudent;

static UINT32 DLlist_sample_3()
{ 
    stStudent st;                    
    stStudent *p = NULL;
    OS_DL_LIST_STATIC(DLlist);

    OS_PRINT("Initial head 3\n");
    OS_ListInit(&DLlist);
    strcpy(st.name, "DLlist");                                     

    OS_ListAdd(&DLlist,&st.dlist);

    p = OS_DL_LIST_ENTRY(DLlist.pstNext, stStudent, dlist);

    OS_PRINT("name = %s\n", p->name);

     return OS_OK;
}

int _tmain(int argc, _TCHAR* argv[])
{
    DLlist_sample();
    DLlist_sample_2();
    DLlist_sample_3();
    return 0;
}

显示结果:

Initial head
Add DLlistNode01 success
Tail insert DLlistNode02 success
Head insert DLlistNode03 success
Delete success
Initial head 2
DLlist01 insert DLlist02 success
curr = 0x19fe34
curr = 0x19fde4
curr = 0x19fda8
curr = 0x19fdbc
curr = 0x19fdd0
curr = 0x19fdf8
curr = 0x19fe0c
curr = 0x19fe20
\\\\\\\\\\\
curr = 0x19fe34
curr = 0x19fe20
curr = 0x19fe0c
curr = 0x19fdf8
curr = 0x19fdd0
curr = 0x19fdbc
curr = 0x19fda8
curr = 0x19fde4
Initial head 3
name = DLlist

 

上一篇:<dl>


下一篇:个人学习简单总结接触到的dl模型分类,待补充和完善