单项链接的接口问题
据的范例程序
1 #include
2 #include "slist.h"
34 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 }
1415 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。
图
周立功 相关文章:
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)