单链表——游标实现

  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!!!
");
 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!!!
" );
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!!!
" );
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!!!
" );
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( "
" );
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 } 
原文地址:https://www.cnblogs.com/weixia-blog/p/7307363.html