微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 单项链接的接口问题

单项链接的接口问题

时间:08-26 来源:周立功单片机 点击:

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;                   

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top