亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

哈希表實驗C語言版實現

2020-01-26 15:59:36
字體:
來源:轉載
供稿:網友
復制代碼 代碼如下:

/*
 數據結構C語言版 哈希表

*/
#include <stdio.h>
#include <malloc.h>
#define NULLKEY 0 // 0為無記錄標志
#define N 10  // 數據元素個數
typedef int KeyType;// 設關鍵字域為整型
typedef struct
{
 KeyType key;
 int ord;
}ElemType; // 數據元素類型
// 開放定址哈希表的存儲結構
int hashsize[]={11,19,29,37}; // 哈希表容量遞增表,一個合適的素數序列
int m=0; // 哈希表表長,全局變量
typedef struct
{
 ElemType *elem; // 數據元素存儲基址,動態分配數組
 int count; // 當前數據元素個數
 int sizeindex; // hashsize[sizeindex]為當前容量
}HashTable;
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
// 構造一個空的哈希表
int InitHashTable(HashTable *H)

 int i;
 (*H).count=0; // 當前元素個數為0
 (*H).sizeindex=0; // 初始存儲容量為hashsize[0]
 m=hashsize[0];
 (*H).elem=(ElemType*)malloc(m*sizeof(ElemType));
 if(!(*H).elem)
  exit(0); // 存儲分配失敗
 for(i=0;i<m;i++)
  (*H).elem[i].key=NULLKEY; // 未填記錄的標志

 return 1;
}
//  銷毀哈希表H
void DestroyHashTable(HashTable *H)
{
 free((*H).elem);
 (*H).elem=NULL;
 (*H).count=0;
 (*H).sizeindex=0;
}
// 一個簡單的哈希函數(m為表長,全局變量)
unsigned Hash(KeyType K)
{
 return K%m;
}
// 開放定址法處理沖突
void collision(int *p,int d) // 線性探測再散列

 *p=(*p+d)%m;
}
// 算法9.17
// 在開放定址哈希表H中查找關鍵碼為K的元素,若查找成功,以p指示待查數據
// 元素在表中位置,并返回SUCCESS;否則,以p指示插入位置,并返回UNSUCCESS
// c用以計沖突次數,其初值置零,供建表插入時參考。
int SearchHash(HashTable H,KeyType K,int *p,int *c)
{
 *p=Hash(K); // 求得哈希地址
 while(H.elem[*p].key!=NULLKEY&&!(K == H.elem[*p].key))
 {
  // 該位置中填有記錄.并且關鍵字不相等
  (*c)++;
  if(*c<m)
   collision(p,*c); // 求得下一探查地址p
  else
   break;
 }
 if (K == H.elem[*p].key)
  return SUCCESS; // 查找成功,p返回待查數據元素位置
 else
  return UNSUCCESS; // 查找不成功(H.elem[p].key==NULLKEY),p返回的是插入位置
}
int InsertHash(HashTable *,ElemType); // 對函數的聲明
// 重建哈希表
void RecreateHashTable(HashTable *H) // 重建哈希表
{
 int i,count=(*H).count;
 ElemType *p,*elem=(ElemType*)malloc(count*sizeof(ElemType));
 p=elem;
 printf("重建哈希表/n");
 for(i=0;i<m;i++) // 保存原有的數據到elem中
  if(((*H).elem+i)->key!=NULLKEY) // 該單元有數據
   *p++=*((*H).elem+i);
 (*H).count=0;
 (*H).sizeindex++; // 增大存儲容量
 m=hashsize[(*H).sizeindex];
 p=(ElemType*)realloc((*H).elem,m*sizeof(ElemType));
 if(!p)
  exit(0); // 存儲分配失敗
 (*H).elem=p;
 for(i=0;i<m;i++)
  (*H).elem[i].key=NULLKEY; // 未填記錄的標志(初始化)
 for(p=elem;p<elem+count;p++) // 將原有的數據按照新的表長插入到重建的哈希表中
  InsertHash(H,*p);
}
// 算法9.18
// 查找不成功時插入數據元素e到開放定址哈希表H中,并返回1;
// 若沖突次數過大,則重建哈希表。
int InsertHash(HashTable *H,ElemType e)
{
 int c,p;
 c=0;
 if(SearchHash(*H,e.key,&p,&c)) // 表中已有與e有相同關鍵字的元素
  return DUPLICATE;
 else if(c<hashsize[(*H).sizeindex]/2) // 沖突次數c未達到上限,(c的閥值可調)
 {
  // 插入e
  (*H).elem[p]=e;
  ++(*H).count;
  return 1;
 }
 else
  RecreateHashTable(H); // 重建哈希表

 return 0;
}
// 按哈希地址的順序遍歷哈希表
void TraverseHash(HashTable H,void(*Vi)(int,ElemType))

 int i;
 printf("哈希地址0~%d/n",m-1);
 for(i=0;i<m;i++)
  if(H.elem[i].key!=NULLKEY) // 有數據
   Vi(i,H.elem[i]);
}
// 在開放定址哈希表H中查找關鍵碼為K的元素,若查找成功,以p指示待查數據
// 元素在表中位置,并返回SUCCESS;否則,返回UNSUCCESS
int Find(HashTable H,KeyType K,int *p)
{
 int c=0;
 *p=Hash(K); // 求得哈希地址
 while(H.elem[*p].key!=NULLKEY&&!(K == H.elem[*p].key))
 { // 該位置中填有記錄.并且關鍵字不相等
  c++;
  if(c<m)
   collision(p,c); // 求得下一探查地址p
  else
   return UNSUCCESS; // 查找不成功(H.elem[p].key==NULLKEY)
 }
 if (K == H.elem[*p].key)
  return SUCCESS; // 查找成功,p返回待查數據元素位置
 else
  return UNSUCCESS; // 查找不成功(H.elem[p].key==NULLKEY)
}
void print(int p,ElemType r)
{
 printf("address=%d (%d,%d)/n",p,r.key,r.ord);
}
int main()
{
 ElemType r[N] = {
  {17,1},{60,2},{29,3},{38,4},{1,5},
  {2,6},{3,7},{4,8},{60,9},{13,10}
 };
 HashTable h;
 int i, j, p;
 KeyType k;

 InitHashTable(&h);
 for(i=0;i<N-1;i++)
 {
  // 插入前N-1個記錄
  j=InsertHash(&h,r[i]);
  if(j==DUPLICATE)
   printf("表中已有關鍵字為%d的記錄,無法再插入記錄(%d,%d)/n",
    r[i].key,r[i].key,r[i].ord);
 }
 printf("按哈希地址的順序遍歷哈希表:/n");
 TraverseHash(h,print);
 printf("請輸入待查找記錄的關鍵字: ");
 scanf("%d",&k);
 j=Find(h,k,&p);
 if(j==SUCCESS)
  print(p,h.elem[p]);
 else
  printf("沒找到/n");
 j=InsertHash(&h,r[i]); // 插入第N個記錄
 if(j==0) // 重建哈希表
  j=InsertHash(&h,r[i]); // 重建哈希表后重新插入第N個記錄
 printf("按哈希地址的順序遍歷重建后的哈希表:/n");
 TraverseHash(h,print);
 printf("請輸入待查找記錄的關鍵字: ");
 scanf("%d",&k);
 j=Find(h,k,&p);
 if(j==SUCCESS)
  print(p,h.elem[p]);
 else
  printf("沒找到/n");
 DestroyHashTable(&h);

 system("pause");
 return 0;
}
/*
輸出效果:
表中已有關鍵字為60的記錄,無法再插入記錄(60,9)
按哈希地址的順序遍歷哈希表:
哈希地址0~10
address=1 (1,5)
address=2 (2,6)
address=3 (3,7)
address=4 (4,8)
address=5 (60,2)
address=6 (17,1)
address=7 (29,3)
address=8 (38,4)
請輸入待查找記錄的關鍵字: 17
address=6 (17,1)
重建哈希表
按哈希地址的順序遍歷重建后的哈希表:
哈希地址0~18
address=0 (38,4)
address=1 (1,5)
address=2 (2,6)
address=3 (3,7)
address=4 (4,8)
address=6 (60,2)
address=10 (29,3)
address=13 (13,10)
address=17 (17,1)
請輸入待查找記錄的關鍵字: 13
address=13 (13,10)
請按任意鍵繼續. . .
*/
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国视频午夜一区免费在线观看| 欧美黄色片视频| 欧美精品免费播放| 午夜精品在线观看| 欧美性猛交xxxx黑人| 成人国产精品一区二区| 日韩欧美在线观看视频| 精品视频一区在线视频| 成人在线中文字幕| 亚洲精品福利资源站| 亚洲有声小说3d| 欧美日韩美女视频| 国产丝袜视频一区| 黑丝美女久久久| 成人高清视频观看www| 91久久久在线| 欧美激情免费观看| 亚洲毛茸茸少妇高潮呻吟| 亚洲欧美日韩一区二区三区在线| 日韩高清人体午夜| 亚洲第一福利在线观看| 最近更新的2019中文字幕| 中文字幕亚洲欧美| 欧美精品做受xxx性少妇| 97av视频在线| 亚洲a中文字幕| 国产激情久久久久| 久色乳综合思思在线视频| 欧美一级黄色网| 亚洲国产天堂网精品网站| 国产精品jizz在线观看麻豆| 国内精品国产三级国产在线专| 尤物精品国产第一福利三区| 亚洲精品国产拍免费91在线| 亚洲国产精品福利| 久久久亚洲精选| 国产精品高清在线| 久久国产精品久久久久| 九九九久久国产免费| 亚洲欧洲午夜一线一品| 欧美一区二区三区四区在线| 亚州av一区二区| 最近2019中文字幕mv免费看| 国产精品第七影院| 亚洲一区二区三区四区视频| 亚洲精品狠狠操| 久久精品小视频| 久久精品成人欧美大片古装| 4444欧美成人kkkk| 久久免费视频这里只有精品| 亚洲欧美国产高清va在线播| 欧美裸体视频网站| 欧美成人精品在线| 自拍偷拍亚洲在线| 日韩国产欧美精品一区二区三区| 国产欧美一区二区三区在线看| 2019中文在线观看| 福利精品视频在线| 国产精品视频免费在线观看| 国产精品久久久一区| 久久久久日韩精品久久久男男| 亚洲国产精品一区二区三区| 91情侣偷在线精品国产| 亚洲精品一区中文字幕乱码| 久久伊人精品天天| 91精品免费久久久久久久久| 亚洲国产精品热久久| 亚洲国产精彩中文乱码av| 欧美日韩国产123| 国产精品视频xxx| 日韩免费精品视频| 亚洲精品白浆高清久久久久久| 亚洲欧美制服丝袜| 国内精品中文字幕| 精品国产欧美一区二区五十路| 午夜精品久久久久久久99黑人| 精品久久久91| 色噜噜亚洲精品中文字幕| 国a精品视频大全| 国产噜噜噜噜久久久久久久久| 欧美激情区在线播放| 国产精品男人的天堂| 欧美视频一区二区三区…| 一区二区国产精品视频| 日韩av黄色在线观看| 日韩精品在线免费播放| 日韩在线一区二区三区免费视频| 在线亚洲男人天堂| 亚州成人av在线| 国产成人一区二区三区| 中文字幕综合在线| 国模视频一区二区三区| 最近2019中文免费高清视频观看www99| 俺去亚洲欧洲欧美日韩| 亚洲乱亚洲乱妇无码| 欧美与黑人午夜性猛交久久久| 日韩美女在线看| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品三级久久久久久电影| 欧美激情一级精品国产| 亚洲一区二区自拍| 欧美性视频精品| 国产福利视频一区| 成人夜晚看av| 欧美高清视频在线播放| 日韩免费不卡av| 国产精品久久久久高潮| 欧美日韩视频免费播放| 国产精品av免费在线观看| 92裸体在线视频网站| 亚洲免费电影一区| 国产精品视频网址| 国产精品久久久久久久电影| 麻豆精品精华液| 成人妇女淫片aaaa视频| 国产91在线高潮白浆在线观看| 福利视频导航一区| 激情av一区二区| 欧美日韩国产激情| 欧美激情久久久久| 欧美国产日本在线| 影音先锋日韩有码| 亚洲精品一区二区在线| 欧美一级视频免费在线观看| 欧美交受高潮1| 欧美丝袜第一区| 日韩久久午夜影院| 国产精品网址在线| 成人性生交大片免费观看嘿嘿视频| 亚洲第一区在线| 亚洲片国产一区一级在线观看| 亚洲sss综合天堂久久| 这里精品视频免费| 国产女精品视频网站免费| 久久精品国产91精品亚洲| 亚洲iv一区二区三区| 一区二区三区视频在线| 国产精品久久久久久亚洲影视| 26uuu亚洲国产精品| 性欧美在线看片a免费观看| 最新国产成人av网站网址麻豆| 久久免费国产精品1| 国产成人在线亚洲欧美| 精品无人国产偷自产在线| 成人福利网站在线观看11| 久久伊人色综合| 国产91色在线| 欧美激情免费看| 久久手机免费视频| 色777狠狠综合秋免鲁丝| 在线观看欧美成人| 亚洲高清在线观看| 亚洲成人久久久| 免费不卡欧美自拍视频| 精品毛片网大全| 国产在线观看不卡| 亚洲精品狠狠操| 亚洲精品永久免费| 97在线观看免费高清| 日韩免费在线播放| 欧美大码xxxx| 午夜精品久久久久久久男人的天堂| 91免费版网站入口| 欧美大荫蒂xxx|