链表实现
最近看《深入理解linux网络内幕》,发现其链表实现颇为有趣,于是兴趣盎然,按照其原理自己写了一些调试代码。前一段时间看linux源码和vxworks源码,发现自己是那么的无知,小小的一个链表,居然会有那么多实现方式,而且各具优缺点,应用场景不一。不得不称赞指针的妙处,以前一直认为指针也没什么,不就是一个内存地址吗?现在发现自己是大错特错。
不再废话,切入正题。先看看链表定义,和通常的链表定义没有区别,单链表,value+后向指针即可:
typedef struct linkedlist list;
typedef struct linkedlist
{
int value;
list * next;
int pripority;
};
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;
}
{
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;
}
}
}
{
while(*head)
{
if(*head != node)
{
head = &(*head)->next;
}
else
{
*head = node->next;
break;
}
}
}
感兴趣的朋友可以去看看《深入理解linux网络内幕》的第4章,通知链表的注册和卸载就是按照类似的方式来实现的。