设手机通讯录包括姓名、移动电话、固定电话、电子邮箱等信息。编写程序设计一个存储手机通讯录的结构体类型,并定义结构体变量,输入某含10个联系人的通讯录,并完成以下任务。
(1)信息查询功能。
设计函数,根据姓名查询某联系人信息。
(2)信息插入功能。
设计函数,插入新联系人信息。
(3)信息删除功能。
设计函数,删除某联系人信息。
(4)信息修改功能。
设计函数,修改某联系人信息。
上述函数逐个增加,并编写主函数进行测试。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<windows.h>
//定义联系人结构体
typedef struct contacts contacts;
typedef contacts *link;
struct contacts
{
char name[10];
char telephone_number[15];
char email[15];
link next;
};
void seek(link head);
void add_member(link head);
void delete_contact(link head);
void print(link head);
void revise(link head);
//查找联系人
void seek(link head)
{
link p;
char name[10];
printf("输入要查找的联系人名字:");
scanf("%s",name);
for(p=head->next; p!=NULL; p=p->next)
{
//用strcmp()来比较两个字符串是否相同,相同时返回0
if(!strcmp(p->name, name))
{
printf("该联系人信息如下:\n");
printf("名字:%s\n", p->name);
printf("电话:%s\n", p->telephone_number);
printf("邮箱:%s\n\n", p->email);
break;
}
}
if(p==NULL)
printf("没有该联系人!\n");
}
//添加联系人
void add_member(link head)
{
link p, q;
q=malloc(sizeof(contacts));
printf("联系人名字:");
scanf("%s", q->name);
printf("联系人电话:");
scanf("%s", q->telephone_number);
printf("联系人邮箱:");
scanf("%s", q->email);
for(p=head; p->next!=NULL; p=p->next); //将节点p变为尾节点
p->next=q;
q->next=NULL;
}
//删除联系人
void delete_contact(link head)
{
link p, record;
char name[10];
printf("输入要删除的联系人名字:");
scanf("%s", name);
for(p=head; p!=NULL; p=p->next)
{
record=p->next; //用record来记录要被删除的节点
if(!strcmp((p->next)->name, name)) //如果两个字符串相同,strcmp返回值为0
{
break;
}
}
if(p==NULL)
printf("没有该联系人");
else
{
p->next=record->next; //删除目标节点
free(record); //释放空间
printf("已删除该联系人\n");
}
}
//打印联系人
void print(link head)
{
link p;
//p=head->next; 链表的第一个节点(头节点)不保存联系人信息
//注意:判断条件是p!=NULL,而不是p->next!=NULL
for(p=head->next; p!=NULL; p=p->next)
{
printf("名字:%s\n电话:%s\n邮箱:%s\n", p->name,
p->telephone_number, p->email);
printf("---------------------------------------\n");
}
}
//修改联系人信息
void revise(link head)
{
link p;
char name[10];
printf("输入要修改的联系人姓名");
scanf("%s",name);
//从键盘输入modify的值来判断是否需要修改信息
char modify1='Y';
char modify2='Y';
char modify3='Y';
for(p=head->next; p!=NULL; p=p->next)
{
if(!strcmp(p->name, name))
{
//修改联系人名字
printf("是否修改联系人名字:(Y/N)");
while(getchar()!='\n'); //用getchar()来吸收多余的字符
scanf("%c",&modify1);
if(modify1=='Y')
{
scanf("%s",p->name);
}
//修改联系人电话
printf("是否修改联系人电话:(Y/N)");
while(getchar()!='\n');
scanf("%c",&modify2);
if(modify2=='Y')
{
scanf("%s",p->telephone_number);
}
//修改联系人邮箱
printf("是否修改联系人邮箱:(Y/N)");
while(getchar()!='\n');
scanf("%c",&modify3);
if(modify3=='Y')
{
scanf("%s",p->email);
}
break;
}
}
if(p==NULL)
printf("没有该联系人!\n");
}
int main()
{
link head;
int j;
head=malloc(sizeof(contacts));
head->next=NULL;
//添加联系人
for(j=0; j<10; j++)
add_member(head);
//删除联系人
printf("\n删除联系人————\n");
delete_contact(head);
//修改联系人信息
printf("\n修改联系人信息————\n");
revise(head);
//查找联系人
printf("\n查找联系人————\n");
seek(head);
//打印联系人信息
printf("\n打印联系人信息————\n");
print(head);
return 0;
}