#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
struct people
{
char name[20];
char tel[20];
int classficition;//类型 1.办公类 2.个人类 3.商务类
char E_mail[30];
people *pNext;
};
int N[4][7]=
{
131,147,165,175,196,220,247, //低度音调
262,286,330,349,440,440,494, //中度音调
523,158,659,698,784,880,998, //高度音调
1047,1175,1319,1397,1568,1760,1976 //高八度音调
};
//********************函数声明******************************
bool findname(people *p,people *pHead);
bool findtel(people *p,people *pHead);
void input (people **pHead,people**pEnd);
void list(people *pHead,people *pEnd) ;
void in_date(people **pHead,people **pEnd);
void show (people *pHead,people *pEnd);
void modify (people *pHead);
people *del (people *pHead);
void call (people *pHead);
//**********************************************************
//***************************判断名字是否相同函数******************
bool findname(people *p,people *pHead)//查找是否有相同的名字
{
people *p1=pHead;
while(p1!=0)
{
if(p->name==p1->name)//如果名字相同
return true;
p1=p1->pNext;
}
return false;
}
//*******************************************************************
//**************************查找是否有相同的电话********************
bool findtel(people *p,people *pHead)
{
people *p1=pHead;
while(p1!=0)//P1指向空时推出
{
if(strcmp(p->tel,p1->tel)==0)//如果号码相同
return true;
p1=p1->pNext;
}
return false;
}
//*******************************************************************
//*******************************新用户读入************************************
void input (people **pHead,people**pEnd)
{
int i;
do
{
people *p=(people*)malloc(sizeof(people));
printf("请输入名字,号码,类型(1.办公类 2.个人类 3.商务类),邮箱地址\n");
scanf("%s%s%d%s",p->name,p->tel,&p->classficition,p->E_mail);
p->pNext=0;
if(findtel(p,*pHead)||findname(p,*pHead))//号码相同或名字相同
{
printf("输入错误,本次输入不会储存\n");
break;
}
if(*pHead==0)//没头的话就建立头
{
*pHead=p;
*pEnd=p;
}
else//有 头的话就从尾部添加新节点
{
(*pEnd)->pNext=p;
*pEnd=p;
}
printf("1.继续录入\n2.结束录入\n");
scanf("%d",&i);
if(i==2)break;
}while(i!=2);
system("cls");
}
//**********************************************************************************
//***************************文件数据读入**********************************
void in_date(people **pHead,people **pEnd)
{
FILE *fp;
fp = fopen("date.bin","rb");
if(fp==NULL)
{
fp=fopen("date.bin","w");
printf("没用找到date.bin文件,将为你新建一个\n");
//exit(0);
}
int flag;// = fread(p,sizeof(Student),1,fp);
while(1)
{
flag=0;
people *p = (people*)malloc(sizeof(people));
flag = fread(p,sizeof(people),1,fp);
if(flag!=1)
break;
//2.3 将新节点插入链表中
if(*pHead==0)//如果链表为空
{
*pHead = p; //头尾都指向当前的新节点
*pEnd = p;
}
else//如果链表不为空(已有至少一个节点)
{
(*pEnd)->pNext = p;//原来的尾节点的后续节点指向p
*pEnd = p; //更新尾节点(即新节点为尾节点)
}
}
fclose(fp);
}
//***************************************************************************
//*******************************显示函数*************************************
void show (people *pHead,people *pEnd)
{
system("cls");
people *p=pHead;
if(p==0)//如果没有通讯录成员
{
printf("这里没有任何信息,请重新选择\n");
printf("\n\n");
return;
}
printf("请输入类别\n1.办公类\n2.个人类\n3.商务类\n");
int g;
scanf("%d",&g);
system("cls");
printf("名字 号码 邮箱地址 \n");
if(g==1)//如果为办公类
{
while (1)
{
if(p->classficition==1)
{
printf("%-20s%-20s%-30s",p->name,p->tel,p->E_mail);
printf("\n");
}
if(p->pNext==0)break;
p=p->pNext;
}
}
if(g==2)//如果为商务类
{
while (1)
{
if(p->classficition==2)
{
printf("%-20s%-20s%-30s",p->name,p->tel,p->E_mail);
printf("\n");
}
if(p->pNext==0)break;
p=p->pNext;
}
}
if(g==3)//如果为个人类
{
while (1)
{
if(p->classficition==3)
{
printf("%-20s%-20s%-30s",p->name,p->tel,p->E_mail);
printf("\n");
}
if(p->pNext==0)break;
p=p->pNext;
}
}
}
//****************************************************************************
//*******************释放内存函数******************************//
void Free(people *pHead)
{
FILE *fp;
fp = fopen("date.bin","wb");
people *p=pHead;
people *p1=p;
while(p!=0)
{
p1=p->pNext;
fwrite(p,sizeof(people),1,fp);//写入磁盘
free(p);//释放节点
p=p1;
}
}
//******************************************************************//
//******************查找修改**********************************//
void modify (people *pHead)
{
system("cls");
people *p1=pHead;
if(p1==0)
{
printf("通讯录没有任何成员\n");
return;
}
char str[20];
printf("请输入查找人姓名:\n");
scanf("%s",str);
while(p1!=0)//通过名字查找
{
if(strcmp(str,p1->name)==0)//名字相同
{
printf("请选择需要修改的信息:\n1.姓名\n2.号码\n3.E_mail\n4.类型\n");
int i;
scanf("%d",&i);
switch(i)
{
case 1:{
printf("姓名修改为:");
scanf("%s",p1->name);break;
}
case 2:{
printf("号码修改为:");
scanf("%s",p1->tel);break;
}
case 3:{
printf("E_mail修改为:");
scanf("%s",p1->E_mail);break;
}
case 4:{
printf("类型(1.办公类 2.个人类 3.商务类)修改为:");
scanf("%s",p1->classficition);break;
}
default :printf("未做任何修改\n");
}
}
p1=p1->pNext;
}
}
//*************************************************************//
//******************************删除********************************//
people *del (people *pHead)
{
system("cls");//清屏
people *p1=pHead,*p2=p1;//p2为p1的前一个节点
char name[30];
if(p1==0)//如果通讯录没有成员
{
printf("通讯录没有任何成员\n");
return pHead;
}
printf("请输入需要删除的人的姓名:\n");
scanf("%s",name);
while(p1!=0)
{
if((p1==pHead)&&strcmp(name,p1->name)==0) //如果目标是第一个
{
people *p=p1->pNext;//定义一个新指针存放首地址的下一个节点地址
free(pHead);//释放首地址
pHead=p;//更新首地址
return pHead;
}
else if(strcmp(name,p1->name)==0) //如果不是第一个人
{
(p2->pNext)=(p1->pNext);
free(p1);return pHead;
}
p2=p1;
p1=p2->pNext;
}
printf("没有找到该人\n");return pHead;
}
//*******************************************************************//
//*************************拨号函数**********************************//
void call (people *pHead)
{
system("cls");//清屏
char name[20];
people *p=pHead;
printf("请输入姓名:");
scanf("%s",name);
while(p!=0)
{
if((strcmp(p->name,name))==0)//如果名字相同
break;
p=p->pNext;
if(p==0)
{
printf("没有找到该人\n");
}
}
if(p!=0)
{
for(int j=0;p->tel[j]!='\0';j++)
{
printf("%c",p->tel[j]);
if(p->tel[j]=='1')Beep(N[1][0],200);//发音
if(p->tel[j]=='2')Beep(N[1][1],200);
if(p->tel[j]=='3')Beep(N[1][2],200);
if(p->tel[j]=='4')Beep(N[1][3],200);
if(p->tel[j]=='5')Beep(N[1][4],200);
if(p->tel[j]=='6')Beep(N[1][5],200);
if(p->tel[j]=='7')Beep(N[1][6],200);
if(p->tel[j]=='8')Beep(N[1][7],200);
if(p->tel[j]=='9')Beep(N[2][0],200);
if(p->tel[j]=='0')Beep(N[2][1],200);
}
printf("\n");
printf("拨号中----\n");
for(int i=0;i<4;i++)
{
Beep(N[1][0],1000);
Sleep(500);
}
printf("用户忙,请稍后再拨\n");
}
}
//*******************************************************************//