运用本章学习的结构体数组和链表分别设计一个本班同学通讯录应用程序。
主要功能:
n创建同学录;
n插入新的同学记录;
n查询姓名为XX同学的记录,并在屏幕上显示;
n删除姓名为XX同学的记录;
n打印同学录(在屏幕上显示所有同学的信息)。
说明:
n每位同学的信息包含(班级序号,学号,姓名,性别,出生日期,电话号码,QQ号)。
n初始的同学录记录由结构体数组赋初值的形式输入(至少10条记录),插入的新的同学信息从键盘输入。
可以参考这篇文章,希望对你有帮助:用结构体数组实现一个简易通讯录_zoujiemax的博客-CSDN博客
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Student{
char name[20];
char tel[20];
char qq[20];
char address[20];
struct Student *next;
}INFO;
INFO *head;
void Initiate();//初始化
void Menu ();//主菜单
void Add ();//添加联系人
void List ();//显示通讯录
void Alter();//修改
void Find ();//查找联系人
void Find_Name ();//按姓名查找
void Find_Tel ();//按学号查找
void Delate ();//删除联系人
void Delate_Name ();
void Delate_Tel ();
/* void Delate_Name ();//按姓名删除
void Delate_Tel ();//按电话删除 */
//初始化
void Initiate ()
{
if((head=(INFO*)malloc(sizeof(INFO)))==NULL) exit(1);
head->next=NULL;
}
//主菜单
void Menu()
{
printf ("\n");
printf ("\n");
printf ("\n");
printf("**************欢迎使用通讯录系统**************");
printf("\n");
printf("\n");
printf("*********** 1.添加好友 ***********\n");
printf("*********** 2.查询好友 ***********\n");
printf("*********** 3.修改好友 ***********\n");
printf("*********** 4.删除好友 ***********\n");
printf("*********** 5.显示所有好友 ***********\n");
printf("*********** 0.退通讯录 ***********\n\n\n");
}
//添加通讯录好友
void Add()
{
INFO *p,*q;
if ((q=(INFO *)malloc(sizeof(INFO)))==NULL) exit(1);
printf("请输入要添加信息!\n");
printf("姓名:\n"); //添加信息
scanf("%s",&q->name);
printf("电话号码:\n");
scanf("%s",q->tel);
printf("QQ:\n");
scanf("%s",q->qq);
printf("地址:\n");
scanf("%s",q->address);
//保存聊天记录
FILE *file_in = fopen("同学录.txt", "w");
if (file_in == NULL)
{
perror("fopen TXT");
return ;
}
fprintf (file_in, "姓名:\t%s\t", q->name);
fprintf (file_in, "号码:\t%s\t", q->tel);
fprintf (file_in, "QQ:\t%s\t", q->qq);
fprintf (file_in, "地址:\t%s\t", q->address);
fclose (file_in);
for (p = head;p->next!=NULL;p=p->next);
p->next=q;
q->next=NULL;
printf("信息已添加完成!\n");
}
//查找
void Find ()
{
int i;
printf ("\n\n\n\n\n\n**************************************\n");
printf ("\t\t1按姓名查找\n");
printf ("\t\t2按电话号码查找\n");
printf ("**************************************\n");
printf ("请选择:(按其他数字键返回!)");
scanf ("%d",&i);
switch (i)
{
case 1:
{
Find_Name ();
break;
}
case 2:
{
Find_Tel ();
break;
}
}
}
void Find_Name ()
{
INFO *p;
char name[20];
if (head->next==NULL) // 如果是一个空链表;
{
printf("通讯录空!\n");
return;
}
printf("请输入要查找姓名:\n");
scanf("%s",&name);
for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点
{
if(strcmp(p->name,name)==0)
{
printf("姓名\t电话\tQQ\t地址\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
}
else if(p->next==NULL)
{
printf("没有该好友信息!\n");
}
}
}
void Find_Tel ()
{
INFO *p;
char tel[20];
if (head->next==NULL)// 如果是一个空链表;
{
printf("通讯录空!\n");
return;
}
printf("请输入要查找电话号码:\n");
scanf("%s",&tel);
for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点
{
if(strcmp(p->tel,tel)==0)
{
printf("姓名\t电话\tQQ\t地址\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
}
else if(p->next==NULL)
{
printf("没有该好友信息!\n");
}
}
}
//修改通讯录信息
void Alter()
{
char name [50]; //先查找
INFO *p,*p1;
if(head->next==NULL)
{
printf("通讯录空!\n");
return;
}
printf("请输入要修改姓名:\n");
scanf("%s",name);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{
break;
}
else if(p->next==NULL)
{
printf("信息!\n");
return;
}
}
p1=(INFO *)malloc(sizeof(INFO));
printf("new姓名:\n"); //添加信息
scanf("%s",p1->name);
strcpy(p->name,p1->name);
printf("new电话号码:\n");
scanf("%s",p1->tel);
strcpy(p->tel,p1->tel);
printf("newQQ:\n");
scanf("%s",p1->qq);
strcpy(p->qq,p1->qq);
printf("new地址:\n");
scanf("%s",p1->address);
strcpy(p->address,p1->address);
printf("信息已修改\n");
//显示修改信息
printf("姓名\t电话\tQQ\t地址\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
free(p1);
}
//删除通讯录信息
void Delate()
{
int i;
printf ("\n\n\n\n\n\n**************************************\n");
printf ("\t\t1按姓名删除\n");
printf ("\t\t2按电话号码删除\n");
printf ("**************************************\n");
printf ("请选择:(按其他数字键返回!)");
scanf ("%d",&i);
switch (i)
{
case 1:
{
Delate_Name ();
break;
}
case 2:
{
Delate_Tel ();
break;
}
}
}
void Delate_Name()
{
char name[20]; //先查找 删除
INFO *p = head->next, *p1 =head->next,*p2;
if (head->next == NULL)
{
printf("通讯录空\n");
return;
}
printf("请输入要删除姓名:\n");
scanf(" %s",name);
while ((strcmp(p->name,name)!=0 )&& p->next != NULL)
{
p1=p;
p =p->next;
}
if (strcmp(name, p->name)==0) //输删除信息
{
if (p == head->next&&p->next!=NULL)
{
head->next = p->next;
}
else if(p==head->next&&p->next==NULL)
{
head->next=p->next;
printf("好友已全部删除!\n");
return;
}
else
p1->next = p->next;
}
else
{
printf("不存在该好友!\n");
return;
}
printf("信息已删除!\n");
printf("您还有以下好友!\n");
printf("姓名\t电话号码\tQQ\t地址\n");
for(p2=head->next;p2!=NULL;p2=p2->next)
printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address);
}
void Delate_Tel()
{
char tel[20]; //先查找 删除
INFO *p = head->next, *p1 =head->next,*p2;
if (head->next == NULL)
{
printf("通讯录空\n");
return;
}
printf("请输入要删除电话号码:\n");
scanf(" %s",tel);
while ((strcmp(p->tel,tel)!=0 )&& p->next != NULL)
{
p1=p;
p =p->next;
}
if (strcmp(tel, p->tel)==0) //输删除信息
{
if (p == head->next&&p->next!=NULL)
{
head->next = p->next;
}
else if(p==head->next&&p->next==NULL)
{
head->next=p->next;
printf("好友已全部删除!\n");
return;
}
else
p1->next = p->next;
}
else
{
printf("不存在该好友!\n");
return;
}
printf("信息已删除!\n");
printf("您还有以下好友!\n");
printf("姓名\t电话号码\tQQ\t地址\n");
for(p2=head->next;p2!=NULL;p2=p2->next)
printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address);
}
//显示所记录
void List()
{
INFO *p;
if(head->next==NULL)
{
printf("通讯录记录!\n");
return;
}
printf("姓名\t电话号码\tQQ\t地址\n");
for(p=head->next;p!=NULL;p=p->next)
printf("%s\t%s\t\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
}
int main()
{
int choice;
char yes_no;
Initiate();
do
{
Menu();
printf("请输入指令0-5:\n");
scanf("%d",&choice);
printf("\n");
switch(choice)
{
case 1:Add();
break;
case 2:Find();
break;
case 3:Alter();
break;
case 4:Delate();
break;
case 5:List();
break;
case 0:
printf("************谢您使用************\n");
exit(0); //正常退出
break;
default:
printf("输入误!请重新输入\n");
break;
}
printf("是否继续 Y or N? \n");
do
{
scanf("%c",&yes_no);
}
while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}
while(yes_no=='Y'||yes_no=='y');
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m