⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashsep.c

📁 清华大学出版的数据结构(C语言版)中书中所提到的所有C源程序的实现。
💻 C
字号:
       #include "fatal.h"       #include "hashsep.h"       #include <stdlib.h>              #define MinTableSize (10)        struct ListNode        {            ElementType Element;            Position    Next;        };        typedef Position List;        /* List *TheList will be an array of lists, allocated later */        /* The lists use headers (for simplicity), */        /* though this wastes space */        struct HashTbl        {            int TableSize;            List *TheLists;        };        /* Return next prime; assume N >= 10 */        static int        NextPrime( int N )        {            int i;            if( N % 2 == 0 )                N++;            for( ; ; N += 2 )            {                for( i = 3; i * i <= N; i += 2 )                    if( N % i == 0 )                        goto ContOuter;  /* Sorry about this! */                return N;              ContOuter: ;            }        }        /* Hash function for ints */        Index        Hash( ElementType Key, int TableSize )        {            return Key % TableSize;        }/* START: fig5_8.txt */        HashTable        InitializeTable( int TableSize )        {            HashTable H;            int i;/* 1*/      if( TableSize < MinTableSize )            {/* 2*/          Error( "Table size too small" );/* 3*/          return NULL;            }            /* Allocate table *//* 4*/      H = malloc( sizeof( struct HashTbl ) );/* 5*/      if( H == NULL )/* 6*/          FatalError( "Out of space!!!" );/* 7*/      H->TableSize = NextPrime( TableSize );            /* Allocate array of lists *//* 8*/      H->TheLists = malloc( sizeof( List ) * H->TableSize );/* 9*/      if( H->TheLists == NULL )/*10*/          FatalError( "Out of space!!!" );            /* Allocate list headers *//*11*/      for( i = 0; i < H->TableSize; i++ )            {/*12*/          H->TheLists[ i ] = malloc( sizeof( struct ListNode ) );/*13*/          if( H->TheLists[ i ] == NULL )/*14*/              FatalError( "Out of space!!!" );                else/*15*/              H->TheLists[ i ]->Next = NULL;            }/*16*/      return H;        }/* END *//* START: fig5_9.txt */        Position        Find( ElementType Key, HashTable H )        {            Position P;            List L;/* 1*/      L = H->TheLists[ Hash( Key, H->TableSize ) ];/* 2*/      P = L->Next;/* 3*/      while( P != NULL && P->Element != Key )                                /* Probably need strcmp!! *//* 4*/          P = P->Next;/* 5*/      return P;        }/* END *//* START: fig5_10.txt */        void        Insert( ElementType Key, HashTable H )        {            Position Pos, NewCell;            List L;/* 1*/      Pos = Find( Key, H );/* 2*/      if( Pos == NULL )   /* Key is not found */            {/* 3*/          NewCell = malloc( sizeof( struct ListNode ) );/* 4*/          if( NewCell == NULL )/* 5*/              FatalError( "Out of space!!!" );                else                {/* 6*/              L = H->TheLists[ Hash( Key, H->TableSize ) ];/* 7*/              NewCell->Next = L->Next;/* 8*/              NewCell->Element = Key;  /* Probably need strcpy! *//* 9*/              L->Next = NewCell;                }            }        }/* END */        ElementType        Retrieve( Position P )        {            return P->Element;        }        void        DestroyTable( HashTable H )        {            int i;            for( i = 0; i < H->TableSize; i++ )            {                Position P = H->TheLists[ i ];                Position Tmp;                while( P != NULL )                {                    Tmp = P->Next;                    free( P );                    P = Tmp;                }            }            free( H->TheLists );            free( H );        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -