8000 drlink: show & init & insert功能实现 · home-coder/data-abstraction-001@ebe4b10 · GitHub
[go: up one dir, main page]

Skip to content

Commit ebe4b10

Browse files
author
oneface
committed
drlink: show & init & insert功能实现
1 parent 61070a2 commit ebe4b10

File tree

1 file changed

+88
-4
lines changed

1 file changed

+88
-4
lines changed

002-drlink.c

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
/****************************************
5+
6+
没有头节点,有头指针->首元节点
7+
8+
****************************************/
29

310
typedef struct _drlink_data {
411
char data;
@@ -14,22 +21,99 @@ static void drlink_show(drlink_data *drldata)
1421
return ;
1522
}
1623

17-
for (; ) {
18-
24+
do {
25+
printf("%c<->", drlp->data);
26+
drlp = drlp->next;
27+
}while(drlp != drldata);
28+
printf("//"); // 双向循环链表 输出时检测正序和逆序是否都正确
29+
drlp = drldata;
30+
do {
31+
printf("%c<->", drlp->data);
32+
drlp = drlp->prev;
33+
}while(drlp != drldata);
34+
printf("\n");
35+
}
36+
37+
static void drlink_init(drlink_data **drldata)
38+
{
39+
*drldata = (drlink_data *)malloc(sizeof(drlink_data));
40+
if (!drldata) {
41+
printf("drldata malloc failed\n");
42+
return ;
43+
}
44+
45+
(*drldata)->prev = *drldata;
46+
(*drldata)->next = *drldata;
47+
}
48+
49+
static void drlink_insert(drlink_data **drldata, unsigned int loc, char data)
50+
{
51+
int i = 0;
52+
static int first_init = 1;
53+
drlink_data *drlp = *drldata;
54+
if (!drlp) {
55+
printf("drlink is not exsit\n");
56+
return ;
57+
}
58+
59+
if (first_init == 1 && loc == 0) { //第一次insert可以看作是amend了首元节点
60+
(*drldata)->data = data;
61+
first_init = 0;
62+
return ;
1963
}
2064

65+
drlink_data *ndrldata = (drlink_data *)malloc(sizeof(drlink_data));
66+
if (!ndrldata) {
67+
printf("ndrldata malloc failed\n");
68+
return ;
69+
}
70+
ndrldata->data = data;
71+
72+
if (loc == 0) {
73+
drlink_data *pdrldata = drlp->prev;
74+
pdrldata->next = ndrldata;
75+
ndrldata->prev = pdrldata;
76+
ndrldata->next = drlp;
77+
drlp->prev = ndrldata;
78+
(*drldata) = ndrldata;
79+
return ;
80+
}
81+
82+
for (; i < loc; i++) {
83+
drlp = drlp->next;
84+
if (drlp == *drldata) {
85+
printf("insert loc %d is invalid\n", loc);
86+
return ;
87+
}
88+
}
89+
drlink_data *temp = drlp->prev;
90+
ndrldata->next = drlp;
91+
drlp->prev = ndrldata;
92+
temp->next = ndrldata;
93+
ndrldata->prev = temp;
2194
}
2295

2396
int main()
2497
{
2598
drlink_data *drldata;
2699
drlink_show(drldata);
27-
#if 0
100+
28101
drlink_init(&drldata);
29-
drlink_insert(drldata, 0, 'a');
102+
drlink_show(drldata);
103+
104+
drlink_insert(&drldata, 0, 'a');
105+
drlink_show(drldata);
106+
drlink_insert(&drldata, 0, 'a');
107+
drlink_show(drldata);
108+
drlink_insert(&drldata, 1, 'e');
109+
drlink_show(drldata);
110+
drlink_insert(&drldata, 4, 'i');
111+
drlink_show(drldata);
112+
#if 0
30113
drlink_delete();
31114
drlink_amend();
32115
drlink_select();
116+
drlink_destroy();
33117
#endif
34118

35119
return 0;

0 commit comments

Comments
 (0)
0