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