链表实现

本文探讨了Linux网络内幕中链表的实现细节,通过自定义链表代码,解析了链表节点的添加和删除过程,展示了指针的灵活性及链表在不同场景的应用。

最近看《深入理解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章,通知链表的注册和卸载就是按照类似的方式来实现的。

转载于:https://www.cnblogs.com/lotusswan/archive/2009/04/28/1445752.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值