哈希表

 

 

 來源:http://www.cnblogs.com/JCSU/articles/2028813.htmlhtml

 

複製代碼
/* ******************************************************************************
/* <PRE>
/* 版權全部    : -
/* 模塊名      : 查找
/* 文件名      : hash.cpp
/* 功能描述    : 哈希表
/* 做者        : <xxx>
/* 版本        : 1.0
/* -----------------------------------------------------------------------------
/* 備註        : 用鏈地址法解決衝突
/* -----------------------------------------------------------------------------
/* 修改記錄    :
/* 日 期        版本     修改人        修改內容
/* 2011/01/01   1.0      <xxx>         建立
/* </PRE>
******************************************************************************
*/
#include 
< stdio.h >
#include 
< stdlib.h >

/* *****************************************************************************
/* 數據類型和常量定義
/*****************************************************************************
*/
#define  SUCCESS             1
#define  UNSUCCESS           0
#define  DUPLICATE           -1

typedef 
int    Status;
typedef 
int    KeyType;

#define  EQ(a, b) ((a) == (b))
#define  LT(a, b) ((a) < (b))

#define  MAXSIZE       13           /* Hash表長 */
#define  HASH(key)  (key % MAXSIZE) /* Hash函數 */


/* *****************************************************************************
/* 數據結構定義
/*****************************************************************************
*/
typedef 
struct  {
    KeyType key;
}ElemType;

/*  鏈結點  */
typedef 
struct  ChainNode {
    ElemType data;
    ChainNode 
* next;
} ChainNode, 
* Chain;

Chain ChainHash[MAXSIZE] 
=  { NULL };

/* *****************************************************************************
/* 函數原型聲明
/*****************************************************************************
*/
Status SearchHash(Chain ChainHash[], KeyType key, Chain 
& p);
Status InsertHash(Chain ChainHash[], ElemType e);


/* ******************************************************************************
/* <FUNC>
/* 函數名   : SearchHash
/* 功能     : 查找Hash表
/* 參數     : -
/* 返回值   : -
/* 備註     : -
/* 做者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status SearchHash(Chain ChainHash[], KeyType key, Chain 
& p)
{
    ChainNode 
* tmp;   p  =  ChainHash[HASH(key)];
    
if  ( ! p)  return  UNSUCCESS;
    tmp 
=  p -> next;  p  =  tmp;
    
while  (p  &&   ! EQ(key, p -> data.key)) {
        tmp 
=  p;
        p 
=  p -> next;
    }
    
if  ( ! p) {
        p 
=  tmp;    return  UNSUCCESS;
    }
    
else   return  SUCCESS;
}

/* ******************************************************************************
/* <FUNC>
/* 函數名   : InsertHash
/* 功能     : 插入元素到Hash表
/* 參數     : -
/* 返回值   : -
/* 備註     : -
/* 做者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status InsertHash(Chain ChainHash[], ElemType e)
{
    Chain p, q, r, pre;
    
if  (SearchHash(ChainHash, e.key, p))  return  DUPLICATE;
    
else  {
        q 
=  (Chain)malloc( sizeof (ChainNode));  q -> data  =  e;  q -> next  =  NULL;
        
if  ( ! p) { 
            r 
=  (Chain)malloc( sizeof (ChainNode));
            r
-> data.key  =   1 ;
            r
-> next  =  q;
            ChainHash[HASH(e.key)] 
=  r;
        }
        
else  {
            r 
=  ChainHash[HASH(e.key)];    ++ (r -> data.key);
            p 
=  r -> next;  pre  =  r;
            
while  (p  &&  LT(p -> data.key, e.key)) {
                pre 
=  p; p  =  p -> next;
            }
            q
-> next  =  pre -> next;
            pre
-> next  =  q;
        }
    }
    
return  SUCCESS;
}


/* ******************************************************************************
/* <FUNC>
/* 函數名   : main
/* 功能     : 測試函數
/* 參數     : -
/* 返回值   : -
/* 備註     : -
/* 做者     : <xxx>
/* </FUNC>
******************************************************************************
*/
void  main()
{
    
char   * rslt[ 3 =  {
        
" duplicated! " ,
        
" unsuccess! " ,
        
" insert succeed! "
    };

    
// 插入數據到Hash表
    ElemType e;
    printf(
" \nInserting process: \n---------------------------------------------\n " );
    e.key 
=   19 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   19 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   14 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   23 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   01 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   68 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   20 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   84 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   27 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   55 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   11 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   10 ;  printf( " %d %s \n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);
    e.key 
=   79 ;  printf( " %d %s \n\n " , e.key, rslt[InsertHash(ChainHash, e)  +   1 ]);

    
// 輸出Hash表
    printf( " Hash Table: \n---------------------------------------------\n " );
    
for  ( int  i  =   0 ; i  <  MAXSIZE; i ++ ) {
        
if  ( ! ChainHash[i]) printf( " index: %2d, elem_count (%2d ) " , i,  0 );
        
else  {
            printf(
" index: %2d, elem_count (%2d ) -> " , i, ChainHash[i] -> data.key);
            ChainNode 
* =  ChainHash[i] -> next;
            
while  (p)
            {
                printf(
"  %d  " , p -> data.key); p  =  p -> next;
            }
        }
        printf(
" \n " );
    }
}
複製代碼

 

 

【參考】數據結構

相關文章
相關標籤/搜索