链表实现

最近看《深入理解linux网络内幕》,发现其链表实现颇为有趣,于是兴趣盎然,按照其原理自己写了一些调试代码。前一段时间看linux源码和vxworks源码,发现自己是那么的无知,小小的一个链表,居然会有那么多实现方式,而且各具优缺点,应用场景不一。不得不称赞指针的妙处,以前一直认为指针也没什么,不就是一个内存地址吗?现在发现自己是大错特错。

不再废话,切入正题。先看看链表定义,和通常的链表定义没有区别,单链表,value+后向指针即可:

typedef struct linkedlist list;
typedef 
struct linkedlist
{
    
int value;
    list 
* next;
    
int pripority;
};

 比较有特色的是链表节点的添加和删除,先看添加函数:

void list_add(list ** head, list *node)
{
    
while(*head)
    {
        
if(node->pripority > (*head)->pripority)
        {
            
break;
        }
        head 
= &((*head)->next);
    }
    node
->next = *head;
    
*head = node;
}

为了简便,上面的代码省去了一些调试代码和一些参数检测代码;上面的代码与常用的链表实现代码区别在于list_add的第一个参数head,是个指针的指针,而不是通常意义上的第一个节点的地址,所以比较有趣;与此类似,链表的删除也是类似的:

void list_mv(list **head, list *node)
{
    
while(*head)
    {
        
if(*head != node)
        {
            head 
= &(*head)->next;
        }
        
else
        {
            
*head = node->next;
            
break;
        }
    }
}

 感兴趣的朋友可以去看看《深入理解linux网络内幕》的第4章,通知链表的注册和卸载就是按照类似的方式来实现的。

posted @ 2009-04-28 23:26  Articles about .NET  阅读(542)  评论(0编辑  收藏  举报