Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 47efcb0

Browse files
committed
DoubleLinkList: implements dlink in C/C++/Java.
1 parent be9bbce commit 47efcb0

File tree

10 files changed

+980
-4
lines changed

10 files changed

+980
-4
lines changed

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
3+
*.[sS]
4+
*.o
5+
*.swp
6+
*.vim
7+
*.tgz
8+
*.out
9+
*.class
10+

README

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Data structures and algorithms introduction
2+
3+
CONTENTS
4+
(01) Linear Data Structures
5+
6+
== Linear Data Structures ==
7+
1. Double Link List
8+
(01) Path : ./datastructs/linear/double_link_list/
9+
(02) Introduction : it contains the dlink's implementation of C/C++/Java
10+

README.md

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#include <stdio.h>
2+
#include "double_link.h"
3+
4+
/**
5+
* C 语言实现的双向链表的测试程序。
6+
*
7+
* (01) int_test()
8+
* 演示向双向链表操作“int数据”。
9+
* (02) string_test()
10+
* 演示向双向链表操作“字符串数据”。
11+
* (03) object_test()
12+
* 演示向双向链表操作“对象”。
13+
*
14+
* @author skywang
15+
* @date 2013/11/07
16+
*/
17+
18+
// 双向链表操作int数据
19+
void int_test()
20+
{
21+
int iarr[4] = {10, 20, 30, 40};
22+
23+
printf("\n----%s----\n", __func__);
24+
create_dlink(); // 创建双向链表
25+
26+
dlink_insert(0, &iarr[0]); // 向双向链表的表头插入数据
27+
dlink_insert(0, &iarr[1]); // 向双向链表的表头插入数据
28+
dlink_insert(0, &iarr[2]); // 向双向链表的表头插入数据
29+
30+
printf("dlink_is_empty()=%d\n", dlink_is_empty()); // 双向链表是否为空
31+
printf("dlink_size()=%d\n", dlink_size()); // 双向链表的大小
32+
33+
// 打印双向链表中的全部数据
34+
int i;
35+
int *p;
36+
int sz = dlink_size();
37+
for (i=0; i<sz; i++)
38+
{
39+
p = (int *)dlink_get(i);
40+
printf("dlink_get(%d)=%d\n", i, *p);
41+
}
42+
43+
destroy_dlink();
44+
}
45+
46+
void string_test()
47+
{
48+
char* sarr[4] = {"ten", "twenty", "thirty", "forty"};
49+
50+
printf("\n----%s----\n", __func__);
51+
create_dlink(); // 创建双向链表
52+
53+
dlink_insert(0, sarr[0]); // 向双向链表的表头插入数据
54+
dlink_insert(0, sarr[1]); // 向双向链表的表头插入数据
55+
dlink_insert(0, sarr[2]); // 向双向链表的表头插入数据
56+
57+
printf("dlink_is_empty()=%d\n", dlink_is_empty()); // 双向链表是否为空
58+
printf("dlink_size()=%d\n", dlink_size()); // 双向链表的大小
59+
60+
// 打印双向链表中的全部数据
61+
int i;
62+
char *p;
63+
int sz = dlink_size();
64+
for (i=0; i<sz; i++)
65+
{
66+
p = (char *)dlink_get(i);
67+
printf("dlink_get(%d)=%s\n", i, p);
68+
}
69+
70+
destroy_dlink();
71+
}
72+
73+
typedef struct tag_stu
74+
{
75+
int id;
76+
char name[20];
77+
}stu;
78+
79+
static stu arr_stu[] =
80+
{
81+
{10, "sky"},
82+
{20, "jody"},
83+
{30, "vic"},
84+
{40, "dan"},
85+
};
86+
#define ARR_STU_SIZE ( (sizeof(arr_stu)) / (sizeof(arr_stu[0])) )
87+
88+
void object_test()
89+
{
90+
printf("\n----%s----\n", __func__);
91+
create_dlink(); // 创建双向链表
92+
93+
dlink_insert(0, &arr_stu[0]); // 向双向链表的表头插入数据
94+
dlink_insert(0, &arr_stu[1]); // 向双向链表的表头插入数据
95+
dlink_insert(0, &arr_stu[2]); // 向双向链表的表头插入数据
96+
97+
printf("dlink_is_empty()=%d\n", dlink_is_empty()); // 双向链表是否为空
98+
printf("dlink_size()=%d\n", dlink_size()); // 双向链表的大小
99+
100+
// 打印双向链表中的全部数据
101+
int i;
102+
int sz = dlink_size();
103+
stu *p;
104+
for (i=0; i<sz; i++)
105+
{
106+
p = (stu *)dlink_get(i);
107+
printf("dlink_get(%d)=[%d, %s]\n", i, p->id, p->name);
108+
}
109+
110+
destroy_dlink();
111+
}
112+
113+
int main()
114+
{
115+
int_test(); // 演示向双向链表操作“int数据”。
116+
string_test(); // 演示向双向链表操作“字符串数据”。
117+
object_test(); // 演示向双向链表操作“对象”。
118+
119+
return 0;
120+
}
121+
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
#include <stdio.h>
2+
#include <malloc.h>
3+
4+
/**
5+
* Double Link List
6+
*
7+
* @author skywang
8+
* @date 2013/11/07
9+
*/
10+
typedef struct tag_node
11+
{
12+
struct tag_node *prev;
13+
struct tag_node *next;
14+
void* p;
15+
}node;
16+
17+
// 表头。注意,表头不存放元素值!!!
18+
static node *phead=NULL;
19+
// 节点个数。
20+
static int count=0;
21+
22+
// 新建“节点”。成功,返回节点指针;否则,返回NULL。
23+
static node* create_node(void *pval)
24+
{
25+
node *pnode=NULL;
26+
pnode = (node *)malloc(sizeof(node));
27+
if (!pnode)
28+
{
29+
printf("create node error!\n");
30+
return NULL;
31+
}
32+
// 默认的,pnode的前一节点和后一节点都指向它自身
33+
pnode->prev = pnode->next = pnode;
34+
// 节点的值为pval
35+
pnode->p = pval;
36+
37+
return pnode;
38+
}
39+
40+
// 新建“双向链表”。成功,返回0;否则,返回-1。
41+
int create_dlink()
42+
{
43+
// 创建表头
44+
phead = create_node(NULL);
45+
if (!phead)
46+
return -1;
47+
48+
// 设置“节点个数”为0
49+
count = 0;
50+
51+
return 0;
52+
}
53+
54+
// “双向链表是否为空”
55+
int dlink_is_empty()
56+
{
57+
return count == 0;
58+
}
59+
60+
// 返回“双向链表的大小”
61+
int dlink_size() {
62+
return count;
63+
}
64+
65+
// 获取“双向链表中第index位置的节点”
66+
static node* get_node(int index)
67+
{
68+
if (index<0 || index>=count)
69+
{
70+
printf("%s failed! index out of bound!\n", __func__);
71+
return NULL;
72+
}
73+
74+
// 正向查找
75+
if (index <= (count/2))
76+
{
77+
int i=0;
78+
node *pnode=phead->next;
79+
while ((i++) < index)
80+
pnode = pnode->next;
81+
82+
return pnode;
83+
}
84+
85+
// 反向查找
86+
int j=0;
87+
int rindex = count - index - 1;
88+
node *rnode=phead->prev;
89+
while ((j++) < rindex)
90+
rnode = rnode->prev;
91+
92+
return rnode;
93+
}
94+
95+
// 获取“第一个节点”
96+
static node* get_first_node()
97+
{
98+
return get_node(0);
99+
}
100+
101+
// 获取“最后一个节点”
102+
static node* get_last_node()
103+
{
104+
return get_node(count-1);
105+
}
106+
107+
// 获取“双向链表中第index位置的元素”。成功,返回节点值;否则,返回-1。
108+
void* dlink_get(int index)
109+
{
110+
node *pindex=get_node(index);
111+
if (!pindex)
112+
{
113+
printf("%s failed!\n", __func__);
114+
return NULL;
115+
}
116+
117+
return pindex->p;
118+
119+
}
120+
121+
// 获取“双向链表中第1个元素的值”
122+
void* dlink_get_first()
123+
{
124+
return dlink_get(0);
125+
}
126+
127+
// 获取“双向链表中最后1个元素的值”
128+
void* dlink_get_last()
129+
{
130+
return dlink_get(count-1);
131+
}
132+
133+
// 将“pval”插入到index位置。成功,返回0;否则,返回-1。
134+
int dlink_insert(int index, void* pval)
135+
{
136+
// 插入表头
137+
if (index==0)
138+
return dlink_insert_first(pval);
139+
140+
// 获取要插入的位置对应的节点
141+
node *pindex=get_node(index);
142+
if (!pindex)
143+
return -1;
144+
145+
// 创建“节点”
146+
node *pnode=create_node(pval);
147+
if (!pnode)
148+
return -1;
149+
150+
pnode->prev = pindex->prev;
151+
pnode->next = pindex;
152+
pindex->prev->next = pnode;
153+
pindex->prev = pnode;
154+
// 节点个数+1
155+
count++;
156+
157+
return 0;
158+
}
159+
160+
// 将“pval”插入到表头位置
161+
int dlink_insert_first(void *pval)
162+
{
163+
node *pnode=create_node(pval);
164+
if (!pnode)
165+
return -1;
166+
167+
pnode->prev = phead;
168+
pnode->next = phead->next;
169+
phead->next->prev = pnode;
170+
phead->next = pnode;
171+
count++;
172+
return 0;
173+
}
174+
175+
// 将“pval”插入到末尾位置
176+
int dlink_append_last(void *pval)
177+
{
178+
node *pnode=create_node(pval);
179+
if (!pnode)
180+
return -1;
181+
182+
pnode->next = phead;
183+
pnode->prev = phead->prev;
184+
phead->prev->next = pnode;
185+
phead->prev = pnode;
186+
count++;
187+
return 0;
188+
}
189+
190+
// 删除“双向链表中index位置的节点”。成功,返回0;否则,返回-1。
191+
int dlink_delete(int index)
192+
{
193+
node *pindex=get_node(index);
194+
if (!pindex)
195+
{
196+
printf("%s failed! the index in out of bound!\n", __func__);
197+
return -1;
198+
}
199+
200+
pindex->next->prev = pindex->prev;
201+
pindex->prev->next = pindex->next;
202+
free(pindex);
203+
count--;
204+
205+
return 0;
206+
}
207+
208+
// 删除第一个节点
209+
int dlink_delete_first()
210+
{
211+
return dlink_delete(0);
212+
}
213+
214+
// 删除组后一个节点
215+
int dlink_delete_last()
216+
{
217+
return dlink_delete(count-1);
218+
}
219+
220+
// 撤销“双向链表”。成功,返回0;否则,返回-1。
221+
int destroy_dlink()
222+
{
223+
if (!phead)
224+
{
225+
printf("%s failed! dlink is null!\n", __func__);
226+
return -1;
227+
}
228+
229+
node *pnode=phead->next;
230+
node *ptmp=NULL;
231+
while(pnode != phead)
232+
{
233+
ptmp = pnode;
234+
pnode = pnode->next;
235+
free(ptmp);
236+
}
237+
238+
free(phead);
239+
phead = NULL;
240+
count = 0;
241+
242+
return 0;
243+
}

0 commit comments

Comments
 (0)