结构体的两种声明方式:堆上和栈上以及在双链表的应用
在看《算法精解: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**)&在双链表中的应用 [这里分析了双链表的删除]
结构体的两种声明方式:堆上和栈上以及在双链表的应用相关推荐
- JavaScript函数的两种声明方式,你了解多少?
函数的两种声明方式 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...
- C语言结构体的四种定义方式
1.先定义结构体类型,再定义结构体变量 struct student{int age;char* name; };struct student stu;//stu为student的结构体变量 2.定义 ...
- c语言定义学生结构体类型,C语言中结构体的三种定义方式
c语言中结构体的定义: struct 结构体名{ 成员列表: ..... }结构体变量: 7.1.1 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 ...
- 前端学习(749):函数两种声明方式
- JavaScript函数的两种声明方式(4)
- 结构体变量的两种初始化方式
结构体变量的初始化 定义时初始化 定义之后初始化 结构体白能量的初始化方式有两种,可以在定义的时候或定义之后对结构体变量进行初始化. 定义时初始化 一般情况下我们都是在定义的时候对它进行初始化,因为那 ...
- sa结构组网方式_5G网络包含NSA和SA两种组网方式
近日,江苏联通联合华为在南京摄山新城西开通NSA/SA双模共享站点,同时满足了区域内2B/2C不同应用需求. 5G网络包含NSA和SA两种组网方式,由于协议演进,终端要求,5G网络前期采用NSA组网的 ...
- 结构体是什么、声明和定义
目录 结构体是什么.声明和定义 1.结构体类型的概念 2. 结构体的声明与定义 2.1 结构体声明(结构布局) 2.2 结构体变量声明(创建) 2.3 3. 定义结构体变量的几种方式 3.1 先声明结 ...
- 图的两种存储方式---邻接矩阵和邻接表
图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...
最新文章
- 两个字符串之间的复制,不使用strcopy()函数
- 这么详细的Python matplotlib底层原理浅析
- StringUtils之equals
- Apache检查配置文件语法
- Transformer性能优化:运算和显存
- RTEMS 的 AT91SAM9260 移植(8): 编译
- 总结2010展望2011
- Java PushbackReader ready()方法与示例
- Java数据库篇9——备份与还原、忘记密码
- php地址选择插件,微信小程序中关于三级联动地址选择器的实例分享
- java未_Java未被捕获的异常
- SQL注入之MYSQL注入
- mysql实现不同电脑间局域网连接
- Bypass Windows AppLocker
- wps去除登陆_WPS强制用户登录功能,这是要闹哪样?
- 第二次热带近岸出海记录
- 添加分类、标签云(球状)、彩色标签
- linux cut命令
- python pyinstaller 打包exe文件,(附带图片 + 自己、别人电脑上均可以运行)
- 每日一题 --- P1093 [NOIP2007 普及组] 奖学金[洛谷][JAVA]