数据结构-通讯录管理系统课程设计

任务:完成通讯录的一般性管理工作:
(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
  • 19
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值