zoukankan      html  css  js  c++  java
  • 单链表——游标实现

      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 } 
  • 相关阅读:
    自己实现简单Spring Ioc
    java中动态代理的实现
    Token以及签名signature的设计与实现
    Spring boot整合jsp
    spring boot+mybatis整合
    java并发基础(六)--- 活跃性、性能与可伸缩性
    java并发基础(五)--- 线程池的使用
    java并发基础(四)--- 取消与中断
    java并发基础(三)--- 任务执行
    java并发基础(二)
  • 原文地址:https://www.cnblogs.com/weixia-blog/p/7307363.html
Copyright © 2011-2022 走看看