单链表——游标实现
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 }