单项链接的接口问题
2 #include "slist.h"
3
4 typedef struct _slist_int {
5 slist_node_t node; // 包含链表结点
6 int data; // int类型数据
7 }slist_int_t;
8
9 int list_node_process (void *p_arg, slist_node_t *p_node)
10 {
11 printf("%d ", ((slist_int_t *)p_node)->data);
12 return 0;
13 }
14
15 int main(void)
16 {
17 slist_head_t head; // 定义链表头结点
18 slist_int_t nodel, node2, node3;
19 slist_init(&head);
20
21 node1.data = 1;
22 slist_add_tail(&head, &(node1.node));
23 node2.data = 2;
24 slist_add_tail(&head, &(node2.node));
25 node3.data = 3;
26 slist_add_head(&head, &(node3.node));
27 slist_del(&head, &(node2.node)); // 删除node2结点
28 slist_foreach(&head, list_node_process, NULL); // 遍历链表,用户参数为NULL
29 return 0;
30 }程序中所有的结点都是按照静态内存分配的方式定义的,即程序在运行前,各个结点占用的内存就已经被分配好了,而不同的是动态内存分配需要在运行时使用malloc()等函数完成内存的分配。
由于静态内存不会出现内存泄漏,且在编译完成后,各个结点的内存就已经分配好了,不需要再花时间去分配内存,也不需要添加额外的对内存分配失败的处理代码。因此,在嵌入式系统中,往往多使用静态内存分配的方式。但其致命的缺点是不能释放内存,有时候用户希望在删除链表的结点时,释放掉其占用内存,这就需要使用动态内存分配。
实际上,链表的核心代码只是负责完成链表的操作,仅需传递结点的地址(p_node)即可,链表程序并不关心结点的内存从何而来。基于此,若要实现动态内存分配,只要在应用中使用malloc()等动态内存分配函数即可,详见程序清单3.31。
程序清单3.31 综合范例程序(使用动态内存)
1 #include
2 #include "slist.h"
3 #include
4
5 typedef struct _slist_int{
6 slist_node_t node; // 包含链表结点
7 int data;
周立功 相关文章:
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)