當前位置:成語大全網 - 書法字典 - c字典和哈希表

c字典和哈希表

這是我們的家庭作業。根據自己的需求去改就好了。

# include & ltstdio.h & gt

# include & ltmalloc.h & gt

# include & ltstring.h & gt

//#包含

#define HASH_LEN 50 //哈希表的長度

#定義M 47

#定義名稱_編號30 //名稱數量

typedef結構名稱

{

char * py//姓名的拼音

int k;//拼音對應的整數

}姓名;

NAME NAME list[HASH _ LEN];

Typedef結構hterm //哈希表

{

char * py//姓名的拼音

int k;//拼音對應的整數

int si//查找長度

}哈希;

HASH HashList[HASH _ LEN];

/* - name(結構數組)初始化。

void InitNameList()

{

名稱列表[0]。py = " chenghongxiu

姓名列表[1]。py= "元昊";

名單[2]。py= "楊洋";

名單[3]。py = " zhanghen

名單[4]。py = " chenghongxiu

名單[5]。py= "肖凱";

名單[6]。py= "劉鵬";

名單[7]。py= "申永海";

名單[8]。py= "成道全";

名單[9]。py = " ludaoqing

名單[10]。py= "貢雲祥";

名單[11]。py= "孫振興";

名單[12]。py= "孫榮飛";

名單[13]。py= "孫明龍";

名單[14]。py= "張浩";

名單[15]。py= "田渺";

名單[16]。py= "姚建中";

名單[17]。py = " yaojianqing

名單[18]。py= "姚建華";

名單[19]。py= "姚海峰";

名單[20]。py = " chengyanhao

姓名列表[21]。py= "耀秋風";

名單[22]。py= "錢鵬程";

名單[23]。py= "姚海峰";

名單[24]。py = " bianyan

名單[25]。py= "雷淩";

名單[26]。py= "福中會";

名單[27]。py = " huanhaiyan

名單[28]。py = " liudianqin

名單[29]。py= "王斌年";

char * f;

int r,s0;

for(int I = 0;我& ltNAME _ NOI++)//找到每個名字的拼音對應的整數。

{

s0 = 0;

f =名稱列表[i]。py;

for(r = 0;*(f+r)!= '\0';R++) //方法:將字符串每個字符對應的ASCII碼相加,得到的整數作為哈希表的鍵。

s0 = *(f+r)+s0;

名單[i]。k = s0

}

}

/* -構建哈希表*/

void CreateHashList()

{

for(int I = 0;我& lt哈希_長度;I++)//哈希表的初始化

{

HashList[i]。py =

HashList[i]。k = 0;

HashList[i]。si = 0;

}

for(I = 0;我& ltNAME _ NO)

{

int sum = 0;

int adr=(NameList[i]。k)% M;//哈希函數

int d = adr

If(HashList[adr].si==0) //如果沒有沖突,

{

HashList[adr]。k =名稱列表[i]。k;

HashList[adr]。py=NameList[i]。py;

HashList[adr]。si = 1;

}

Else //沖突

{

{

d=(d+((名稱列表[i])。k))% 10+1)% M;//偽哈希

sum = sum+1;//搜索次數加1

}while (HashList[d].k!=0);

HashList[d]。k =名稱列表[i]。k;

HashList[d]。py=NameList[i]。py;

HashList[d]。si = sum+1;

} i++;

}

}

/* -搜索。

void FindList()

{

printf(" \ n \ n請輸入您姓名的拼音:");//輸入壹個名稱

char name[20]= { 0 };

scanf("%s ",名稱);

int s0 = 0;

for(int r = 0;r & lt20;R++) //查找姓名拼音對應的整數(關鍵字)。

s0+= name[r];

int sum = 1;

int ADR = s0 % M;//使用哈希函數

int d = adr

If(HashList[adr].k==s0) //分三種情況判斷。

printf(" \ n名稱:%s關鍵字:%d搜索長度:1 ",HashList[d]。py,s0);

else if (HashList[adr].k==0)

Printf("沒有這樣的記錄!");

其他

{

int g = 0;

{

d =(d+s0 % 10+1)% M;//偽哈希

sum = sum+1;

if (HashList[d].k==0)

{

Printf("無記錄!");

g = 1;

}

if (HashList[d].k==s0)

{

printf(" \ n名稱:%s關鍵字:%d搜索長度:%d ",HashList[d]。py,s0,sum);

g = 1;

}

} while(g = = 0);

}

}

/* -顯示哈希表。

空顯示()

{

printf(" \ n \ n address \ t key word \ t \ t搜索長度\ th(key)\ t \ t pinyin \ n ");//顯示格式

for(int I = 0;我& lt15;i++)

{

printf("%d ",I);

printf("\t%d ",HashList[i]。k);

printf("\t\t%d ",HashList[i]。si);

printf("\t\t%d ",(HashList[i])。k)% M);

printf("\t %s ",HashList[i]。py);

printf(" \ n ");

}

// printf("按任意鍵繼續顯示...\ n ");//因為數據很多,所以分屏顯示(這樣在Win9x/DOS下可以看到所有數據)。

//getch();

for(I = 15;我& lt30;i++)

{

printf("%d ",I);

printf("\t%d ",HashList[i]。k);

printf("\t\t%d ",HashList[i]。si);

printf("\t\t%d ",(HashList[i])。k)% M);

printf("\t %s ",HashList[i]。py);

printf(" \ n ");

}

// printf("按任意鍵繼續顯示...\ n ");

//getch();

for(I = 30;我& lt40;i++)

{

printf("%d ",I);

printf("\t%d ",HashList[i]。k);

printf("\t\t%d ",HashList[i]。si);

printf("\t\t%d ",(HashList[i])。k)% M);

printf("\t %s ",HashList[i]。py);

printf(" \ n ");

}

//printf("按任意鍵繼續顯示...\ n ");

//getch();

for(I = 40;我& lt50;i++)

{

printf("%d ",I);

printf("\t%d ",HashList[i]。k);

printf("\t\t%d ",HashList[i]。si);

printf("\t\t%d ",(HashList[i])。k)% M);

printf("\t %s ",HashList[i]。py);

printf(" \ n ");

}

浮動平均值= 0;

for(I = 0;我& lt哈希_長度;i++)

average+=HashList[i]。si;

average/= NAME _ NO;

printf(" \ n \ n平均搜索長度:ASL (%d) =% f \ n \ n ",name _ no,average);

}

/* -主函數。

void main()

{

/*::setconsolettitle("哈希表操作");//Windows API函數來設置控制臺窗口的標題。

HANDLE hCon =::GetStdHandle(STD _ OUTPUT _ HANDLE);//獲取標準輸出設備的句柄

* SetConsoleTextAttribute(hCon,10 | 0);//設置文本顏色

*/

Printf ("\ n -哈希表的建立和搜索");

init name list();

create hashlist();

while(1)

{

printf(" \ n \ n ");

Printf(" 1。顯示哈希表\ n ");

Printf(" 2。查找\ n ");

Printf(" 3。退出\ n ");

錯誤:

char ch 1;

scanf("%c ",& ampch 1);

if (ch1=='1 ')

顯示();

else if (ch1=='2 ')

FindList();

else if (ch1=='3 ')

返回;

其他

{

printf(" \ n請輸入正確的選項!");

goto err

}

}

}