任务:完成通讯录的一般性管理工作:
(1)添加信息;
(2)显示信息:可以按照手机或联系人的姓名拼音排序显示;
(3)查找:可用不同的关键字作为查找的依据,进行查找;
(4)编辑信息;
(5)删除信息;
(6)保存到文件;
要求:
(1)界面友好,可反复操作。
(2)每条记录至少包括姓名、手机、QQ、电子邮箱、城市、邮编等信息。
主要的子函数有:
int HandleCollision(HashTable table,int key) /冲突处理/
void CreateHashTable(HashTable &table,Record *record,int n) /*构建哈希表 */
void Print(Record record[],int k) /打印联系人信息/
void GoToFile(HashTable table) /将哈希表存入文件中/
void displayName(Record record[],int k) /按姓名排序显示/
void displayNum(Record record[],int k) /按电话排序显示/
void findname(Record record[],int k) /按姓名查找/
int SerchKey(HashTable table,char PhoneNumber[])/按照电话号码查找/
void Modify(Record record[],int k) /修改联系人信息/
int Add(Record record[],int k) /*添加联系人信息 */
int Delete(Record record[],int k) /删除联系人信息/
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define MAXSIZE 50
using namespace std;
int Czy=1;
//定义信息的结构体
typedef struct record
{
char Number[20];//电话
char Name[20];//姓名
char Address[20];//地址
char Classification[20];//分类(家人,朋友,同学,老师)
char QQ[20];//qq
char Email[20];//电子邮箱
char Postcode[10];//邮编
}Record;
//定义一个散列表
typedef struct Hash
{
Record *data;//存放多条记录的数组
int cnt;
int size;//数组大小
}*HashTable,HashElem;
Record record[50];
//哈希函数,将电话号码每一位求和
int GetHashKey(char ar[])
{
int len=strlen(ar); //计算电话号码的长度
int key=0;
for(int i=0;i<len;i++){
key+=ar[i]-'0'; //key=总和,数字字符减'0'就是数字
}
return key%MAXSIZE;//必须取模,否则下标越界
//返回得到的地址
}
//冲突处理,二次探测再散列
int HandleCollision(HashTable table,int key)
{
Czy=1; //从2,3,4,5,.......
while(1){
Czy++; //从2,3,4,5,.......
if(Czy%2==0) {
//偶数和偶数下一个数奇数除二的值相等
if(table->data[(key+(Czy/2)*(Czy/2))%MAXSIZE].Name[0]==0) //如果这个位置上没有数据
return (key+(Czy/2)*(Czy/2))%MAXSIZE; //返回这个位置上的地址
}
else if(Czy%2!=0) {
if((key-(Czy/2)*(Czy/2))<0) continue;//由于是减法,要注意负数不能取模
if(table->data[(key-(Czy/2)*(Czy/2))%MAXSIZE].Name[0]==0)
return (key-(Czy/2)*(Czy/2))%MAXSIZE;
}
}
}
//构建哈希表
void CreateHashTable(HashTable &table,Record *record,int n)
{
int key;
for(int i=0;i<n;i++){
key=GetHashKey(record[i].Number); //接受每个电话返回来的地址
if(table->data[key].Name[0]!=0) //当这个地址里的名字不为空时,也就是有冲突了
key=HandleCollision(table,key); //进行冲突处理 传冲突的地址
//如果不冲突,则进行赋值
strcpy(table->data[key].Number,record[i].Number);
strcpy(table->data[key].Name,record[i].Name);
strcpy(table->data[key].Address,record[i].Address);
strcpy(table->data[key].Classification,record[i].Classification);
strcpy(table->data[key].QQ,record[i].QQ);
strcpy<