设为首页 收藏本站
查看: 1987|回复: 0

[经验分享] 深入redis内部--实现双向链表

[复制链接]

尚未签到

发表于 2015-7-22 11:46:44 | 显示全部楼层 |阅读模式
  数据结构的应用--Adlist.h定义
  1.节点结构
  typedef struct listNode {
    struct listNode *prev;  //前向节点
    struct listNode *next; //后向节点
    void *value;              //该节点的值
} listNode;
  2.双向链表结构
  typedef struct list {
    listNode *head;              //头节点
    listNode *tail;                //尾节点
    void *(*dup)(void *ptr); //复制函数
    void (*free)(void *ptr);   //释放函数
    int (*match)(void *ptr, void *key);  //匹配函数,查找节点使用
    unsigned long len;          //双向链表的长度即节点的个数
} list;
  3.双向链表遍历器
  typedef struct listIter {
    listNode *next;   //下一个节点
    int direction;
} listIter;
  方向定义
  #define AL_START_HEAD 0  //向前查找
   #define AL_START_TAIL 1    //向后查找
  4.宏定义函数
  #define listLength(l) ((l)->len)
#define listFirst(l) ((l)->head)
#define listLast(l) ((l)->tail)
#define listPrevNode(n) ((n)->prev)
#define listNextNode(n) ((n)->next)
#define listNodeValue(n) ((n)->value)
#define listSetDupMethod(l,m) ((l)->dup = (m))
#define listSetFreeMethod(l,m) ((l)->free = (m))
#define listSetMatchMethod(l,m) ((l)->match = (m))
#define listGetDupMethod(l) ((l)->dup)
#define listGetFree(l) ((l)->free)
#define listGetMatchMethod(l) ((l)->match)
  5.定义函数
  list *listCreate(void); //创建一个新的链表。该链表可以使用AlFree()方法释放。
  //但使用AlFree()方法前需要释放用户释放私有节点的值。
  //如果没有创建成功,返回null;创建成功则返回指向新链表的指针。
  
void listRelease(list *list);  //释放整个链表,此函数不会执行失败。调用zfree(list *list)方法,定义在Zmalloc.c中。
  
list *listAddNodeHead(list *list, void *value); //向链表头部中增加一个节点
  
list *listAddNodeTail(list *list, void *value);    //向链表尾部增加一个节点
  
list *listInsertNode(list *list, listNode *old_node, void *value, int after);//向某个节点位置插入节点 after为方向
  
void listDelNode(list *list, listNode *node);//从链表上删除特定节点,调用者释放特定私用节点的值。
  //该函数不会执行失败
listIter *listGetIterator(list *list, int direction);//返回某个链表的迭代器。
  //迭代器的listNext()方法会返回链表的下个节点。direction是方向
  //该函数不会执行失败。
  
listNode *listNext(listIter *iter);               
  
void listReleaseIterator(listIter *iter);            //释放迭代器的内存。
  
list *listDup(list *orig);                               //复制整个链表。当内存溢出时返回null,成功时返回原链表的一个备份
  //不管该方法是否执行成功,原链表不会改变。
  
listNode *listSearchKey(list *list, void *key);  //从特定的链表查找key。成功则返回第一个匹配节点的指针
  //如果没有匹配,则返回null。
  
listNode *listIndex(list *list, long index);     //序号从0开始,链表的头的索引为0.1为头节点的下个节点。一次类推。
  //负整数用来表示从尾部开始计数。-1表示最后一个节点,-2倒数第二个节点
  //如果超过链表的索引,则返回null
  
void listRewind(list *list, listIter *li) {
    li->next = list->head;
    li->direction = AL_START_HEAD;
}
void listRewindTail(list *list, listIter *li) {
    li->next = list->tail;
    li->direction = AL_START_TAIL;
}
  
void listRotate(list *list);                 //旋转链表,移除尾节点并插入头部。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-89443-1-1.html 上篇帖子: redis php扩展简单使用 下篇帖子: .Net中使用Redis
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表