1
1
#include <stdio.h>
2
+ #include <stdlib.h>
3
+
4
+ /****************************************
5
+
6
+ 没有头节点,有头指针->首元节点
7
+
8
+ ****************************************/
2
9
3
10
typedef struct _drlink_data {
4
11
char data ;
@@ -14,22 +21,99 @@ static void drlink_show(drlink_data *drldata)
14
21
return ;
15
22
}
16
23
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 ;
19
63
}
20
64
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 ;
21
94
}
22
95
23
96
int main ()
24
97
{
25
98
drlink_data * drldata ;
26
99
drlink_show (drldata );
27
- #if 0
100
+
28
101
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
30
113
drlink_delete ();
31
114
drlink_amend ();
32
115
drlink_select ();
116
+ drlink_destroy ();
33
117
#endif
34
118
35
119
return 0 ;
0 commit comments