21 static int count=0;
22
23 // 新建“节点”。成功,返回节点指针;否则,返回NULL。
24 static node* create_node(void *pval)
25 {
26 node *pnode=NULL;
27 pnode = (node *)malloc(sizeof(node));
28 if (!pnode)
29 {
30 printf("create node error!\n");
31 return NULL;
32 }
33 // 默认的,pnode的前⼀节点和后⼀节点都指向它⾃⾝
34 pnode->prev = pnode->next = pnode;
35 // 节点的值为pval
36 pnode->p = pval;
37
38 return pnode;
39 }
40
41 // 新建“双向链表”。成功,返回0;否则,返回-1。
42 int create_dlink()
43 {
44 // 创建表头
45 phead = create_node(NULL);
46 if (!phead)
47 return -1;
48
49 // 设置“节点个数”为0
50 count = 0;
51
52 return 0;
53 }
54
55 // “双向链表是否为空”
56 int dlink_is_empty()
57 {
58 return count == 0;
59 }
60
61 // 返回“双向链表的⼤⼩”
62 int dlink_size() {
63 return count;
64 }
65
66 // 获取“双向链表中第index位置的节点”
67 static node* get_node(int index)
68 {
69 if (index<0 || index>=count)
70 {
71 printf("%s failed! index out of bound!\n", __func__);
72 return NULL;
73 }
74
75 // 正向查找
76 if (index <= (count/2))
77 {
78 int i=0;
79 node *pnode=phead->next;
80 while ((i++) < index)
81 pnode = pnode->next;
82
83 return pnode;
84 }
85
86 // 反向查找
87 int j=0;
88 int rindex = count - index - 1;
89 node *rnode=phead->prev;
90 while ((j++) < rindex)
91 rnode = rnode->prev;
92
93 return rnode;
94 }
95
96 // 获取“第⼀个节点”
97 static node* get_first_node()
98 {
99 return get_node(0);
100 }
101
102 // 获取“最后⼀个节点”
103 static node* get_last_node()
104 {