C語言如何利用哈希表實現通訊錄
本篇內容主要講解“C語言如何利用哈希表實現通訊錄”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C語言如何利用哈希表實現通訊錄”吧!
1.需求分析
本演示程序用C語言編寫,完成哈希表的生成,電話號碼的插入、以及查找等功能。
(1)按提示輸入相應的聯系人的相關資料;
(2)以相應的輸出形式輸出所存儲的的聯系人的資料;
(3)程序可以達到建立、添加、查找、打印的功能;
(4)程序可以判斷用戶輸入的非法數據并引導正確的輸入。
2.概要設計
存儲電話號碼的記錄時,若在存儲位置和其關鍵字之間建立某種確定的對應關系使得每個關鍵字和存儲結構中一個唯一的存儲位置相對應,那么在進行查找時,根據這個對應關系f就可以找到給定值K的像f(K)。若存儲結構中存在關接找到所查記錄。這個對應關系f稱為哈希(Hash)函數或散列函數。按照以上思路建立的表稱為哈希表或散列表。本案例設計主要考察散列表的建立、查找和修改。
3.詳細設計
#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;??//字符轉化為數字? ??}? ??k=(k%19);????//除余法求散列地址? ??return?k;? }//c除留余數法處理電話號碼? void?create()? {? ??struct?node?*p1;? ??int?k1,m=0;? ??while(m==0)? ??{? ???printf("請輸入你想添加人的信息: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數組值作為參數傳遞給哈希函數得到k1? ???p1->next=num_list[k1];//將k1得到的值作為數組的儲存地址賦值給頭結點的下一個節點? ???num_list[k1]=p1;//再將p1的數據傳遞給數組,故p1可以釋放作為下一個節點產生? ???printf("結束請按1,再次輸入請按0\n");? ???scanf("%d",&m);? ??}? ??printf("通訊表已經創建\n");? }? ??void?dlter()? {? ???char?num[11];? ??int?k1;? ??int?find=0;? ??struct?node?*f;? ????printf("請查詢要修改的聯系人的電話:\n:");? ????scanf("%s",num);? ????k1=hash(num);? ????f=num_list[k1];? ????while(f!=NULL)? ????{? ??????if(strcmp(f->num,num)==0)? ??????{? ???????printf("查找到了!請輸入要修改的人的資料:\n");? ???????scanf("%s%s%s",f->num,f->name,f->address,f->city,f->etp);? ???????find=1;? ??????}? ??????f=f->next;? ????}? ????if(find=0)? ??????printf("沒有找到要刪除的節點!");? ? ? ??}? void?list()? {? ??struct?node?*f;//打印節點指針? ??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("請輸入新添加的人的信息:電話?姓名?地址?城市?郵箱\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("請輸入查詢人的電話號碼:");? ????scanf("%s",num);? ????k1=hash(num);? ????f=num_list[k1];? ????while(f!=NULL)? ????{? ??????if(strcmp(f->num,num)==0)? ??????{? ????????printf("所要查找的聯系人信息?: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("此聯系人沒有找到!");? ? ? ??}? 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.結束 ?。颸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("請重新輸入;\n");? ????}? ??}? }
到此,相信大家對“C語言如何利用哈希表實現通訊錄”有了更深的了解,不妨來實際操作一番吧!這里是蝸牛博客網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。版權聲明:如無特殊標注,文章均為本站原創,轉載時請以鏈接形式注明文章出處。
評論