C語(yǔ)言基于哈希表實(shí)現(xiàn)通訊錄
本文為大家分享了C語(yǔ)言基于哈希表實(shí)現(xiàn)通訊錄的具體代碼,供大家參考,具體內(nèi)容如下
1.需求分析
本演示程序用C語(yǔ)言編寫(xiě),完成哈希表的生成,電話(huà)號(hào)碼的插入、以及查找等功能。
(1)按提示輸入相應(yīng)的聯(lián)系人的相關(guān)資料;
(2)以相應(yīng)的輸出形式輸出所存儲(chǔ)的的聯(lián)系人的資料;
(3)程序可以達(dá)到建立、添加、查找、打印的功能;
(4)程序可以判斷用戶(hù)輸入的非法數(shù)據(jù)并引導(dǎo)正確的輸入。
2.概要設(shè)計(jì)
存儲(chǔ)電話(huà)號(hào)碼的記錄時(shí),若在存儲(chǔ)位置和其關(guān)鍵字之間建立某種確定的對(duì)應(yīng)關(guān)系使得每個(gè)關(guān)鍵字和存儲(chǔ)結(jié)構(gòu)中一個(gè)唯一的存儲(chǔ)位置相對(duì)應(yīng),那么在進(jìn)行查找時(shí),根據(jù)這個(gè)對(duì)應(yīng)關(guān)系f就可以找到給定值K的像f(K)。若存儲(chǔ)結(jié)構(gòu)中存在關(guān)接找到所查記錄。這個(gè)對(duì)應(yīng)關(guān)系f稱(chēng)為哈希(Hash)函數(shù)或散列函數(shù)。按照以上思路建立的表稱(chēng)為哈希表或散列表。本案例設(shè)計(jì)主要考察散列表的建立、查找和修改。。
3.詳細(xì)設(shè)計(jì)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
char num[11],name[15],address[20],city[15],etp[20];
struct node *next;
}NUM;
struct NUM *num_list[19];
int hash(char num[])
{
int i,k=0;
for(i=0;num[i]!='\0';i++)
{
k=10*k+num[i]-48; //字符轉(zhuǎn)化為數(shù)字
}
k=(k%19); //除余法求散列地址
return k;
}//c除留余數(shù)法處理電話(huà)號(hào)碼
void create()
{
struct node *p1;
int k1,m=0;
while(m==0)
{
printf("請(qǐng)輸入你想添加人的信息:num name address city etp,\n");
p1=(struct node *)malloc(sizeof(struct node));
scanf("%s",p1->num);
scanf("%s",p1->name);
scanf("%s",p1->address);
scanf("%s",p1->city);
scanf("%s",p1->etp);
k1=hash(p1->num);//用num數(shù)組值作為參數(shù)傳遞給哈希函數(shù)得到k1
p1->next=num_list[k1];//將k1得到的值作為數(shù)組的儲(chǔ)存地址賦值給頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
num_list[k1]=p1;//再將p1的數(shù)據(jù)傳遞給數(shù)組,故p1可以釋放作為下一個(gè)節(jié)點(diǎn)產(chǎn)生
printf("結(jié)束請(qǐng)按1,再次輸入請(qǐng)按0\n");
scanf("%d",&m);
}
printf("通訊表已經(jīng)創(chuàng)建\n");
}
void dlter()
{
char num[11];
int k1;
int find=0;
struct node *f;
printf("請(qǐng)查詢(xún)要修改的聯(lián)系人的電話(huà):\n:");
scanf("%s",num);
k1=hash(num);
f=num_list[k1];
while(f!=NULL)
{
if(strcmp(f->num,num)==0)
{
printf("查找到了!請(qǐng)輸入要修改的人的資料:\n");
scanf("%s%s%s",f->num,f->name,f->address,f->city,f->etp);
find=1;
}
f=f->next;
}
if(find=0)
printf("沒(méi)有找到要?jiǎng)h除的節(jié)點(diǎn)!");
}
void list()
{
struct node *f;//打印節(jié)點(diǎn)指針
int i;
printf("打印通訊錄如下:\n");
for(i=0;i<19;i++)
{
f=num_list[i];
while(f!=NULL)
{
printf("--->num:%s\t name:%s\t address:%s\t city:%s\t etp:%s\t \n",f->num,f->name,f->address,f->city,f->etp);
f=f->next;
}
}
}
void add()
{
char num[11],name[15],address[20],city[15],etp[20];
struct node *p1;
int k1;
printf("請(qǐng)輸入新添加的人的信息:電話(huà) 姓名 地址 城市 郵箱\n");
p1=(struct node *)malloc(sizeof(struct node));
scanf("%s%s%s",num,name,address);
strcpy(p1->num,num);
strcpy(p1->name,name);
strcpy(p1->address,address);
strcpy(p1->city,city);
strcpy(p1->etp,etp);
k1=hash(p1->num);
p1->next=num_list[k1];
num_list[k1]=p1;
printf("ok\n");
}
void search()
{
char num[11];
int k1;
int find=0;
struct node *f;
printf("請(qǐng)輸入查詢(xún)?nèi)说碾娫?huà)號(hào)碼:");
scanf("%s",num);
k1=hash(num);
f=num_list[k1];
while(f!=NULL)
{
if(strcmp(f->num,num)==0)
{
printf("所要查找的聯(lián)系人信息 :num:%s name:%s address:%s city:%s etp:%s\n",f->num,f->name,f->address,f->city,f->etp);
find=1;
}
f=f->next;
}
if(find=0)
printf("此聯(lián)系人沒(méi)有找到!");
}
void main()
{
int i;
char x;
for(i=0;i<19;i++)
{
num_list[i]=NULL;
}
while(1)
{
// system("cls");
printf("\n");
printf("★★★★★★★★★通訊錄★★★★★★★★★\n");
printf("★◆----------------------------------◆★\n");
printf("★| 1.建立 ?。颸n");
printf("★| ?。颸n");
printf("★| 2.查找 ?。颸n");
printf("★| |★\n");
printf("★| 3.添加 ?。颸n");
printf("★| ?。颸n");
printf("★| 4.修改 |★\n");
printf("★| ?。颸n");
printf("★| 5.打印 ?。颸n");
printf("★| |★\n");
printf("★| 6.結(jié)束 ?。颸n");
printf("★◆----------------------------------◆★\n");
printf("★★★★★★★★★★★★★★★★★★★★★\n");
// x=getchar();
scanf("%s",&x);
switch(x)
{
case '1': create();break;
case '2': search();break;
case '3': add();break;
case '4': dlter();break;
case '5': list();break;
case '6': return;
default:printf("請(qǐng)重新輸入;\n");
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:用C編寫(xiě)一個(gè)送給女朋友的情人節(jié)小程序 可愛(ài)!
欄 目:C語(yǔ)言
本文標(biāo)題:C語(yǔ)言基于哈希表實(shí)現(xiàn)通訊錄
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/904.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子


