1. 前言
虽然自己当前不咋滴,但把这句话送给自己和你们!
成功=一个习惯(做好开头做好结尾)+三个能力(学会反省+学会独立+总结收获)+伟大理想
2. 框架
这里采用多文件实现,文件包括:main.c(整体逻辑)、Adress_list.c(功能实现)、Adress_list.h(包含函数声明以及类型声明)、HiddenFunction.c(函数中的嵌套函数功能),下面来看看各功能的实现操作。
3. 具体实现
3.1 初始化通讯录
初始化通讯录就是对整体通讯录实现初始化以及对通讯录中每个人的信息进行初始化。
3.2 打印菜单
让用户知道怎么完成操作
3.3 添加联系人信息
将相应的内容添加到通讯录中,在此过程中,通讯录的大小也随之增大。
3.4 展示通讯录
就是相应的展示出你的通讯录的每个人的信息情况
3.5 删除通讯录
具体实现是通过遍历找到你想要删除的练习人的姓名来进行删除,删除的实现是让后面的依次对前面一个联系人进行覆盖
3.6 查找联系人
通过名字比较遍历来找到联系人是否存在,存在就显示个人信息,不存在就说明
3.7 修改联系人信息
通过比较名字来遍历找到该联系人,对其信息进行覆盖
3.8 按照年龄进行排序
这里使用库函数qsort来对年龄进行排序
3.9 删除所有联系人信息
我的具体实现是通过创建另外一个个人信息的数组,把通讯录中所有人的信息放进这个数组进行存储。(缺点:空间占用太多) 另外的方法:是把第二个联系人及之后的联系人的信息先对其覆盖,全部覆盖到第一个联系人的内容上,覆盖完后再把第一个联系人的信息放进一个创建了一个大小的个人信息数组中(优化了空间),(当然还有更多的方法,这里我只想出来这两个比较简单的方法)
介绍完毕!
4. 代码展示
4.1 main.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
int main()
{
struct Adress_List List;
Init_Adress_List(&List);
int input = 0;
do
{
menu();
printf("请输出操作前的提示数字,可完成此操作:>");
scanf("%d",&input);
switch (input)
{
case 1:
Add_Linkman(&List);
system("cls");
break;
case 2:
Delete_Linkman(&List);
system("cls");
break;
case 3:
Find_Linkman(&List);
system("cls");
break;
case 4:
Modify_Linkman_Information(&List);
system("cls");
break;
case 5:
SortList_By_age(&List);
system("cls");
break;
case 6:
Show_Adress_List(&List);
system("cls");
break;
case 7:
Delete_AllLinkman(&List);
system("cls");
break;
case 0:
printf("------------------退出程序!------------------\n");
break;
default:
printf("------------------输入错误!------------------\n");
break;
}
} while (input);
system("pause");
return 0;
}
4.2 Adress_list.h文件
#pragma once
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#define MAX 100
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_PONE 15
#define MAX_ADRESS 20
struct Person_Information
{
char name[MAX_NAME];
char sex[MAX_SEX];
char phone[MAX_PONE];
int age;
char adress[MAX_ADRESS];
};
struct Adress_List
{
struct Person_Information data[MAX];
int size;
};
void Init_Adress_List(struct Adress_List* List);
void menu();
void Add_Linkman(struct Adress_List* List);
void Show_Adress_List(const struct Adress_List* List);
void Delete_Linkman(struct Adress_List* List);
int Find_By_Name(const struct Adress_List* List, char name[]);
void Show_Person_Information(struct Adress_List* List, int ret);
void Find_Linkman(struct Adress_List* List);
void Modify_Linkman_Information(struct Adress_List* List);
void SortList_By_age(const struct Adress_List* List);
int compare(const void* e1, const void* e2);
void Delete_AllLinkman(struct Adress_List* List);
4.3 Adress_list.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
void Init_Adress_List(struct Adress_List* List)
{
assert(List);
memset(List->data, 0, MAX * sizeof(struct Person_Information));
List->size = 0;
}
void menu()
{
printf("\n");
printf("************************************************\n");
printf("***** 1.AddLinkman 2.DeleteLinkman ******\n");
printf("***** 3.FindLinkman 4.ModifyLinkman ******\n");
printf("***** 5.SortByAge 6.ShowList ******\n");
printf("***** 7.DeleteAll 0.exit ******\n");
printf("************************************************\n");
printf("\n");
}
void Add_Linkman(struct Adress_List* List)
{
assert(List);
if (List->size == MAX)
{
printf("通讯录已满,无法继续添加\n");
return;
}
printf("请输入名字:>");
scanf("%s", List->data[List->size].name);
printf("请输入性别:>");
scanf("%s", List->data[List->size].sex);
printf("请输入电话:>");
scanf("%s", List->data[List->size].phone);
printf("请输入年龄:>");
scanf("%d", &List->data[List->size].age);
printf("请输入家庭住址:>");
scanf("%s", List->data[List->size].adress);
List->size++;
printf("添加联系人成功!\n");
Sleep(800);
}
void Show_Adress_List(const struct Adress_List* List)
{
printf("\n");
printf("-------------------------------------------------------------------------------\n");
printf("暂时的通讯录的所有信息:>\n");
printf("%-5s\t%-5s\t%-15s\t%-20s\t%-20s\n", "姓名", "性别", "电话", "年龄", "家庭住址");
int i = 0;
for (i = 0; i < List->size; i++)
{
printf("%-5s\t%-5s\t%-15s\t%-20d\t%-20s\n",
List->data[i].name,
List->data[i].sex,
List->data[i].phone,
List->data[i].age,
List->data[i].adress);
}
printf("-------------------------------------------------------------------------------\n");
printf("\n");
printf("请等上5秒,再次操作!\n");
Sleep(5000);
}
void Delete_Linkman(struct Adress_List* List)
{
char name[MAX_NAME];
printf("请输入你想删除的联系人的姓名:>");
scanf("%s", name);
int ret = Find_By_Name(List,name);
if (-1 == ret)
{
printf("该联系人不存在!\n");
Sleep(800);
}
else
{
int i = 0;
for (i = ret; i < List->size; i++)
{
List->data[i] = List->data[i + 1];
}
List->size--;
printf("成功删除该联系人!\n");
Sleep(800);
}
}
void Find_Linkman(struct Adress_List* List)
{
printf("请输入你想查找的联系人的姓名:>");
char name[MAX_NAME];
scanf("%s", name);
int ret = Find_By_Name(List, name);
if (ret == -1)
{
printf("此联系人不存在!\n");
Sleep(800);
}
else
{
printf("\n");
printf("你的通讯录里面有此联系人,它的信息是:>\n");
Show_Person_Information(List,ret);
Sleep(800);
}
}
void Modify_Linkman_Information(struct Adress_List* List)
{
printf("请输入你想修改信息的联系人的姓名:>");
char name[MAX_NAME];
scanf("%s", name);
int ret = Find_By_Name(List, name);
if (-1 == ret)
{
printf("此联系人不存在!\n");
Sleep(800);
}
else
{
printf("请输入名字:>");
scanf("%s", List->data[ret].name);
printf("请输入性别:>");
scanf("%s", List->data[ret].sex);
printf("请输入电话:>");
scanf("%s", List->data[ret].phone);
printf("请输入年龄:>");
scanf("%d", &List->data[ret].age);
printf("请输入家庭住址:>");
scanf("%s", List->data[ret].adress);
printf("修改成功!\n");
printf("\n");
Sleep(800);
}
}
void SortList_By_age(const struct Adress_List* List)
{
assert(List);
if (List->size <= 1)
{
printf("\n");
printf("通讯录里面联系人个数小于两个没有必要对其进行排序!\n");
Sleep(800);
return;
}
qsort(List->data, List->size, sizeof(struct Person_Information), compare);
printf("排序完成!\n");
Sleep(800);
}
void Delete_AllLinkman(struct Adress_List* List)
{
if (List->size == 0)
{
printf("通讯录为空,无法操作!\n");
Sleep(800);
}
else
{
struct Person_Information Delete[MAX];
int i = 0;
int k = List->size;
for (i = 0; i < k; i++)
{
Delete[i] = List->data[i];
List->size--;
}
printf("删除成功!\n");
Sleep(800);
}
}
4.4 HiddenFunction.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
int Find_By_Name(const struct Adress_List* List, char name[])
{
int i = 0;
for (i = 0; i < List->size; i++)
{
if (0 == strcmp(List->data[i].name, name))
{
return i;
}
}
return -1;
}
int compare(const void* e1, const void* e2)
{
return ((struct Person_Information*)e1)->age - ((struct Person_Information*)e2)->age;
}
void Show_Person_Information(struct Adress_List* List, int ret)
{
printf("-------------------------------------------------------------------------------\n");
printf("%-5s\t%-5s\t%-15s\t%-20s\t%-20s\n", "姓名", "性别", "电话", "年龄", "家庭住址");
printf("%-5s\t%-5s\t%-15s\t%-20d\t%-20s\n",
List->data[ret].name,
List->data[ret].sex,
List->data[ret].phone,
List->data[ret].age,
List->data[ret].adress);
printf("-------------------------------------------------------------------------------\n");
printf("\n");
}
缺点: 1.因为使用的是数组所以大小是固定的,不能存储太多。 2.读取信息不够准确(没有对信息录入进行优化) 3.查找和排序太单调,没有优化查找,暂时只能对名字进行查找和排序(需求没有完善,初步认识够用)
介绍完毕,感谢浏览,继续加油!
|