在看《算法精解:C语言描述》的双链表chtbl和redis的双链表adlist.c发现代码思路基本是一致的。

但是,对于链表的初始化却不一样

1.《算法精解:C语言描述》风格

/*****************************************************************************
*                                                                            *
*  Define a structure for doubly-linked list elements.                       *
*                                                                            *
*****************************************************************************/typedef struct DListElmt_ {void               *data;
struct DListElmt_  *prev;
struct DListElmt_  *next;} DListElmt;/*****************************************************************************
*                                                                            *
*  Define a structure for doubly-linked lists.                               *
*                                                                            *
*****************************************************************************/typedef struct DList_ {int                size;int                (*match)(const void *key1, const void *key2);
void               (*destroy)(void *data);DListElmt          *head;
DListElmt          *tail;} DList;

一开始定义结构体在栈上分配内存,后面传递结构体地址

int main(int argc, char **argv) {DList              list;
DListElmt          *element;int                *data,i;/*****************************************************************************
*                                                                            *
*  Initialize the doubly-linked list.                                        *
*                                                                            *
*****************************************************************************/dlist_init(&list, free);

init的时候传递结构体指针,直接赋值

void dlist_init(DList *list, void (*destroy)(void *data)) {/*****************************************************************************
*                                                                            *
*  Initialize the list.                                                      *
*                                                                            *
*****************************************************************************/list->size = 0;
list->destroy = destroy;
list->head = NULL;
list->tail = NULL;return;}

2.Redis的风格

init的时候在堆上动态分配内存,返回结构体指针

/* Create a new list. The created list can be freed with* AlFreeList(), but private value of every node need to be freed* by the user before to call AlFreeList().** On error, NULL is returned. Otherwise the pointer to the new list. */
list *listCreate(void)
{struct list *list;if ((list = zmalloc(sizeof(*list))) == NULL)return NULL;list->head = list->tail = NULL;list->len = 0;list->dup = NULL;list->free = NULL;list->match = NULL;return list;
}
typedef struct listNode {struct listNode *prev;struct listNode *next;void *value;
} listNode;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;

说透一级指针和二级指以及(void**)&在双链表中的应用  [这里分析了双链表的删除]

结构体的两种声明方式:堆上和栈上以及在双链表的应用相关推荐

  1. JavaScript函数的两种声明方式,你了解多少?

    函数的两种声明方式 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

  2. C语言结构体的四种定义方式

    1.先定义结构体类型,再定义结构体变量 struct student{int age;char* name; };struct student stu;//stu为student的结构体变量 2.定义 ...

  3. c语言定义学生结构体类型,C语言中结构体的三种定义方式

    c语言中结构体的定义: struct 结构体名{ 成员列表: ..... }结构体变量: 7.1.1 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 ...

  4. 前端学习(749):函数两种声明方式

  5. JavaScript函数的两种声明方式(4)

  6. 结构体变量的两种初始化方式

    结构体变量的初始化 定义时初始化 定义之后初始化 结构体白能量的初始化方式有两种,可以在定义的时候或定义之后对结构体变量进行初始化. 定义时初始化 一般情况下我们都是在定义的时候对它进行初始化,因为那 ...

  7. sa结构组网方式_5G网络包含NSA和SA两种组网方式

    近日,江苏联通联合华为在南京摄山新城西开通NSA/SA双模共享站点,同时满足了区域内2B/2C不同应用需求. 5G网络包含NSA和SA两种组网方式,由于协议演进,终端要求,5G网络前期采用NSA组网的 ...

  8. 结构体是什么、声明和定义

    目录 结构体是什么.声明和定义 1.结构体类型的概念 2. 结构体的声明与定义 2.1 结构体声明(结构布局) 2.2 结构体变量声明(创建) 2.3 3. 定义结构体变量的几种方式 3.1 先声明结 ...

  9. 图的两种存储方式---邻接矩阵和邻接表

    图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...

最新文章

  1. 两个字符串之间的复制,不使用strcopy()函数
  2. 这么详细的Python matplotlib底层原理浅析
  3. StringUtils之equals
  4. Apache检查配置文件语法
  5. Transformer性能优化:运算和显存
  6. RTEMS 的 AT91SAM9260 移植(8): 编译
  7. 总结2010展望2011
  8. Java PushbackReader ready()方法与示例
  9. Java数据库篇9——备份与还原、忘记密码
  10. php地址选择插件,微信小程序中关于三级联动地址选择器的实例分享
  11. java未_Java未被捕获的异常
  12. SQL注入之MYSQL注入
  13. mysql实现不同电脑间局域网连接
  14. Bypass Windows AppLocker
  15. wps去除登陆_WPS强制用户登录功能,这是要闹哪样?
  16. 第二次热带近岸出海记录
  17. 添加分类、标签云(球状)、彩色标签
  18. linux cut命令
  19. python pyinstaller 打包exe文件,(附带图片 + 自己、别人电脑上均可以运行)
  20. 每日一题 --- P1093 [NOIP2007 普及组] 奖学金[洛谷][JAVA]

热门文章

  1. 图像识别-opencv
  2. 2021-08-08概率论与数理统计-第二章
  3. 解决ros安装 使用roscore命令测试问题
  4. (Python)石头剪刀布游戏
  5. 【目标检测】(5) YOLOV1 目标检测原理解析
  6. Toronto-3D:用于城市道路语义分割的大规模移动激光雷达数据集
  7. QT 烦人的parent该如何理解
  8. vue引入图片路径的三种主要方法
  9. ATS插件中配置文件自动更新思路
  10. 数据库2.0 -- 数据类型和数据表的基本操作