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

单项链接的接口问题

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

据的范例程序

1    #include

2    #include "slist.h"

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_node_t  head;

18        slist_int_t    node1, node2, node3;

19       slist_init(&head);

20        node1.data = 1;

21        slist_add(&head, &head, &node1.node);            // 添加 node1 至头结点之后

22        node2.data = 2;

23        slist_add(&head, &node1.node, &node2.node);     // 添加 node2至node1之后

24        node3.data = 3;

25        slist_add(&head, &node2.node, &node3.node);     // 添加 node3至node2之后

26        slist_foreach(&head, list_node_process, NULL);   // 遍历链表,用户参数为NULL

27        return 0;

28  } 

显然,添加结点至链表头部和尾部,仅仅是添加结点至任意位置的特殊情况:

● 添加结点至链表头部,即添加结点至头结点之后;

● 添加结点至链表尾部,即添加结点至链表尾结点之后。

slist_add_head()函数和slist_add_tail()函数的实现详见程序清单3.24。

程序清单3.24  基于slist_add()实现添加结点至头部和尾部

1    int slist_add_tail (slist_head_t *p_head, slist_node_t *p_node)

2    {

3         slist_node_t *p_tmp = p_head;         // 指向头结点

4         while (p_tmp->p_next != NULL) { // 找到链表尾结点(直到结点的p_next的值为NULL)

5               p_tmp = p_tmp->p_next;

6         }

7         return slist_add(p_head, p_tmp, p_node);          // 添加结点至尾结点之后

8    }

9

10  int slist_add_head (slist_head_t *p_head, slist_node_t *p_node)

11  {

12        return slist_add(p_head, p_head, p_node);         // 添加结点至头结点之后

13  } 

如果要将一个结点添加至某一结点之前呢?实际上,添加结点至某一结点之前同样也只是添加结点至某一结点之后的一种变形,即添加至该结点前一个结点的后面,详见图3.13。

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

网站地图

Top