首页 > 其他分享 >链表-adlist

链表-adlist

时间:2024-01-05 15:48:01浏览次数:31  
标签:listNode int double void list adlist 链表

2. 链表

相关文件

adlist.h
adlist.c

1. 定义

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

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;
  • dup函数用于复制链表节点所保存的值
  • free函数用于释放链表节点所保存的值
  • match函数则用于对比链表节点的值和另一个值是否相等

特点

  1. 双端链表

    访问前置和后置节点的时间复杂度都是O(1)

  2. 链表表头和表尾的listNode节点的prev和next都是NULL,对链表访问以NULL为终点

  3. list中保存有表头和表尾指针,方便访问

  4. list中保存有链表长度

  5. 多态:listNode使用void*来保存节点值,可以通过list中的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。下面的代码给出int和double的支持。

    int int_match(void *ptr, void *key) {
        int v1 = (*(int *)ptr);
        int v2 = (*(int *)key);
        return v1 == v2;
    }
    
    int double_match(void *ptr, void *key) {
        double v1 = (*(double *)ptr);
        double v2 = (*(double *)key);
        return v1 == v2;
    }
    
    void cmp(int flag){
        if(flag) printf("true\n");
        else printf("false\n");
    }
    
    int main() {
        struct list int_list;
        struct list double_list;
    
        int_list.match = int_match;
        double_list.match = double_match;
        
        struct listNode int_node;
        int* v1 = malloc(sizeof(int));
        *v1 = 1;
        int_node.value = v1;
        int v2 = 1;
        cmp(int_list.match(int_node.value, &v2));
    
        struct listNode double_node;
        double* v3 = malloc(sizeof(double));
        *v3 = 2.0;
        double_node.value = v3;
        double v4 = 2.0;
    
        cmp(double_list.match(double_node.value, &v4));
    }
    

标签:listNode,int,double,void,list,adlist,链表
From: https://www.cnblogs.com/INnoVationv2/p/17947387

相关文章

  • 数据结构【线性表之单链表】
    链表链表:线性表还可以使用链式存储方式保存,即线性表中的各个元素保存在各自的存储空间中,形成一个个节点。这些结点在内存的地址不要求是相邻的,它们之间通过指针连接起来。特点:灵活存储,不要求预先分配一块连续的空间,而是按需分配,随时需要,随时分配不要求分配的空间必须是相邻的没有......
  • 【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除
    文章目录一、元素操作1、首尾添加/删除元素2、获取首尾元素二、迭代器遍历容器1、正向迭代与反向迭代2、代码示例一、元素操作1、首尾添加/删除元素list双向链表容器提供了push_back、pop_back、push_front和pop_front等一系列用于操作列表元素的成员函数,函......
  • 【C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函
    文章目录一、list双向链表容器简介1、容器特点2、容器操作时间复杂度3、遍历访问5、头文件二、list双向链表容器构造函数1、默认无参构造函数2、创建包含n个相同元素的list双向链表3、使用初始化列表构造list双向链表4、使用另外一个list容器构造list双向链表容器......
  • 【C++】STL 容器 - list 双向链表容器 ③ ( list 常用 api 简介 | 中间位置 插入 / 删
    文章目录一、list双向链表容器的中间位置插入元素1、在指定位置插入1个元素-insert函数2、在指定位置插入n个相同元素-insert函数3、中间位置插入另一个容器的指定范围内的元素-insert函数二、list双向链表容器的中间位置删除元素1、删除容器中所有元素......
  • LeetCode-23 合并 K 个升序链表
    LeetCode-23合并K个升序链表给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链......
  • 【LeetCode】23. 合并K个升序链表
    一、题目描述给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2......
  • 代码随想录 小结02 链表
    第一题移除链表元素这题比较简单使用dummyHead的方式会比较简单不需要对头指针进行单独处理但是空间开销会大一些第二题设计链表类这个没什么好说的感觉有可能一些细节会忘记需要经常复习的一块第三题反转链表这题难度不大用一个tmp指针存储一下当前指针的next......
  • 链表相交问题
    链表链表相交问题思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题描述:现有两个单向链表,需要判断两个链表是否相交,若相交,返回链表最开始的交点,若不相交,则返回null算法思路:首先需要判断两个链表是否是环形链表,并获取环形链......
  • day03 代码随想录算法训练营 203. 移除链表元素
    题目:203.移除链表元素我的感悟:题目里的节点是已经给好的,创建虚拟节点,是为了方便处理头节点。加油,我可以的!!!!!理解难点:节点已经给好的创建虚拟节点代码难点:p是临时变量,类似于foriinrange(10)这里的i,本身是用完就扔的。返回值为什么不能是p.next?因为p是一个指针,......
  • 环形链表问题
    链表环形链表问题思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题来源:基于力扣141题进行拓展问题描述:给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存......