源码
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>
#include <cstdlib>
using namespace std;
int n=0; //定义全局变量 存储电话联系人个数
struct phone_info //定义结构体 存储联系人信息
{
char name[20]; //姓名
char phone[20]; //电话
char type; //分类
char email[20]; //邮箱
struct phone_info *next; //指向下一个节点的指针
};
/*-----错误函数-----*/
//所需参数:无
//函数功能:显示错误信息
//返回参数:无
void error()
{
printf("代码错误\n\n");
system( "pause ");
}
/*-----输出函数-----*/
//所需参数:链表头指针
//函数功能:输出链表中的联系人信息
//返回参数:无
void output(struct phone_info *head)
{
struct phone_info *p1=head,*p2;
system("cls"); //清屏
if(head==NULL) //如果当前链表头指针为空
{
printf("当前没有任何联系人信息\n\n");
system( "pause ");
return; //返回
}
printf("电话联系薄(共%d条信息)\n\n",n);
for(;;)
{
p2=p1->next;
printf("姓名:%s\n",p1->name);
printf("电话:%s\n",p1->phone);
if(p1->type=='A'||p1->type=='a')
printf("类别:办公类\n");
else if(p1->type=='B'||p1->type=='b')
printf("类别:个人类\n");
else
printf("类别:商务类\n");
printf("邮箱:%s\n",p1->email);
printf("\n");
if(p1->next==NULL) //如果当前指针所指向的结构体中next指向空则链表输出完毕
break; //返回
p1=p2;
}
}
/*-----新增函数-----*/
//所需参数:链表头指针
//函数功能:新增联系人信息 并自动添加到链表末尾
//返回参数:链表头指针
struct phone_info *new_info(struct phone_info *head)//新增
{
struct phone_info *p1,*p2,*p;
char c;
int flag;
system("cls"); //清屏
for(;;)
{
if(n==15) //判断当前联系人数目是否超过系统限制
{
printf("存储空间已满,不能再录入新数据!\n\n");
system( "pause");
return head;
}
if(n==0) //判断当前联系人数目是否为0
{
head=p1=p2=(struct phone_info *)malloc(sizeof(struct phone_info)); //新建结构体 并将结构体指针赋予链表头指针
p1->next=NULL;
}
else
{
p1=head;
p2=(struct phone_info *)malloc(sizeof(struct phone_info)); //新建结构体
}
printf("请输入要新增的联系人姓名:\n(如果输入“0”则停止新增,并返回主菜单)\n");
scanf("%s",p2->name);
if(strcmp(p2->name,"0")==0) //判断输入的姓名是否为“0”
{
free(p2); //为“0”则释放新开辟的空间
return head; //返回
}
printf("\n请输入联系人的电话号码:\n");
scanf("%s",p2->phone);
for(flag=1,p=head;n!=0&&p!=NULL;) //判断是否输入了相同的联系人电话
{
if(strcmp(p2->phone,p->phone)==0)
{
printf("\n录入了相同的联系人电话\n\n");
system( "pause ");
flag=0; //标志位赋“0”
free(p2);
system("cls");
break; //退出循环
}
p=p->next;
}
if(flag==0) //判断标志位是否为“0”
continue; //如果为“0”则进入下一次循环
printf("\n请输入联系人的类别:\n(\"A\"为办公类 \"B\"为个人类 \"C\"为商务类)\n");
scanf("%c",&c); //保存上一次输入的回车键
scanf("%c",&p2->type);
printf("\n请输入联系人的电子邮箱:\n");
scanf("%s",p2->email);
while(p1->next!=NULL)
p1=p1->next; //找到链表的尾部
p1->next=p2; //将链表的尾部指向新添加的联系人
p2->next=NULL; //新的链表尾部赋结束标记
system("cls");
printf("新增成功\n\n");
n++; //保存的联系人数目加1
}
return head;
}
/*-----拨号函数-----*/
//所需参数:链表头指针
//函数功能:在链表中查找指定的联系人 并模拟拨号效果
//返回参数:无
void diag(struct phone_info *head)
{
char name[20];
struct phone_info *p1;
system("cls");
for(;;)
{
if(n==0) //判断当前联系人数目是否为0
{
printf("当前没有任何联系人信息\n\n");
system("pause");
return;
}
system("cls");
output(head); //调用输出函数 显示当前所有联系人的信息
printf("请输入要拨号的联系人姓名:\n(如果输入“0”则停止拨号,并返回主菜单)\n");
scanf("%s",name);
if(strcmp(name,"0")==0) //判断输入的姓名是否为0
return; //返回
else
{
p1=head;
for(;;)
{
if(strcmp(name,p1->name)==0) //找到指定联系人所在节点
{
printf("\n拨号成功\n\n");
system("pause");
break;
}
p1=p1->next; //找到下一节点
if(p1==NULL) //指针为空
{
printf("\n姓名为%s的联系人不存在!\n\n",name);
system("pause");
break;
}
}
}
}
}
/*-----释放函数-----*/
//所需参数:链表头指针
//函数功能:释放链表存储空间的内容
//返回参数:无
void freelist(struct phone_info *head)
{
struct phone_info *p1=head,*p2;
for(;;)
{
if(p1->next==NULL)
{
free(p1);
break;
}
else
{
p2=p1->next;
free(p1);
p1=p2;
}
}
}
/*-----查看函数-----*/
//所需参数:链表头指针
//函数功能:显示指定类别的联系人信息
//返回参数:无
void look(struct phone_info *head)
{
struct phone_info *p;
int c;
int flag;
char type;
system("cls");
if(n==0) //判断当前联系人数目是否为0
{
printf("当前没有任何联系人信息\n\n");
system("pause");
return; //返回
}
for(;;)
{
system("cls");
printf("1.查看办公类联系人\n");
printf("2.查看个人类联系人\n");
printf("3.查看商务类联系人\n");
printf("0.返回\n");
printf("\n请输入操作步骤的代码:");
scanf("%d",&c);
switch(c)
{
case 1:type='a';break;
case 2:type='b';break;
case 3:type='c';break;
case 0:return;
default:error();
}
flag=0; //标志位赋予0
p=head;
while(p!=NULL)
{
if(p->type==type||p->type==type-32)
{
if(flag==0)
{
system("cls");
if(type=='a')
printf("--办公类联系人--\n\n");
else if(type=='b')
printf("--个人类联系人--\n\n");
else
printf("--商务类联系人--\n\n");
}
flag=1;
printf("姓名:%s\n",p->name);
printf("电话:%s\n",p->phone);
printf("邮箱:%s\n",p->email);
printf("\n");
}
p=p->next; //找到下一节点
}
if(flag==0)
if(type=='a')
printf("\n当前没有办公类联系人信息\n\n");
else if(type=='b')
printf("\n当前没有个人类联系人信息\n\n");
else
printf("\n当前没有商务类联系人信息\n\n");
system("pause");
}
}
/*-----主函数-----*/
int main()
{ struct phone_info *head=NULL;
int n;
for(;;)
{
system("cls");
printf("---通信录管理系统---\n\n");
printf("1.查看联系人\n");
printf("2.新增联系人\n");
printf("3.拨号联系人\n");
printf("4.修改联系人\n");
printf("5.删除联系人\n");
printf("0.退出\n");
printf("\n请输入操作步骤的代码:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1: look(head);break;
case 2: head=new_info(head);break;
case 3: diag(head);break;
case 4: revise(head);break;
case 5: head=del(head);break;
case 0: if(head!=NULL)
freelist(head);
break;
default :error();break;
}
if(n==0)
break;
}
printf("程序结束\n\n");
}