1
#include<iostream>
#include<stdio.h>
#include<string>
#include <fstream>
#include <time.h>
#define MAX 1000
using namespace std;
typedef struct HashNode
{
char key[12]; //存储关键字信息
int position; //存储关键字对应的联系人信息在顺序表中的下标号
}HashNode;
typedef struct HashTable
{
HashNode mTbl[1000]; // 哈希表
int mSize; // 表尺寸
int mStep; // 冲突后的步进值
int mCmpCount;
};
int Hash() {
HashNode DIS;
string a;
cin >> a;
//DIS.key = a;
}
//获取当前系统时间
string getTime() {
struct tm t;
time_t now;
time(&now);
localtime_s(&t, &now);
char szResult[20] = "\0";
sprintf_s(szResult, 20, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
return szResult;
}
/*********联系人*********/
struct Person
{
//姓名
string m_name;
//性别
int m_sex;
//年龄
int m_age;
//电话
string m_phone;
//备注
string m_others;
//累加
int m_num;
};
//通讯录************顺序表
struct Addr
{
struct Person P_Array[MAX];//顺序表
struct Person P_Hash[MAX];//哈希表非顺序表
int m_size;
};
//文件设置(读入)未设置格式化
void fileRead(Addr* abs) {
int i = 0;
char str_name[40];
char str_phone[40];
int str_sex = 1;
int str_age = 1;
char str_others[40];
FILE *fp;
fp = fopen("123.txt", "r+");
if (!fp)
{
cout << "文件不存在" << endl;
}
fscanf_s(fp,"%s,%d,%d,%s,%s",str_name,sizeof(str_name), str_sex,sizeof(str_sex), str_age,sizeof(str_age), str_phone,sizeof(str_phone), str_others,sizeof(str_others));
abs->P_Array[i].m_name = str_name;
abs->P_Array[i].m_sex = str_sex;
abs->P_Array[i].m_age = str_age;
abs->P_Array[i].m_phone = str_phone;
abs->P_Array[i].m_others = str_others;
abs->m_size++;
}
//文件设置(写入)
void fileWrite(Addr* abs) {
ofstream fileout("123.txt");
if (abs->m_size == 0)cout << "记录为空" << endl;
else
{
for (int i = 0; i < abs->m_size; i++) {
fileout <<" "<< i+1 << "\t";
fileout << "姓名:" << abs->P_Array[i].m_name << "\t";
fileout << "性别:" << (abs->P_Array[i].m_sex == 1 ? "男" : "女") << "\t";
fileout << "年龄:" << abs->P_Array[i].m_age << "\t";
fileout << "电话:" << abs->P_Array[i].m_phone << "\t";
fileout << "其他:" << abs->P_Array[i].m_others << endl;
fileout << endl;
}
}
fileout << "最后更新时间:"<<getTime() << endl;
cout << "数据写入成功!更新时间为:" << getTime() << endl;
system("pause");
};
//添加联系人函数
void addPerson(Addr* abs) {
//判断是否满
if (abs->m_size == MAX) {
cout << "通讯录已满,请及时删除!" << endl;
}
else {
//计数器初始化
abs->P_Array[abs->m_size].m_num = 0;
//姓名
string name;
cout << "请输入姓名" << endl;
cin >> name;
abs->P_Array[abs->m_size].m_name = name;
//性别
cout << "输入性别" << endl;
cout << "1 ------男" << endl;
cout << "2 ------女" << endl;
int sex = 0;
while (true) {
cin >> sex;
if (sex == 1 || sex == 2) {
abs->P_Array[abs->m_size].m_sex = sex;
break;
}
cout << "输入数据异常请重新输入" << endl;
}
//年龄
cout << "请输入年龄" << endl;
int age = 0;
while (true) {
cin >> age;
if (age>=0&&age<=150) {
abs->P_Array[abs->m_size].m_age = age;
break;
}
cout << "输入数据异常请重新输入" << endl;
}
//电话
cout << "请输入电话" << endl;
string phone;
cin >> phone;
abs->P_Array[abs->m_size].m_phone = phone;
//其他
cout << "请输入其他备注" << endl;
string others;
cin >> others;
abs->P_Array[abs->m_size].m_others = others;
//人数累加
abs->m_size++;
cout<<"成功"<<endl;
system("pause");
system("cls");
}
};
//显示所有联系人
void showPerson(Addr* abs) {
//判断是否为空
if (abs->m_size == 0)cout << "记录为空" << endl;
else
{
for (int i = 0; i < abs->m_size; i++) {
cout << "姓名:" << abs->P_Array[i].m_name << "\t";
cout << "性别:" << (abs->P_Array[i].m_sex == 1 ? "男" :"女") << "\t";
cout << "年龄:" << abs->P_Array[i].m_age << "\t";
cout << "电话:" << abs->P_Array[i].m_phone << "\t";
cout << "其他:" << abs->P_Array[i].m_others<< endl;
cout << endl;
}
}
system("pause");
system("cls");
};
//删除联系人
//检测对象是否存在//待修改为二分
int isExist(Addr* abs, string name) {
int a = 0;
for (int i = 0; i < abs->m_size; i++,a++) {
if (abs->P_Array[i].m_name == name) {
return i;//若找到返回下标
}
}
return -1;//未找到
}
void deletePreson(Addr* abs)
{
cout << "请输入要删除的人姓名"<<endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret != -1) {
for (int i = ret; i < abs->m_size; i++) {
//数据迁移
abs->P_Array[i] = abs->P_Array[i + 1];
}
abs->m_size--;//人数减一
cout << "删除成功"<<endl;
}
else {
cout << "查无此人";
}
system("pause");
system("cls");
}
//选择排序int* arr,int length
void sort(Addr* abs)//传入数组首地址和数组长度
{
int index;//定义最小值的下标
int temp;
for (int i = 0; i < abs->m_size - 1; i++) //一共需要循环 n-1 轮
{
index = i;
for (int j = i + 1; j < abs->m_size; j++) //从第 i+1 个元素开始到最后一个元素结束
{
if (abs->P_Array[j].m_num < abs->P_Array[index].m_num) //找到最小元素并记录下标
index = j;
}
if (abs->P_Array[index].m_num < abs->P_Array[i].m_num) //若找到比较小的元素就交换
{
temp = abs->P_Array[i].m_num;
abs->P_Array[i].m_num = abs->P_Array[index].m_num;
abs->P_Array[index].m_num = temp;
}
}
}
//查找
void findPerson(Addr* abs) {
cout << "请输入您要查找的对象" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret!= -1) {
cout << "姓名:" << abs->P_Array[ret].m_name << "\t";
cout << "性别:" << (abs->P_Array[ret].m_sex == 1 ? "男" : "女") << "\t";
cout << "年龄:" << abs->P_Array[ret].m_age << "\t";
cout << "电话:" << abs->P_Array[ret].m_phone << "\t";
cout << "其他:" << abs->P_Array[ret].m_others << "\t";
cout << endl;
abs->P_Array[abs->m_size].m_num += 1;
cout << "以查找次数:" << abs->P_Array[abs->m_size].m_num << endl;
}
else
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
//修改
void modifyPerson(Addr* abs) {
cout << "请输入要修改的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret != -1) {
string name;
cout << "请输入姓名" << endl;
cin >> name;
abs->P_Array[ret].m_name = name;
int sex = 0;
cout << "请输入性别" << endl;
cout << "1 ------男" << endl;
cout << "2 ------女" << endl;
while (true) {
cin >> sex;
if (sex == 1 || sex == 2) {
abs->P_Array[abs->m_size].m_sex = sex;
break;
}
cout << "输入数据异常请重新输入" << endl;
}
int age;
cout << "请输入年龄" << endl;
cin >> age;
abs->P_Array[ret].m_age = age;
string phone;
cout << "请输入电话" << endl;
cin >> phone;
abs->P_Array[ret].m_phone = phone;
string others;
cout << "请输入其他" << endl;
cin >> others;
abs->P_Array[ret].m_others = others;
}
else {
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
//清空
void cleanPerson(Addr* abs) {
abs->m_size = 0;//逻辑清空
cout << "已清空" << endl;
system("pause");
system("cls");
}
int zhuanhuan(Addr* abs)
{
char dst[20];
int lei = 0;
int num;
int var;
//string变char
for (int s = 0; s < abs->m_size; s++) {
for (int i = 0; i <= abs->P_Array[i].m_name.length(); i++)
{
dst[i] = abs->P_Array[i].m_name[i];
lei++;
}
//char变int
for (int a = 0; a <= lei; a++) {
num += dst[a];
}
num = num % 13;
while (abs->P_Hash[num].m_name != "")num++;
abs->P_Hash[num] = abs->P_Array[s];
var = num;
num = 0;
}
cout << "哈希构建完成!" <<endl;
return var;
};
//哈希反向查找
void Findzhuanhuan(Addr*abs) {
string Aname;
cout << "输入姓名" << endl;
cin >> Aname;
string name = Aname;
int A = 1;
char dst[20];
int lei = 0;
int num;
for (int i = 0; i <= name.length(); i++)
{
dst[i] = name[i];
lei++;
}
for (int a = 0; a <= lei; a++) {
num += dst[a];
}
num = num % 13;
while (A){
if(abs->P_Hash[num].m_name==name)
{
cout << "姓名:" << abs->P_Hash[num].m_name << "\t";
cout << "性别:" << (abs->P_Hash[num].m_sex == 1 ? "男" : "女") << "\t";
cout << "年龄:" << abs->P_Hash[num].m_age << "\t";
cout << "电话:" << abs->P_Hash[num].m_phone << "\t";
cout << "其他:" << abs->P_Hash[num].m_others <<endl;
cout << "哈希查找完成" << endl;
A = 0;
}
else
num++;}
}
//封装菜单
void showMenu() {
cout << "|****************************************|" << endl;
cout << "|*********** 1.新建联系人 ***********|" << endl;
cout << "|*********** 2.显示联系人 ***********|" << endl;
cout << "|*********** 3.删除联系人 ***********|" << endl;
cout << "|*********** 4.查找联系人 ***********|" << endl;
cout << "|*********** 5.修改联系人 ***********|" << endl;
cout << "|*********** 6.清空联系人 ***********|" << endl;
cout << "|*********** 7.哈希表查找 ***********|" << endl;
cout << "|*********** 0.退出 ***********|" << endl;
cout << "|****************************************|" << endl;
};
int main()
{
Addr abs;//通讯录结构变量
abs.m_size = 0;//人
fileRead(&abs);
int select = 0;
while (true) {
showMenu();
cin>>select;
switch (select)
{
case 1:addPerson(&abs); zhuanhuan(&abs);//传地址,修改实参
break;
case 2:showPerson(&abs);
break;
case 3:deletePreson(&abs);
break;
case 4:findPerson(&abs);// sort(&abs);
break;
case 5:modifyPerson(&abs);
break;
case 6:deletePreson(&abs);
break;
case 7:Findzhuanhuan(&abs);
break;
case 0:
cout << "已退出!" << endl;
system("pause");
system("cls");
break;
default:
break;
}
}
system("pause");//清屏
return 0;