欢迎光临散文网 会员登陆 & 注册

1

2020-08-31 09:02 作者:带Developer  | 我要投稿

#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;


1的评论 (共 条)

分享到微博请遵守国家法律