哈希表实现电话号码查询系统
生活随笔
收集整理的這篇文章主要介紹了
哈希表实现电话号码查询系统
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
list.h
#pragma once //預(yù)防頭文件重復(fù)引用#include <stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #include<assert.h>#define MAX_N 30 //姓名最大長度 #define MAX_T 15 //電話號(hào)碼最大長度 #define MAX_A 100 //地址最大長度//用戶信息結(jié)構(gòu)體 typedef struct InfoNode {char _name[MAX_N]; //姓名char _telephone[MAX_T]; //電話號(hào)碼char _address[MAX_A]; //地址 }InfoNode;//輸入時(shí)以循環(huán)雙鏈表存儲(chǔ) typedef struct InfoNode_List {InfoNode* _ListInfo; //結(jié)構(gòu)體指針來存放用戶信息struct InfoNode_List* _next; //指向下一個(gè)節(jié)點(diǎn)struct InfoNode_List* _pre; //指向上一個(gè)節(jié)點(diǎn) }InfoNode_List;//初始化鏈表 void InitList(InfoNode_List* pl);//輸入用戶信息節(jié)點(diǎn) void ScanfNode(InfoNode* pnode);//增加鏈表節(jié)點(diǎn) void AddList(InfoNode_List* pl);//修改用戶信息 void ChangeNode(InfoNode* pnode);//刪除節(jié)點(diǎn) void DeleteListNode(InfoNode_List* pl);//姓名查找 InfoNode_List* FindName(InfoNode_List* phead, char* name);//電話號(hào)碼查找 InfoNode_List* FindTelephone(InfoNode_List* phead, char* telephone);//打印信息 void ShowInfo(InfoNode_List* phead);//打印一個(gè)用戶的信息 void ShowOnce(InfoNode* pi);//按字符ASCLL比較兩個(gè)用戶信息的大小 int CompareInfo(InfoNode* pi1, InfoNode* pi2);//排序 --> 插入排序法 void InsertSort(InfoNode_List* phead);//當(dāng)前信息寫入文件 void WriteFileInfo(InfoNode_List* phead);//讀取把文件信息插入鏈表 (頭插法) void ReadFileInfo(InfoNode_List* phead);//模擬加載頁面 void my_loading(const int time);//0.5秒睡眠加清屏 void SleepCls();//模擬進(jìn)度條 void ProgressBar();?list.c
#include "list.h"//睡眠加清屏 void SleepCls() {Sleep(500);//程序在這里暫停0.5秒system("cls");//清屏操作 }//模擬進(jìn)度條 void ProgressBar() {int i = 0;char arr[51] = { 0 }; //存放進(jìn)度的"#"char* brr = "|/-\\"; //模擬轉(zhuǎn)圈圈printf("\n");for (i = 0; i < 50; i++){arr[i] = '#';printf("[%-50s][%d%%][%c]\r", arr, (i + 1) * 2, brr[i % 4]); Sleep(50);}printf("\n"); //退格后的光標(biāo)向下一行移動(dòng) }//初始化鏈表 void InitList(InfoNode_List* phead) {assert(phead);phead->_next = phead; //頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)指向自己phead->_pre = phead; //頭結(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)指向自己 }//節(jié)點(diǎn)輸入用戶信息 void ScanfNode(InfoNode* pnode) {char name[MAX_N] = { '\0' }, telephone[MAX_T] = { '\0' }, address[MAX_A] = { '\0' };printf("_______________________________________\n");printf("|\n");printf("|請(qǐng)輸入用戶姓名-->");scanf("%s", name);strcpy(pnode->_name, name);printf("|請(qǐng)輸入用戶電話號(hào)碼-->");scanf("%s",telephone);strcpy(pnode->_telephone, telephone);printf("|請(qǐng)輸入用戶地址-->");scanf("%s",address);strcpy(pnode->_address, address);printf("|______________________________________\n"); }//修改用戶信息 void ChangeNode(InfoNode* pnode) {char choose_C;char name[MAX_N] = { '\0' }, telephone[MAX_T] = { '\0' }, address[MAX_A] = { '\0' };printf("_______________________________________\n");printf("|\n");printf("|請(qǐng)輸入修改后用戶姓名-->");scanf("%s", name);strcpy(pnode->_name, name);printf("|請(qǐng)輸入修改后用戶電話號(hào)碼-->");scanf("%s", telephone);strcpy(pnode->_telephone, telephone);printf("|是否修改用戶的地址(Y或者y)-->");getchar(); //吸收電話號(hào)碼輸入后的回車字符scanf("%c", &choose_C);if (choose_C == 'y' || choose_C == 'Y'){printf("|請(qǐng)輸入用戶地址-->");scanf("%s", address);strcpy(pnode->_address, address);}else{printf("|用戶地址 -->%s\n", pnode->_address);}printf("|______________________________________\n"); }//增加用戶信息 void AddList(InfoNode_List* phead) //采用頭插法 {assert(phead); //防止傳入野指針I(yè)nfoNode_List* node;node = (InfoNode_List*)malloc(sizeof(InfoNode_List)); node->_ListInfo = (InfoNode*)malloc(sizeof(InfoNode)); //為用戶信息結(jié)構(gòu)體開辟空間ScanfNode(node->_ListInfo); //輸入用戶信息//頭插法進(jìn)行節(jié)點(diǎn)的插入node->_next = phead->_next;phead->_next->_pre = node;node->_pre = phead;phead->_next = node;printf("----------------------------------\n");printf("%s的信息增加完畢\n\n", node->_ListInfo->_name); }//刪除節(jié)點(diǎn) void DeleteListNode(InfoNode_List* phead) {assert(phead);InfoNode_List* pre = (InfoNode_List*)malloc(sizeof(InfoNode_List));char sure='\0';int option=0;//打印內(nèi)部菜單printf("-----------------------------------------\n");printf("|\t按用戶姓名刪除(系統(tǒng)默認(rèn))-->1\t|\n");printf("-----------------------------------------\n");printf("|\t按用戶電話號(hào)碼查找并刪除-->0\t|\n");printf("-----------------------------------------\n");printf("您的選擇-->");scanf("%d", &option);if (option != 0) //默認(rèn)按照姓名查詢刪除{option = 1;}getchar(); //吸收scanf函數(shù)輸入停止時(shí)的回車字符switch (option){case 1:{char name[MAX_N] = { '\0' };printf("請(qǐng)輸入想要?jiǎng)h除聯(lián)系人的姓名-->");gets(name);pre = FindName(phead, name); //返回要?jiǎng)h除節(jié)點(diǎn)break;}case 0:{char telephone[MAX_T] = { '\0' };printf("請(qǐng)輸入想要?jiǎng)h除用戶的電話號(hào)碼-->");gets(telephone);pre = FindTelephone(phead, telephone); //返回要?jiǎng)h除節(jié)點(diǎn)break; }}if (pre) //如果找到該節(jié)點(diǎn),最后確認(rèn)一次是否刪除{printf("確認(rèn)刪除?y/Y -->");scanf("%c", &sure);if (sure == 'y' || sure == 'Y') //確認(rèn)刪除進(jìn)行鏈表刪除操作{InfoNode_List* cur = pre;cur->_pre->_next = cur->_next;cur->_next->_pre = cur->_pre;free(cur); //釋放掉要?jiǎng)h除的節(jié)點(diǎn)空間printf("刪除成功\n");}else{printf("取消刪除,返回主頁面\n"); //不想刪除則返回主頁面}} }//姓名查找(刪除函數(shù)中調(diào)用) InfoNode_List* FindName(InfoNode_List* phead, char* name) {assert(phead && name); //防止傳入野指針I(yè)nfoNode_List* node = phead->_next; //保留頭結(jié)點(diǎn)位置//尋找該用戶//循環(huán)結(jié)束的條件 鏈表指針node指向頭結(jié)點(diǎn) 或 node節(jié)點(diǎn)為要?jiǎng)h除的節(jié)點(diǎn)while (node!=phead && strcmp(node->_ListInfo->_name, name) != 0){node = node->_next; //移動(dòng)指針}if (node!=phead){//找到后進(jìn)行打印printf("該用戶已經(jīng)找到\n");ShowOnce(node->_ListInfo);return node; //返回要?jiǎng)h除節(jié)點(diǎn)}else{printf("沒有找到該用戶,將返回主頁面\n");return NULL; //返回為NULL} }//打印鏈表中的用戶信息 void ShowInfo(InfoNode_List* phead) {assert(phead);InfoNode_List* node = phead->_next;if (node==phead) //防止鏈表中沒有用戶信息{printf("沒有用戶信息可以打印\n");return;}printf("_________________________________________________________\n");printf("\t姓名\t 電話號(hào)碼\t 地址\n");printf("_________________________________________________________\n");while (node!=phead){printf("%12s\t%11s\t%s\n", node->_ListInfo->_name, \node->_ListInfo->_telephone, \node->_ListInfo->_address);printf("---------------------------------------------------------\n");node = node->_next;} }//打印一個(gè)節(jié)點(diǎn)的信息 void ShowOnce(InfoNode* pi) {assert(pi);printf(" _________________________________________________\n");printf("|\n");printf("|姓名: %s\n", pi->_name);printf("|電話號(hào)碼:%s\n", pi->_telephone);printf("|地址: %s\n", pi->_address);printf("|_________________________________________________\n"); }//電話號(hào)碼查找(刪除函數(shù)中調(diào)用) InfoNode_List* FindTelephone(InfoNode_List* phead, char* telephone) {assert(phead && telephone); //防止傳入野指針I(yè)nfoNode_List* node = phead->_next; //保留頭結(jié)點(diǎn)位置//尋找該用戶//循環(huán)結(jié)束的條件 鏈表指針node指向phead 或 node為要?jiǎng)h除的節(jié)點(diǎn)while (node!=phead && strcmp(node->_ListInfo->_telephone, telephone) != 0){node = node->_next; //移動(dòng)節(jié)點(diǎn)}if (node!=phead) //如果找到,對(duì)要?jiǎng)h除節(jié)點(diǎn)進(jìn)行打印{printf("該用戶已經(jīng)找到\n");ShowOnce(node->_ListInfo);return node; //函數(shù)返回要?jiǎng)h除節(jié)點(diǎn)}else{printf("沒有找到該用戶,將返回主頁面\n");return NULL; //沒有找到則返回NULL} }//按字符ASCLL比較兩個(gè)用戶信息的大小 int CompareInfo(InfoNode* pi1, InfoNode* pi2) {assert(pi1 && pi2);int ans=0; //記錄比較后的結(jié)果/*ans = strcmp(pi1->_name, pi2->_name); //先按照姓名比較if (ans == 0) //結(jié)果為0,表示名字相等 再比較電話號(hào)碼{//電話號(hào)碼不可能相等,返回比較后的結(jié)果ans = strcmp(pi1->_telephone, pi2->_telephone);}return ans;*/return (ans = strcmp(pi1->_name, pi2->_name)) != 0 ? \ans : strcmp(pi1->_telephone, pi2->_telephone); }//排序 --> 循環(huán)雙鏈表的插入排序法 void InsertSort(InfoNode_List* phead) {assert(phead);InfoNode_List* cur = phead->_next; //cur 指針記錄當(dāng)前被比較的節(jié)點(diǎn)InfoNode_List* node = cur->_next; //node 指針記錄需要比較的節(jié)點(diǎn)InfoNode_List* nodenext; //nodenext 指針記錄下一個(gè)需要比較的節(jié)點(diǎn)while (node!=phead) //循環(huán)退出的條件 node節(jié)點(diǎn)不是頭結(jié)點(diǎn){cur = phead->_next; //每次比較都從頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)開始//找到第一個(gè)比node節(jié)點(diǎn)信息大的節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)記錄為curwhile (cur != node && \CompareInfo(cur->_ListInfo, node->_ListInfo) <= 0){cur = cur->_next;}nodenext = node->_next; //保存需要比較節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)//如果cur==node 表示該節(jié)點(diǎn)就是前面節(jié)點(diǎn)中最大的,不做處理,跳出循環(huán)if (cur != node){//先連接node節(jié)點(diǎn)的前后兩個(gè)節(jié)點(diǎn)nodenext->_pre = node->_pre; node->_pre->_next = nodenext;//再連接node節(jié)點(diǎn)和cur節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)cur->_pre->_next = node;node->_pre = cur->_pre;//最后把node節(jié)點(diǎn)和cur連接,完成在cur節(jié)點(diǎn)的前面插入node->_next = cur;cur->_pre = node;}//把下一個(gè)需要比較的節(jié)點(diǎn)給nodenode = nodenext;nodenext = node->_next;}char choose_s='\0';my_loading(3);printf("鏈表信息的排序已完成\n");printf("是否顯示排序后的鏈表(y或Y)-->");scanf("%c", &choose_s);if (choose_s == 'y' || choose_s == 'Y'){SleepCls(); //睡眠加清屏ShowInfo(phead); //打印信息} }//模擬加載界面 void my_loading(const int time) {int i = 0;for (i = 1; i < time; i++){printf("\t%d......\n",i);Sleep(500);} }//將鏈表的信息寫入文件 void WriteFileInfo(InfoNode_List* phead) {assert(phead);InfoNode_List* node = phead->_next;if (node==phead) //防止鏈表中沒有用戶信息{printf("沒有需要儲(chǔ)存的用戶信息\n");return;}int num = 0; //記錄用戶數(shù)量FILE* fp; //文件指針fp = fopen("text.txt", "w"); // 打開寫入的文件 //文件指針完成的功能是寫,打開的文件是 text.txtwhile (node!=phead){fprintf(fp, "-%s\t\t%s\t\t%s\n", node->_ListInfo->_name, \node->_ListInfo->_telephone,\node->_ListInfo->_address);node = node->_next;num++; //記錄載入用戶的數(shù)量}fprintf(fp, "|\t\t共%d個(gè)用戶信息\t\t|\n",num);fclose(fp); //關(guān)閉文件my_loading(4); //模擬加載界面printf("用戶信息已保存\n"); }//讀取文件中的信息 void ReadFileInfo(InfoNode_List* phead) {assert(phead);FILE* fp; //建立文件指針char flag='\0'; //判斷文件讀取結(jié)束的標(biāo)志fp = fopen("text.txt", "r"); //打開文件while ((flag = fgetc(fp)) != '|'){//創(chuàng)建一個(gè)節(jié)點(diǎn)來存儲(chǔ)文件中的用戶信息InfoNode_List* node;node = (InfoNode_List*)malloc(sizeof(InfoNode_List));//為用戶信息結(jié)構(gòu)體開辟空間node->_ListInfo = (InfoNode*)malloc(sizeof(InfoNode));fscanf(fp, "%s%s%s", node->_ListInfo->_name, \node->_ListInfo->_telephone, \node->_ListInfo->_address);flag = fgetc(fp); //處理掉當(dāng)前行末的換行符//節(jié)點(diǎn)插入(尾插法)//先把node節(jié)點(diǎn)和鏈表的尾連起來node->_pre = phead->_pre->_next;phead->_pre->_next = node;//再把node節(jié)點(diǎn)和鏈表的頭連接起來node->_next = phead;phead->_pre = node;}fclose(fp); //關(guān)閉文件my_loading(4); //模擬加載界面printf("用戶電話號(hào)碼信息載入完畢\n"); }hashname.h
#include"list.h"//用姓名為關(guān)鍵字建立哈希表 //取權(quán)值的公式 姓名的首尾字符相加再對(duì)50取余 //處理沖突的方法 再散列法#define DIV (50) //除留余數(shù)法的除數(shù)typedef struct HTName {InfoNode* _NameInfo; //用戶信息int _key; //建表后的權(quán)值int _ishave; //判斷該位置有沒有填入用戶 }HTName;typedef struct NameTableH {HTName* _NameArr; //動(dòng)態(tài)開辟數(shù)組來存放用戶信息int _psize; //當(dāng)前存放信息的用戶數(shù)量int _capacity; //數(shù)組當(dāng)前的容量 }NameTableH;//初始化哈希表 void InitNameTableH(NameTableH* pn);//哈希表擴(kuò)容 void AddCapacity(NameTableH* pn,const int key);//建立哈希表 void SetNameTableH(NameTableH* pn, InfoNode_List* phead);//查找用戶信息 int FindNameTableH(NameTableH* pn, const char* name);//修改用戶信息 void ChangeNameTableH(NameTableH* pn);?hashname.c
#include "hashname.h"//初始化哈希表 void InitNameTableH(NameTableH* pn) {assert(pn);pn->_psize = 0; //數(shù)組中沒有成員pn->_capacity = DIV; //數(shù)組當(dāng)前的容量為除留余數(shù)法的除數(shù)pn->_NameArr = (HTName*)malloc(sizeof(HTName)*pn->_capacity);//為數(shù)組開辟當(dāng)前容量的空間int i = 0;for (i = 0; i < pn->_capacity; i++){//將數(shù)組每個(gè)位置初始化為0//0表示該位置沒有存放成員信息pn->_NameArr[i]._ishave = 0; } }//哈希表擴(kuò)容 void AddCapacity(NameTableH* pn, const int key) {assert(pn && key < pn->_capacity);pn->_capacity *= 2;pn->_NameArr = (HTName*)realloc(pn->_NameArr, sizeof(HTName)*pn->_capacity);//realloc函數(shù)進(jìn)行擴(kuò)容,不會(huì)改變數(shù)組原來空間內(nèi)容的信息//每次擴(kuò)容的大小為當(dāng)前容量的2倍int i = 0;for (i = pn->_psize;i< pn->_capacity; i++){pn->_NameArr[i]._ishave = 0; //初始化新增加的空間有無用戶的情況}//為了不改變哈希表查找時(shí)候的順序//擴(kuò)容完畢后,將數(shù)組中當(dāng)前權(quán)值前面的信息都依次移動(dòng)到新開辟的地方后面for (i = 0; i < key; i++){pn->_NameArr[i + pn->_psize]._NameInfo = pn->_NameArr[i]._NameInfo; //用戶信息移動(dòng)pn->_NameArr[i + pn->_psize]._key = pn->_NameArr[i]._key; //權(quán)值移動(dòng)pn->_NameArr[i]._ishave = 0; //當(dāng)前位置置為無值pn->_NameArr[i + pn->_psize]._ishave = 1; //移動(dòng)后的位置置為有值} }//建立哈希表 void SetNameTableH(NameTableH* pn, InfoNode_List* phead) {assert(pn && phead);if (phead==phead->_next){printf("沒有用戶的信息!\n");return;}InfoNode_List* node = phead->_next;char Fname, Lname; //一個(gè)表示姓名的首字符,一個(gè)表示尾字符int len; //表示姓名的長度int key; //表示計(jì)算后的權(quán)值while (node!=phead){Fname = node->_ListInfo->_name[0];len = strlen(node->_ListInfo->_name);Lname = node->_ListInfo->_name[len-1];key = (int)(Fname + Lname) % DIV; //計(jì)算權(quán)值if (pn->_psize == pn->_capacity) //判斷是否需要擴(kuò)容{AddCapacity(pn,key);}if (!pn->_NameArr[key]._ishave)//該位置沒有出現(xiàn)沖突{//將該節(jié)點(diǎn)中用戶信息節(jié)點(diǎn) 賦值給 哈希表中該位置用戶信息節(jié)點(diǎn)pn->_NameArr[key]._NameInfo = node->_ListInfo;//記錄該位置權(quán)值pn->_NameArr[key]._key = key;//修改該位置為有值pn->_NameArr[key]._ishave = 1;}else //出現(xiàn)沖突,用再散列法解決沖突{int i = key+1;while (pn->_NameArr[i]._ishave)//找到第一個(gè)不沖突的節(jié)點(diǎn){i = (i + 1) % pn->_capacity;//讓該位置在邏輯上動(dòng)態(tài)連接起來}//將該節(jié)點(diǎn)中用戶信息節(jié)點(diǎn) 賦值給 哈希表中該位置用戶信息節(jié)點(diǎn)pn->_NameArr[i]._NameInfo = node->_ListInfo;//記錄該位置權(quán)值pn->_NameArr[i]._key = key;//修改該位置為有值pn->_NameArr[i]._ishave = 1;}node = node->_next;pn->_psize++;}ProgressBar(); //模擬進(jìn)度條printf("\t姓名哈希表建立完畢\n");SleepCls(); //0.5秒睡眠+清屏 }//查找用戶信息 int FindNameTableH(NameTableH* pn, const char* name) {assert(pn && name);char Fname, Lname;Fname = name[0];int len = strlen(name);Lname = name[len - 1]; //取首字符和尾字符int key = (int)(Fname + Lname) % DIV; //計(jì)算權(quán)值int i = key;int count = 0;//查找時(shí)循環(huán)跳出的條件//1.當(dāng)前位置沒有存放用戶信息//2.如果數(shù)組可以存放的用戶已經(jīng)滿了,并且沒有需要查找的人//即循環(huán)走了當(dāng)前容量的步驟 ---> count==pn->_capacity//3.權(quán)值相同while ( pn->_NameArr[i]._ishave \&& (count++)<pn->_capacity \&& pn->_NameArr[i]._key != key){i = (i + 1) % pn->_capacity;}//判斷是哪種條件跳出循環(huán)//如果是1 2 ,則表示沒有找到,退出函數(shù)if (pn->_capacity == count || !pn->_NameArr[i]._ishave){printf("沒有找到該用戶\n");return -1;}//3 表示找到,進(jìn)行打印ShowOnce(pn->_NameArr[i]._NameInfo);return i; }//修改用戶信息 void ChangeNameTableH(NameTableH* pn) {assert(pn);char name[MAX_N] = { '\0' };printf("請(qǐng)輸入需要修改的用戶的姓名-->");scanf("%s", name);int i = FindNameTableH(pn,name); //調(diào)用函數(shù)先來查找用戶system("pause"); //程序暫停,按任意鍵繼續(xù)if (i != -1) //表示找到該用戶{SleepCls();printf("請(qǐng)重新輸入該用戶的信息:\n");ChangeNode(pn->_NameArr[i]._NameInfo);//重新輸入該用戶的信息,選擇性輸入地址} }hashtele.h
#include "list.h"//以用戶的電話號(hào)碼為關(guān)鍵字建立散列表 //取權(quán)值的公式 電話號(hào)碼每個(gè)數(shù)字字符相加 對(duì)50取余 //處理沖突的方法 鏈地址法#define MAX_TELEARR 50 //鏈的最大高度typedef struct HTTele //鏈地址法每個(gè)節(jié)點(diǎn) {InfoNode* _TeleInfo; //用戶信息struct HTTele* next; //邏輯上連接下一個(gè)同權(quán)值的節(jié)點(diǎn) }HTTele;typedef struct TeleListH {HTTele* _TeleArr; //鏈的頭 }TeleListH;//初始化哈希鏈 void InitTeleListH(TeleListH* pt);//建立哈希鏈 void SetTeleListH(TeleListH* pt, InfoNode_List* phead);//電話號(hào)碼查找用戶 InfoNode* FindTeleListH(TeleListH* pt, const char* telephone);//修改用戶信息 void ChangeTeleListH(TeleListH* pt);hashtele.c
#include "list.h" #include "hashtele.h"//初始化哈希鏈 void InitTeleListH(TeleListH* pt) {assert(pt);pt->_TeleArr = (HTTele*)malloc(sizeof(HTTele)*MAX_TELEARR); //開辟存儲(chǔ)信息的空間int i = 0;for (i = 0; i < MAX_TELEARR; i++){pt->_TeleArr[i].next = NULL; //每一層的鏈頭的next指針初始化為NULL} }//建立哈希鏈 void SetTeleListH(TeleListH* pt, InfoNode_List* phead) {assert(pt && phead);if (phead==phead->_next) //判斷有沒有用戶信息可以查找{printf("沒有用戶的信息!\n");return;}InfoNode_List* node = phead->_next;int len = 0;while (node!=phead){int key = 0;len = strlen(node->_ListInfo->_telephone);while (len) //計(jì)算權(quán)值{key += (int)node->_ListInfo->_telephone[len - 1];key %=MAX_TELEARR; //除留余數(shù)法 除數(shù)為鏈的高度len--;}//建立一個(gè)新的鏈節(jié)點(diǎn)HTTele* Newnode = (HTTele*)malloc(sizeof(HTTele));Newnode->_TeleInfo = node->_ListInfo; //用戶信息的復(fù)制Newnode->next = NULL;if (!pt->_TeleArr[key].next) //如果該位置的頭沒有地址{pt->_TeleArr[key].next = Newnode;}else{//在當(dāng)前鏈的頭進(jìn)行插入Newnode->next=pt->_TeleArr[key].next;pt->_TeleArr[key].next = Newnode;}node = node->_next;}ProgressBar(); //模擬進(jìn)度條printf("電話號(hào)碼哈希鏈建立完畢\n");SleepCls(); //0.5秒睡眠+清屏 }//電話號(hào)碼查找用戶 InfoNode* FindTeleListH(TeleListH* pt, const char* telephone) {assert(pt);int key = 0;int len = strlen(telephone);while (len) //計(jì)算權(quán)值{key += (int)telephone[len - 1];key %= MAX_TELEARR; //除留余數(shù)法 除數(shù)為鏈的高度len--;}if (!pt->_TeleArr[key].next){printf("沒有找到該用戶\n");return NULL;}else{HTTele* Newnode = pt->_TeleArr[key].next;while (Newnode){if (strcmp(Newnode->_TeleInfo->_telephone, telephone) == 0){ShowOnce(Newnode->_TeleInfo); //打印要查找的該用戶信息return Newnode->_TeleInfo; //函數(shù)返回該用戶的信息節(jié)點(diǎn)}Newnode = Newnode->next;}}printf("沒有找到該用戶\n");return NULL; }//修改用戶信息 void ChangeTeleListH(TeleListH* pt) {assert(pt);printf("請(qǐng)輸入要修改用戶的電話號(hào)碼-->");char tele[MAX_T];scanf("%s", tele);InfoNode* Newnode=FindTeleListH(pt, tele);system("pause"); //程序暫停,按任意鍵繼續(xù)if (!Newnode) //如果查找函數(shù)返回值為NULL,表示未找到,直接返回{return;}SleepCls();printf("請(qǐng)重新輸入該用戶的信息:\n");ChangeNode(Newnode); //重新輸入該用戶的新的所有信息 }text.c
#include "list.h" #include"hashname.h" #include "hashtele.h"void menuFind() {printf("-----------------------------------------\n");printf("|\t查找用戶信息-->1\t\t|\n");printf("-----------------------------------------\n");printf("|\t修改用戶信息-->2\t\t|\n");printf("-----------------------------------------\n");printf("您的選擇-->"); }void menu() {system("color 3");printf("\t _______________________________________\n");printf("\t|\t散列表電話號(hào)碼查詢系統(tǒng)\t\t|\n");printf("\t|\t 1.增加用戶信息\t\t|\n");printf("\t|\t 2.刪除用戶信息\t\t|\n");printf("\t|\t 3.用戶名查找和修改用戶信息 |\n");printf("\t|\t 4.電話號(hào)碼查找和修改用戶信息\t|\n");printf("\t|\t 5.用戶信息載入文件\t\t|\n");printf("\t|\t 6.從文件中讀取用戶信息\t|\n");printf("\t|\t 7.對(duì)用戶信息進(jìn)行排序\t\t|\n");printf("\t|\t 8.打印所有用戶信息\t\t|\n");printf("\t|\t 0.退出\t\t\t|\n");printf("\t|_______________________________________|\n\n"); }int main() {int input=1;int choose;InfoNode_List* head; //建立雙向循環(huán)鏈表的頭結(jié)點(diǎn)head = (InfoNode_List*)malloc(sizeof(InfoNode_List));InitList(head); //初始化鏈表ReadFileInfo(head); //讀取文件信息 系統(tǒng)開始時(shí)自動(dòng)讀取文件中的信息printf("\n信息讀取完畢,即將進(jìn)入主頁面\n");ProgressBar(); //模擬進(jìn)度條載入SleepCls(); //0.5秒睡眠加清屏while (1){menu();printf("請(qǐng)輸入您的選擇:--> ");scanf("%d", &choose); //choose表示外部菜單的選項(xiàng)getchar(); //處理掉用戶輸入后的回車字符printf("\n即將執(zhí)行您的選擇");SleepCls(); //0.5秒睡眠加清屏switch (choose){case 1:{char isagain = 'y';while (isagain == 'y' || isagain == 'Y'){printf("請(qǐng)輸入需要增加的用戶信息:\n");printf("----------------------------------\n");AddList(head); //增加用戶信息printf("是否繼續(xù)輸入用戶信息(y或者Y)-->"); getchar(); //處理掉用戶輸入后的回車字符scanf("%c", &isagain);SleepCls();}break;}case 2:DeleteListNode(head); //刪除用戶信息break;case 3: //用戶名查找和修改用戶信息{NameTableH* HTname;HTname = (NameTableH*)malloc(sizeof(NameTableH));InitNameTableH(HTname); //初始化姓名散列表SetNameTableH(HTname, head); //建立散列表menuFind(); //打印查找菜單scanf("%d", &input); //input 內(nèi)部菜單的選項(xiàng)switch (input){case 1: //查找{printf("請(qǐng)輸入要查尋用戶的姓名:");char name[MAX_N] = "\0";scanf("%s", name);FindNameTableH(HTname, name);//姓名查找函數(shù)break; } case 2: //修改ChangeNameTableH(HTname); //先查找再修改break;}break;} case 4: //電話號(hào)碼查找和修改用戶信息{TeleListH* HTTele; //電話號(hào)碼哈希表的結(jié)構(gòu)體HTTele = (TeleListH*)malloc(sizeof(TeleListH));InitTeleListH(HTTele); //初始化SetTeleListH(HTTele, head); //建立電話號(hào)碼哈希表menuFind(); //打印查找菜單scanf("%d", &input); //input 內(nèi)部菜單的選項(xiàng)switch (input){case 1: //查找printf("請(qǐng)輸入要查尋用戶的電話號(hào)碼:");char telephone[MAX_T] = { '\0' };scanf("%s", telephone);FindTeleListH(HTTele, telephone); //電話號(hào)碼查找break;case 2: //修改ChangeTeleListH(HTTele); //先查找再修改break;}break;}case 5:WriteFileInfo(head); //寫入文件break;case 6:ReadFileInfo(head); //讀取文件信息break;case 7:InsertSort(head); //插入排序break;case 8:ShowInfo(head); //打印所有信息break;default:WriteFileInfo(head); //寫入文件 程序結(jié)束對(duì)輸入的信息進(jìn)行文件保護(hù)printf("\n感謝使用~\n");return 0;}if (choose != 1){system("pause");SleepCls();}} }//void text1(InfoNode_List* phead) //{ // InitList(phead); //初始化 // ReadFileInfo(phead); // AddList(phead); //增加用戶信息 // DeleteListNode(phead); //刪除用戶信息 // BubbleSort(phead); // WriteFileInfo(phead); // ShowInfo(phead); //} // //void text2(InfoNode_List* phead) //{ // NameTableH* HTname; // HTname = (NameTableH*)malloc(sizeof(NameTableH)); // // InitNameTableH(HTname);//初始化姓名哈希表 // SetNameTableH(HTname, phead); // char name[MAX_N] = "duchenlong"; // FindNameTableH(HTname, name); // ChangeNameTableH(HTname); //} // //void text3(InfoNode_List* phead) //{ // TeleListH* HTTele; // HTTele = (TeleListH*)malloc(sizeof(TeleListH)); // InitTeleListH(HTTele); // SetTeleListH(HTTele,phead); // char telephone[MAX_T] = "13325430774"; // FindTeleListH(HTTele,telephone); // ChangeTeleListH(HTTele); //} //int main() //{ // InfoNode_List* head; // head = (InfoNode_List*)malloc(sizeof(InfoNode_List)); // text1(head); //鏈表調(diào)試測(cè)試接口 // //text2(head); //姓名為關(guān)鍵字哈希表的測(cè)試接口 // text3(head); // return 0; //}模擬進(jìn)度條和加載
開始界面
?
總結(jié)
以上是生活随笔為你收集整理的哈希表实现电话号码查询系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中文件变化监控-watchd
- 下一篇: 合肥工业大学数值分析(计算方法)满分实验