用C语言实现一个通讯录
作者:互联网
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
//通过结构体描述一个人的练习情况
typedef struct PersonInfo {
char name[1024];
char phone[1024];
}PersonInfo;
//这个结构体描述了一个通信录
//通信录的长度是1024
//还有一个size,表示当前有多少联系人
typedef struct AddressBook {
PersonInfo persons[1024];
int size;
}AddressBook;
//此处全局变量,当前为了实现通讯录
//围绕Address
AddressBook addressBook;
void init(AddressBook* addressBook) {
//把有效元素个数设置为0
addressBook->size = 0;
//可有可无
/*memset(addressBook->persons, 0, sizeof(addressBook->persons));*/
}
int menu() {
printf("****************************\n");
printf("*******欢迎使用通讯录*******\n");
printf("****************************\n");
printf(" \n");
printf("****************************\n");
printf("********1. 新增联系人*******\n");
printf("********2. 删除联系人*******\n");
printf("********3. 查看联系人*******\n");
printf("********4. 修改联系人*******\n");
printf("********0. 退出通讯录*******\n");
printf("****************************\n");
printf("请输入选项: ");
int choice = 0;
scanf("%d", &choice);
return choice;
}
void insert(AddressBook* addressBook) {
printf("新增\n");
assert(addressBook != NULL);
//最大为1024满了的话提示失败
if (addressBook->size >= 1024) {
printf("失败\n");
return;
}
PersonInfo person = { 0 };
printf("输入姓名: \n");
scanf("%s", person.name);
printf("输入电话: \n");
scanf("%s", person.phone);
//把person结构体放到AdderssBook中
//当数组为空的时候,size就是0,把新增的元素放到下标为0的位置
//插入完毕后,把size++ ==> 1
//下次再插入的时候,size为1,就是把心得元素放到size下标为1的位置
addressBook->persons[addressBook->size] = person;
addressBook->size++;
printf("完成\n\n");
}
void drop(AddressBook* addressBook) {
printf("删除\n");
//让用户输入一个序号(数组下标)根据序号删除
printf("输入序号: \n");
int id = 0;
scanf("%d", &id);
if (id < 0 || id >= addressBook->size) {
printf("错误\n");
return;
}
//思路
//如果是尾删就size--
//如果中间,就把最后一个元素粘过去,再sie--
if (id == addressBook->size - 1) {
addressBook->size--;
printf("成功\n");
return;
}
PersonInfo* lastPerson = &addressBook->persons[addressBook->size - 1];
addressBook->persons[id] = *lastPerson;
addressBook->size--;
printf("成功\n");
}
void show(AddressBook* addressBook) {
printf("查看");
//直接遍历数组
for (int i = 0; i < addressBook->size; i++) {
//最好用指针变量表示这个元素
//不用指针会涉及到元素的拷贝,把PersonInfo的结构体拷贝了一遍
PersonInfo* p = &addressBook->persons[i];
printf("[%d] %s\t%s\n", i, p->name, p->phone);
}
printf("查看联系人完毕\n一共有 %d 个联系人\n\n", addressBook->size);
}
void update(AddressBook* addressBook) {
printf("修改\n");
printf("输入序号: \n");
int id = 0;
scanf("%d", &id);
if (id < 0 || id >= addressBook->size) {
printf("错误\n");
return;
}
PersonInfo* p = &addressBook->persons[id];
char name[1024] = { 0 };
char phone[1024] = { 0 };
printf("输入 * 表示该选项不修改\n");
printf("输入新用户名(旧: %s): \n", p->name);
scanf("%s", name);
if (strcmp(name, "*") != 0) {
strcpy(p->name, name);
}
printf("输入新电话(旧: %s): \n", p->phone);
scanf("%s", phone);
if (strcmp(phone, "*") != 0) {
strcpy(p->phone, phone);
}
printf("成功\n");
}
typedef void(*Func)(AddressBook*);
int main() {
//进行初始化
init(&addressBook);
Func funcs[] = {
NULL,//为了能让insert和choice对应上
insert,
drop,
show,
update
};
//和用户进行交互
while (1) {
int choice = menu();
//if (choice == 1) {
新增
//}else if (choice == 2) {
删除
//}else if (choice == 3) {
查看
//}else if (choice == 4) {
修改
//}else if (choice == 0) {
退出
//}else {
错误输入
//}
if (choice < 0 || choice >= sizeof(funcs) / sizeof(funcs[0])) {
printf("输入有误");
continue;
}
if (choice == 0) {
printf("再见");
break;
}
funcs[choice](&addressBook);
//Func func = funcs[choice];
// func(addressBook);
//Sleep(2000);
system("pause");
system("cls");
}
return 0;
}
标签:name,实现,addressBook,C语言,通讯录,printf,choice,id,size 来源: https://blog.csdn.net/qeqe1212/article/details/121177503