1. 程式人生 > 其它 >電話號碼本的快速查詢

電話號碼本的快速查詢

技術標籤:c++

電話號碼本的快速查詢

• 建立基於鏈地址法的hash表,並實現電話薄的管理(記錄不超過20個)。
• 電話薄中的記錄包括姓名、電話號碼和地址三個資料項,建立兩個hash表,關鍵字分別為姓名和電話號碼
• Hash函式為姓名前兩個字母/電話號碼最後三個數字求和之後對17取餘
• 完成記錄的插入、查詢、顯示功能

輸入0:增加一條記錄。
輸入1:根據輸入的姓名搜尋記錄並輸出。
輸入2:根據輸入的電話搜尋記錄並輸出。
輸入3:根據姓名查詢表輸出全部記錄。
輸入4:根據電話查詢表輸出全部記錄。
輸入5:退出。

#include<iostream>
#include<string.h>
#define len 17 using namespace std; typedef struct node //create node { char name[8];//define array for name char address[20];//define array for address char tel[11];//define array for telephone num node* next; }Person; typedef struct Hash { Person* data; int count; int sizeindex; }Hash; bool makeH
(Hash* table); bool insetH(Hash* nametable, Hash* teltable, Person person); bool searchnameH(Hash* nametable, char name[]); bool searchtelH(Hash* teltable, char tel[]); bool searchname(Person* head, char name[]); bool searchtel(Person* head, char tel[]); int getnamekey(char name[]) { return (name[0]
+ name[1]) % 17; } int gettelkey(char tel[]) { return((tel[10] - '0') * 10 + (tel[11] - '0')) % 17; } int main() { Hash nametable, teltable; makeH(&nametable); makeH(&teltable); Person *person, *head,*p; head = NULL; int i; char name[8], tel[11]; do { cin >> i; switch (i) { case 0:person = new(Person); cin >> person->name >> person->address >> person->tel; person->next = NULL; insetH(&nametable, &teltable, *person); p = head; if (p) { while (p->next) { p = p->next; } p->next = person; } else { head = person; } break; case 1:cin >> name; if (!searchname(head, name)) cout << "NULL"; break; case 2:cin >> tel; if (!searchtel(head, tel)) cout << "NULL"; break; case 3:cin >> name; if (!searchnameH(&nametable, name)) cout << "NULL"; break; case 4:cin >> tel; if (!searchtelH(&teltable, tel)) cout << "NULL"; break; } } while (i != 5); return 0; delete []nametable.data; delete[]teltable.data; delete person; } bool makeH(Hash* table) { table->data = new Person[len]; if (table->data == NULL) return false; int i; Person* p; p = table->data; table->count = 0; table->sizeindex = len; for (i = 0; i < len; i++) { memset(p->name, '\0', sizeof(char)); memset(p->tel, '\0', sizeof(char)); p++; } return true; } bool insetH(Hash* nametable, Hash* teltable, Person person) { int namekey, nk2, telkey, tk2, c; Person* n, * t,*s; n = nametable->data; t = teltable->data; namekey = getnamekey(person.name); telkey = gettelkey(person.tel); c = 0; int l = strlen((n + namekey)->name); if (l == 0) { memcpy(n + namekey, &person, sizeof(person)); nametable->count++; s = n + namekey; } else { nk2 = namekey; do { c++; nk2 = (nk2 + c) % len; } while (strlen((n + namekey)->name) != 0 && c < len); if (c >= len) { cout << "error" << endl; return false; } else { memcpy(n + nk2, &person, sizeof(person)); nametable->count++; } } c = 0; l = 0; if (l == 0) { memcpy(t + telkey, &person, sizeof(person)); teltable->count++; } else { tk2 = telkey; do { c++; tk2 = (tk2 + c) % len; } while (strlen((t + telkey)->tel) != 0 && c < len); if (c >= len) { cout << "error" << endl; return false; } else { memcpy(t + tk2, &person, sizeof(person)); teltable->count++; } } return true; } bool searchnameH(Hash* nametable, char name[]) { int key, c; Person* p; key = getnamekey(name); p = nametable->data; if (strlen((p + key)->name) == 0) return false; else if (strcmp((p + key)->name , name)!=0) { c = 0; do { c++; key = key + c; } while (strcmp((p + key)->name, name) != 0 && c < len); if (c >= len) return false; else { cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel; return true; } } else { cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel; return true; } } bool searchtelH(Hash* teltable, char tel[]) { int key, c; Person* p; key = gettelkey(tel); p = teltable->data; if (strlen((p + key)->tel) == 0) return false; else if (strcmp((p + key)->tel , tel)!=0) { c = 0; do { c++; key = key + c; } while (strcmp((p + key)->tel, tel)!=0 && c < len); if (c >= len) return false; else { cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel; return true; } } else { cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel; return true; } } bool searchname(Person* head, char name[]) { Person* p; p = head; while (p != NULL && strcmp(p->name , name)!=0) { p = p->next; } if (p == NULL) { return false; } else { cout << p->name << ' ' << p->address << ' ' << p->tel; return true; } } bool searchtel(Person* head, char tel[]) { Person* p; p = head; while (p != NULL && strcmp(p->tel, tel) != 0) { p = p->next; } if (p == NULL) { return false; } else { cout << p->name << ' ' << p->address << ' ' << p->tel; return true; } }