#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
#include <string.h>
#define m 29 /*作为对应质数*/
#define Max 30 /*记录的最大值*/
#define HashMaxSize 30 /*哈希表最大值*/
static char contactname[20]="defaultContact.txt"; /*静态变量 共享访问*/
unsigned int key=0;
unsigned int key2=0;
FILE *fp;
typedef struct PhoneNode /*结点定义*/
{
char name[15];
char number[15];
char add[30];
}Pnode,*Ptype;
typedef struct /*hashAddress数组存储各记录电话信息的散列地址值*/
{
char HashName[15];
}HashTable;
typedef struct
{
char HashNum[15];
}HashTable2;
HashTable hashAddsName[HashMaxSize];
HashTable2 hashAddsNum[HashMaxSize];
void openfile(int i) /*i=1写入打开文件 i=2读入打开文件*/
{
if(i==1)
fp=fopen("defaultContact.txt","a");
if(i==2)
fp=fopen("defaultContact.txt","r");
}
void menu() /*主菜单*/
{
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * * * * * * * 欢迎使用:通讯录 * * * * * * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * [1] 新建通讯录: *\n");
printf(" * [2] 添加记录: *\n");
printf(" * [3] 修改记录: *\n");
printf(" * [4] 查询记录: *\n");
printf(" * [5] 删除记录: *\n");
printf(" * [6] 显示记录: *\n");
printf(" * [7] 退出系统: *\n");
printf(" * *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" 按提示操作:\n");
printf(" 请输入数字: ");
}
void InitHashTable(HashTable HT[],HashTable2 HT2[]) /*初始化散列表*/
{
for(int i=0;i<HashMaxSize;i++)
strcpy(HT[i].HashName,"\0");
strcpy(HT2[i].HashNum,"\0");
}
void hash1(char name[15]) /*哈希函数1 除留余数法 用于散列姓名*/
{
int i = 1;
key=(int)name[0];
while(name[i]!=NULL)
{
key+=(int)name[i];
i++;
}
key=key%m;
}
void hash2(char num[15]) /*哈希函数2 除留余数法 用于散列电话号码*/
{
int i = 1;
key2=(int)num[0];
while(num[i]!=NULL)
{
key2+=(int)num[i];
i++;
}
key2=key2%m;
}
void sanlie(Pnode temp[])
{
int i=0,j=0;
InitHashTable(hashAddsName,hashAddsNum);
while(strcmp(temp[j].name,"\0")!=0) j++;
while(i<j)
{
hash1(temp[i].name);
while(strlen(hashAddsName[key].HashName))
key=(key+1)%m;
strcpy(hashAddsName[key].HashName,temp[i].name);
hash2(temp[i].number);
while(strlen(hashAddsNum[key2].HashNum))
key2=(key2+1)%m;
strcpy(hashAddsNum[key2].HashNum,temp[i].number);
i++;
}
}
void inputNode() /*输入信息函数*/
{
int i=1;
char yn;
Pnode temp;
openfile(1);
while(1)
{
printf(" 请输入第[%d]个姓名:",i);
scanf("%s",temp.name);
printf(" 请输入第[%d]个电话号码:",i);
scanf("%s",temp.number);
printf(" 请输入第[%d]个地址:",i);
scanf("%s",temp.add);
fprintf(fp,"%15s %15s %30s\n",temp.name,temp.number,temp.add);
printf(" 是否继续添加( Y继续 )?\t");
scanf("%s",&yn);
if(yn!='y'&&yn!='Y') break;
i++;
};
fclose(fp);
}
void display() /*显示函数*/
{
int i=0,j=1;
Pnode a;
openfile(2);
printf("\n");
printf(" - - - - - - - - - - - - - - - - - - - - - - -\n");
printf(" 序号 姓名 电话号码 地址\n\n");
while(!feof(fp))
{
fscanf(fp,"%s%s%s",&a.name,&a.number,&a.add);
printf(" %2d\t%-15s%-15s %-30s\n",j++,a.name,a.number,a.add);
}
printf("\n\n");
fclose(fp);
}
int search1(char name[15]) /*用方法一查找 关键字为姓名*/
{
hash1(name);
while(strlen(hashAddsName[key].HashName)!=0)
{
if(strcmp(hashAddsName[key].HashName,name)==0)
return 1;
else
key=(key+1)%m; /*线性探测法处理冲突*/
}
return -1;
}
int search2(char number[15]) /*用方法二查找 关键字为电话号码*/
{
hash2(number);
while(strlen(hashAddsNum[key2].HashNum)!=0)
{
if(strcmp(hashAddsNum[key2].HashNum,number)==0)
return 1;
else
key2=(key2+1)%m; /*线性探测法处理冲突*/
}
return -1;
}
Ptype change()
{
int i=0,j=0,k=0;
char temp[100],t1[15],t2[15],t3[30];
Pnode tempobj[Max];
while(i<Max)
{
strcpy(tempobj[i].name,"\0");
i++;
}
openfile(2);
while(!feof(fp))
{
fgets(temp,100,fp);
for(j=0,i=0;j<15;j++)
{
if(temp[j]!=' ')
{ t1[i]=temp[j];i++;}
} t1[i]='\0';
for(j=16,i=0;j<31;j++)
{
if(temp[j]!=' ')
{t2[i]=temp[j];i++;}
} t2[i]='\0';
for(j=31,i=0;j<63;j++)
{
if(temp[j]!=' ')
{t3[i]=temp[j]; i++; }
} t3[i]='\0';
strcpy(tempobj[k].name,t1);
strcpy(tempobj[k].number,t2);
strcpy(tempobj[k].add,t3);
k++;
}
fclose(fp);
return tempobj;
}
void deal(int kk,Pnode obj[]) /*处理函数*/
{
int i=0;
switch(kk)
{
case 1:
{
Pnode first[Max];
char txt[5]=".txt";
printf(" 新建通讯录-->\n");
printf(" 正在创建通讯录......\n");
remove("defaultContact.txt");
openfile(1); /*创建通讯的txt形式文件*/
fclose(fp);
printf(" 新建成功。\n\n");
break;
}
case 2:
{
i=0;
printf(" 添加记录-->\n");
printf(" 即将在 %s 中添加记录。\n",contactname);
inputNode();
printf(" 添加成功。\n\n");
break;
}
case 3:
{
int f,i=0,j=0,k=0;
Pnode temp;
char tpname[15],tpnumber[15],tpadd[15],newName[15],newNumber[15],newAdd[15];
printf(" 修改记录-->\n");
obj=change();
printf(" 请选择修改方式: 1.修改姓名 2.修改电话号码 3.修改地址\t");
scanf("%d",&f);
if(f==1)
{
printf(" 请输入要修改的姓名:\t");
scanf("%s",tpname);
while(strcmp(obj[i].name,tpname)!=0) ++i;
printf(" 请输入新的姓名:\t");
scanf("%s",newName);
strcpy(obj[i].name,newName);
}
if(f==2)
{
printf(" 请输入要修改的电话号码:\t");
scanf("%s",tpnumber);
while(strcmp(obj[i].number,tpnumber)!=0) ++i;
printf(" 请输入新的电话号码:\t");
scanf("%s",newNumber);
strcpy(obj[i].number,newNumber);
}
if(f==3)
{
printf(" 请输入要修改的地址:\t");
scanf("%s",tpadd);
while(strcmp(obj[i].add,tpadd)!=0) ++i;
printf(" 请输入新的地址:\t");
scanf("%s",newAdd);
strcpy(obj[i].add,newAdd);
}
fp=fopen("defaultContact.txt","w");
i=0;
int len=0;
do
{
strcpy(temp.name,obj[i].name);
strcpy(temp.number,obj[i].number);
strcpy(temp.add,obj[i].add);
fprintf(fp,"%15s %15s %30s",temp.name,temp.number,temp.add);
i++;len=strlen(obj[i].name);
}while(len);
fclose(fp);
printf(" 修改成功。\n\n");
break;
}
case 4:
{
int choose,t;
char _name[15],_number[15],yn;
openfile(2);
obj=change();
sanlie(obj);
printf(" 查找记录-->\n");
printf(" 请选择用哪种方式查找:\n");
do
{
printf(" 1.姓名查找 2.电话号码查找 : \t");
scanf("%d",&choose);
if(choose==1)
{
printf(" 请输入要查询的姓名: \t");
scanf("%s",_name);