惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
美团技术团队
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
博客园_首页
雷峰网
雷峰网
V
V2EX
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
量子位
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Jina AI
Jina AI
月光博客
月光博客
L
LangChain Blog

博客园 - Articles about .NET

继续伤感 qemu1.4.1配置参数 卸载qemu 1.4.1 安装qemu 1.4.1 人生真是奇妙 可怜的国米 世界杯,无趣! 伤感 放纵 失落 博文阅读密码验证 - 博客园 穆里尼奥,你是否还应该继续留在国米? 世事难料 windows下搭建Linux开发环境 大萧条 临安两日游 欢聚时刻 变迁 人生如梦
链表实现
Articles about .NET · 2009-04-28 · via 博客园 - Articles about .NET

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