结合目前所学的一些C语言知识,我写了如下的一个通讯录程序,可以实现新建联系人,删除联系人,查找联系人,修改联系人,打印全部联系人,清空全部联系人以及联系人排序。话不多说,我们来看代码
重要模块
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXNUM 100
typedef struct PersonInfo{
char name[100];
char sex[10];
int age;
char phone[100];
char address[100];
} PersonInfo;
typedef struct addressbook{
PersonInfo persons[MAXNUM+1];
int size;//体现有效元素
} addressbook;
成员变量写好后,我们就要初始化,初始化函数如下
//此处参数设为指针类型
//1.结构体作为函数参数的时候,需要进行开背参数而结构体占据内存可能比较大,参数写成指针类型能降低拷贝开销
//2.初始化函数内部需要修稿结构体变量的内容,我们需要在函数内部修改同时影响到外部
void Init(addressbook* addr)//初始化
{
addr->size = 0;
for(int i=0;i<MAXNUM+1;i++){
strcpy(addr->persons[i].name,"");
strcpy(addr->persons[i].sex,"");
addr->persons[i].age=0;
strcpy(addr->persons[i].phone,"");
strcpy(addr->persons[i].address,"");
}
}
初始化完后,我们需要建立一个菜单,来供用户选择,代码如下
int menu()
{
printf("=====================\n");
printf("1. 新增联系人\n");
printf("2. 删除联系人\n");
printf("3. 查找联系人\n");
printf("4. 修改联系人\n");
printf("5. 打印全部联系人\n");
printf("6. 清空全部联系人\n");
printf("7. 排序全部联系人\n");
printf("0. 退出\n");
printf("=====================\n");
int choice =0;
scanf("%d",&choice);
return choice;
}
新建联系人
上述我们知道,该通讯录是由结构体来实现的所以,新建联系人的时候我们需要判断是否在有效元素内,以及每次新建一个人后都需要将有效元素+1。代码如下
void AddPersonInfo(addressbook* addr_book)//新建联系人
{
printf("新增联系人\n");
if(addr_book->size>=MAXNUM){
printf("通讯录已满");
return ;
}
PersonInfo* info =&addr_book->persons[addr_book->size];
printf("请输入联系人姓名:");
scanf("%s",info->name);
printf("请输入联系人性别(man/woman):");
scanf("%s",info->sex);
printf("请输入联系人年龄:");
scanf("%d",&info->age);
printf("请输入联系人电话:");
scanf("%s",info->phone);
printf("请输入联系人住址:");
scanf("%s",info->address);
addr_book->size++;
printf("新增联系人成功\n");
}
删除联系人
删除联系人的时候呢,我所采用一个最简单的方法,将最后一个有效联系人的所有信息覆盖到你所需要删除的联系人的所有信息,虽然这样做序号会改变,但是我们想想通讯录中只要有这个人,不论在什么位置,都可以找到他。除此之外,每当删除一个人后,我们的有效元素就要减1。这里我用了序号删除或者姓名删除,具体代码如下
void DelPersonInfor(addressbook* addr_book)
{
printf("删除联系人\n");
printf("请选择删除方式:\n");
printf("1.序号删除 2.姓名删除");
int choice = 0;
scanf("%d",&choice);
if(choice==1){
if(addr_book->size<=0){
//判断有效元素是否合法
printf("通讯录为空!删除失败");
return ;
}
int id = 0;
printf("输入所要删除的序号:");
if(id<0||id>addr_book->size){
printf("输入的id非法,删除失败");
return ;
}
scanf("%d",&id);
PersonInfo* last_info = &addr_book->persons[addr_book->size-1];
PersonInfo* to_delete = &addr_book->persons[id];
*to_delete=*last_info;
addr_book->size--;
}
if(choice==2){
int i =0;
char Name[100]