1 /*
2 单链表游标实现
3 特性:
4 1.数据存储在一组结构体中。
5 2.动态管理内存
6 游标实现:
7 1.为满足特性1,创建一个全局的结构体数组CursorSpace[SPACE],数组下标充当地址
8 2.用数组实现动态管理。当Next等于0表示空间已满,单元0为表头提供可用空间位置
9 */
10
11 /*接口头文件*/
12 typedef int ElementType;
13 #ifndef _CURSOR_H
14 #define _CURSOR_H
15 #include <stdbool.h>
16
17 typedef int PtrToNode;
18 typedef PtrToNode List;
19 typedef PtrToNode Position;
20
21 /*操作集*/
22 void InitializeCursorSpace( void );
23 List MakeEmpty( List L );
24 bool IsEmpty( List L );
25 bool IsLast( Position P );
26 Position Header( List L );
27 Position First( List L );
28 Position Find( ElementType X, List L );
29 Position FindPrevious( ElementType X, List L );
30 void Delete( ElementType X, List L );
31 void DeleteList( List L );
32 void Insert( ElementType X, List L, Position P );
33 Position Advance( Position P );
34 ElementType Retrieve( Position P );
35 void PrintfList( List L );
36
37 #endif
38
39 /*接口实现*/
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include "cursor.h"
43 #define SPACE 11
44
45 /*特定结构声明*/
46 struct Node
47 {
48 ElementType Element;
49 Position Next;
50 };
51
52 /*游标数组*/
53 struct Node CursorSpace[SPACE]; //全局结构体数组
54
55 /*动态内存管理*/
56 static Position CursorAlloc( void );
57 static void CursorFree( Position P );
58
59 /*初始化游标数组CursorSpace[SPACE]*/
60 void InitializeCursorSpace( void )
61 {
62 Position P;
63
64 for ( P = 0; P < SPACE - 1; P++ )
65 CursorSpace[ P ].Next = P + 1;
66 CursorSpace[ SPACE - 1 ].Next = 0;
67 }
68
69 List MakeEmpty( List L )
70 {
71 L = CursorAlloc();
72 if ( L == 0 )
73 {
74 printf( "No Space!!!\n");
75 exit( 1 );
76 }
77 CursorSpace[ L ].Next = 0;
78 return L;
79
80 }
81
82 bool IsEmpty( List L )
83 {
84 return CursorSpace[ L ].Next == 0;
85 }
86
87 bool IsLast( Position P )
88 {
89 return CursorSpace[ P ].Next == 0;
90 }
91
92 Position Header( List L )
93 {
94 return L;
95 }
96
97 Position First( List L )
98 {
99 return CursorSpace[ L ].Next;
100 }
101
102 Position Find( ElementType X, List L )
103 {
104 Position P;
105
106 if ( IsEmpty( L ) )
107 {
108 printf( "No Data!!!\n" );
109 exit( 1 );
110 }
111 else
112 {
113 P = First( L );
114 while ( P != 0 && CursorSpace[ P ].Element != X )
115 P = Advance( P );
116
117 return P;
118 }
119 }
120
121 Position FindPrevious( ElementType X, List L )
122 {
123 Position P;
124
125 if ( IsEmpty( L ) )
126 {
127 printf( "No Data!!!\n" );
128 exit( 1 );
129 }
130 else
131 {
132 P = Header( L );
133 while ( Advance( P ) != 0 && Retrieve( Advance( P ) ) != X )
134 P = Advance( P );
135
136 return P; //当P为尾部时说明没有找到目标元素
137 }
138 }
139
140 void Delete( ElementType X, List L )
141 {
142 Position TheNode;
143 Position LastNode;
144
145 LastNode = FindPrevious( X, L );
146 if ( ! IsLast( LastNode ) ) //找到目标元素执行删除操作
147 {
148 TheNode = CursorSpace[ LastNode ].Next;
149
150 CursorSpace[ LastNode ].Next = CursorSpace[ TheNode ].Next;
151 CursorFree( TheNode );
152 }
153 }
154
155 void DeleteList( List L )
156 {
157 Position P;
158 Position Temp;
159
160 P = CursorSpace[ L ].Next;
161 CursorSpace[ L ].Next = 0;
162
163 while ( P != 0 )
164 {
165 Temp = Advance( P );
166 CursorFree( P );
167 P = Temp;
168 }
169 }
170
171 void Insert( ElementType X, List L, Position P )
172 {
173 Position NewNode;
174
175 NewNode = CursorAlloc();
176 if ( NewNode == 0 )
177 {
178 printf( "No Space!!!\n" );
179 exit( 1 );
180 }
181 CursorSpace[ NewNode ].Element = X;
182
183 CursorSpace[ NewNode ].Next = CursorSpace[ P ].Next;
184 CursorSpace[ P ].Next = NewNode;
185 }
186
187 Position Advance( Position P )
188 {
189 return CursorSpace[ P ].Next;
190 }
191
192 ElementType Retrieve( Position P )
193 {
194 return CursorSpace[ P ].Element;
195 }
196
197 void PrintfList( List L )
198 {
199 Position P;
200
201 P = First( L );
202 while ( P != 0 )
203 {
204 printf( "%3d", CursorSpace[ P ].Element );
205 P = Advance( P );
206 }
207 printf( "\n" );
208 }
209
210 /*申请内存*/
211 static Position CursorAlloc( void )
212 {
213 Position P;
214
215 P = CursorSpace[ 0 ].Next;
216 CursorSpace[ 0 ].Next = CursorSpace[ P ].Next;
217
218 return P;
219 }
220
221 /*释放内存*/
222 static void CursorFree( Position P )
223 {
224 CursorSpace[ P ].Next = CursorSpace[ 0 ].Next;
225 CursorSpace[ 0 ].Next = P;
226 }