1.目的
写一个实用型通讯录,它有如下功能:
显示目录
- void ShowMenu()
- {
- printf("#######################\n");
- printf("#1.Add 2.Del 3.Search #\n");
- printf("#4.Mod 5.Show 6.Clear #\n");
- printf("#7.Sort 0.Exit #\n");
- printf("#######################\n");
- printf("please select#");
- }

1.添加联系人
2.删除联系人
3.查找联系人
4.修改联系人
5.显示通讯录
6.清除通讯录
7.排序通讯录
2.分部流程
1.初始化通讯录
- void InitContact(contact_t **ct)
- {
- *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t));
- if (*ct == NULL){
- perror("malloc");
- exit(1);
- }
- (*ct)->size = 0;
- (*ct)->cap = INIT_NUM;
- printf("Using Default Init!\n");
- }
2.添加联系人
添加联系人人时要考虑几个问题
1.新加的联系人是否已经存在了
2.通讯录是否已经添加满了 : a.没有满,继续添加 b.满了,实现自动扩容
- void AddFriend(contact_t **ct)
- {
- assert(ct);
- //通讯录已经满了呢?自动扩容
- if (!IsFull(*ct) || Inc(ct))//如果没有满,则执行后续插入,如果满了,自动扩容&&扩容成功
- {
- person_t p;
- printf("请输入新增用户的姓名:");
- scanf("%s", p.name);//name是一个数组
- printf("请输入新增用户的性别:");
- scanf("%s", p.sex);
- printf("请输入新增用户的年纪:");
- scanf("%d", &(p.age));
- printf("请输入新增用户的电话:");
- scanf("%s", p.telphone);
- printf("请输入新增用户的地址:");
- scanf("%s", p.address);
-
- //判定当前用户是否已经存在
- if (IsExist(*ct, &p)){
- printf("%s 已经存在,请不要重复插入\n", p.name);
- return;
- }
- //(*ct)->friend[(*ct)->size] = p;
- memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p));
- (*ct)->size += 1;
- printf("新增用户%s成功\n", p.name);
- }
- else{
- printf("扩容失败\n");
- }
- }

3.判断联系人是否存在
- static int IsExist(contact_t *ct, person_t *p){
- assert(ct);
- assert(p);
-
- int i = 0;
- for (; i < ct->size; i++){
- if (strcmp(ct->friends[i].name, p->name) == 0){
- return 1;
- }
- }
- return 0;
- }
4.判断通讯录是否已满
- static int IsFull(contact_t *ct)
- {
- return ct->cap == ct->size;
- }
5.判断通讯录是否为空
- static int IsEmpty(contact_t *ct)
- {
- return ct->size == 0;
- }
6.通讯录扩容
- static int Inc(contact_t **ct)
- {
- assert(ct);
- contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t));
- if (ct_temp == NULL){
- return 0;
- }
- *ct = ct_temp;
- (*ct)->cap += INC_SIZE;
- printf("自动扩容成功\n");
- return 1;
- }
7.核心函数
实现在通讯录里找到目标联系人,如果有此人,返回这个联系人所在数组中的索引
- static int SearchCore(contact_t *ct, const char *name)
- {
- assert(ct);
- assert(name);
- int i = 0;
- for (; i < ct->size; i++)
- {
- person_t *p = ct->friends + i;
- if (strcmp(name, p->name) == 0){
- return i;
- }
- }
- return -1;
- }
8.查找联系人
1.先判断是否存在这个联系人
2.存在,输出这个联系人的信息
3.不存在,数组不存此联系人
- void SearchFriend(contact_t *ct)
- {
- assert(ct);
- printf("请输入你要查找的人的姓名#");
- char name[NAME_SIZE];
- scanf("%s", name);
- int i = SearchCore(ct, name);
- printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
- if (i >= 0){
- person_t *p = ct->friends + i;
- printf("| %-10s | %-10s | %-10d | %-10s | % 10s | \n", p->name, p->sex, p->age, p->telphone, p->address);
- }
- else{
-
- printf("你要查找的人%s不存在\n", name);
- }
- return;
- }

9.修改联系人
1.在输入想修改的联系人姓名之后,先判断这个联系人是否存在于通讯录中
2.如果存在,定义一个指针指向该联系人存在的位置
- void ModFriend(contact_t *ct)
- {
- assert(ct);
- printf("请输入你要修改的人的姓名#");
- char name[NAME_SIZE];
- scanf("%s", name);
- int i = SearchCore(ct, name);
- if (i >= 0){
- //person_t p;
- person_t *p= (ct->friends + i);
- printf("请输入修改用户的姓名:");
- scanf("%s", p->name);//name是一个数组
- printf("请输入修改用户的性别:");
- scanf("%s", p->sex);
- printf("请输入修改 用户的年纪:");
- scanf("%d", &(p->age));
- printf("请输入修改用户的电话:");
- scanf("%s", p->telphone);
- printf("请输入修改用户的地址:");
- scanf("%s", p->address);
- //(*ct)->friend[(*ct)->size] = p;
- memcpy((ct)->friends + (ct)->size, &p, sizeof(p));
- printf("修改用户%s成功\n", p->name);
- }
- else{
- printf("你要修改的联系人%s不存在\n",name);
- }
- }

10.清空通讯录
只要令size=0,就清空了
- void ClearContact(contact_t *ct)
- {
- assert(ct);
- ct->size = 0;
- }
11.删除联系人
不考虑顺序问题,可直接让最后一个联系人的信息覆盖此要删除的联系人
- void DelFriend(contact_t *ct)
- {
- assert(ct);
- printf("请输入你要删除的人的姓名#");
- char name[NAME_SIZE];
- scanf("%s", name);
- int i = SearchCore(ct, name);
- if (i >= 0){
- //将最后的人的信息直接覆盖到当前位置
- ct->friends[i] = ct->friends[ct->size - 1];
- ct->size -= 1;
- printf("删除成功\n");
- }
- else
- {
- printf("你要删除的人%s不存在\n", name);
- }
- }

12.显示通讯录
- void ShowContact(contact_t *ct){
- assert(ct);
- int i = 0;
- printf("|cap:%d|size:%d|\n", ct->cap, ct->size);
- printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
- for (; i < ct->size; i++){
- person_t *p = ct->friends + i;
- printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", p->name, p->sex, p->age, p->telphone, p->address);
- }
- }

13.比较联系人
- static int CmpPerson(const void *p1,const void *p2)
- {
- assert(p1);
- assert(p2);
- person_t *_p1 = (person_t *)p1;
- person_t *_p2 = (person_t *)p2;
-
- return strcmp(_p1->name, _p2->name);
- }
14.通讯录排序
- void SortContact(contact *ct)
- {
- assert(ct);
- if (!IsEmpty(ct)){
- qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson);
- }
-
- }
3.总代码展示
main.c
- #include "contact.h"
-
- void ShowMenu()
- {
- printf("#######################\n");
- printf("#1.Add 2.Del 3.Search #\n");
- printf("#4.Mod 5.Show 6.Clear #\n");
- printf("#7.Sort 0.Exit #\n");
- printf("#######################\n");
- printf("please select#");
- }
- int main(){
- contact_t *ct = NULL;
- InitContact(&ct);
- int quit = 0;
- while (!quit){
- int select = 0;
- ShowMenu();
- scanf("%d", &select);
-
- switch (select){
- case 1:
- AddFriend(&ct);//添加用户是要进行自动扩容的
- break;
- case 2:
- DelFriend(ct);
- break;
- case 3:
- SearchFriend(ct);
- break;
- case 4:
- ModFriend(ct);
- break;
- case 5:
- ShowContact(ct);
- break;
- case 6:
- ClearContact(ct);
- break;
- case 7:
- SortContact(ct);
- break;
- case 0:
- //SaveContact(ct);
- //break;
- return 0;
- default:
- break;
- }
- }
- //free(ct);
- system("pause");
- return 0;
- }
contact.c
- #include "contact.h"
-
- //初始化通讯录
- void InitContact(contact_t **ct)
- {
- *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t));
- if (*ct == NULL){
- perror("malloc");
- exit(1);
- }
- (*ct)->size = 0;
- (*ct)->cap = INIT_NUM;
- }
-
- //判断联系人是否存在
- static int IsExist(contact_t *ct, person_t *p){
- assert(ct);
- assert(p);
-
- int i = 0;
- for (; i < ct->size; i++){
- if (strcmp(ct->friends[i].name, p->name) == 0){
- return 1;
- }
- }
- return 0;
- }
- //
- //判断通讯录是否已满
- static int IsFull(contact_t *ct)
- {
- return ct->cap == ct->size;
- }
- //
- //判断通讯录是否为空
- static int IsEmpty(contact_t *ct)
- {
- return ct->size == 0;
- }
- /
- //通讯录扩容
- static int Inc(contact_t **ct)
- {
- assert(ct);
- contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t));
- if (ct_temp == NULL){
- return 0;
- }
- *ct = ct_temp;
- (*ct)->cap += INC_SIZE;
- printf("自动扩容成功\n");
- return 1;
- }
-
- //添加新的联系人
- void AddFriend(contact_t **ct)
- {
- assert(ct);
- //通讯录已经满了呢?自动扩容
- if (!IsFull(*ct) || Inc(ct))//如果没有满,则执行后续插入,如果满了,自动扩容&&扩容成功
- {
- person_t p;
- printf("请输入新增用户的姓名:");
- scanf("%s", p.name);//name是一个数组
- printf("请输入新增用户的性别:");
- scanf("%s", p.sex);
- printf("请输入新增用户的年纪:");
- scanf("%d", &(p.age));
- printf("请输入新增用户的电话:");
- scanf("%s", p.telphone);
- printf("请输入新增用户的地址:");
- scanf("%s", p.address);
-
- //判定当前用户是否已经存在
- if (IsExist(*ct, &p)){
- printf("%s 已经存在,请不要重复插入\n", p.name);
- return;
- }
- //(*ct)->friend[(*ct)->size] = p;
- memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p));
- (*ct)->size += 1;
- printf("新增用户%s成功\n", p.name);
- }
- else{
- printf("扩容失败\n");
- }
- }
- /
- //核心函数
- static int SearchCore(contact_t *ct, const char *name)
- {
- assert(ct);
- assert(name);
- int i = 0;
- for (; i < ct->size; i++)
- {
- person_t *p = ct->friends + i;
- if (strcmp(name, p->name) == 0){
- return i;
- }
- }
- return -1;
- }
- //
- //查找联系人
- void SearchFriend(contact_t *ct)
- {
- assert(ct);
- printf("请输入你要查找的人的姓名#");
- char name[NAME_SIZE];
- scanf("%s", name);
- int i = SearchCore(ct, name);
- printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
- if (i >= 0){
- person_t *p = ct->friends + i;
- printf("| %-10s | %-10s | %-10d | %-10s | % 10s | \n", p->name, p->sex, p->age, p->telphone, p->address);
- }
- else{
-
- printf("你要查找的人%s不存在\n", name);
- }
- return;
- }
- //
- //修改联系人
- void ModFriend(contact_t *ct)
- {
- assert(ct);
- printf("请输入你要修改的人的姓名#");
- char name[NAME_SIZE];
- scanf("%s", name);
- int i = SearchCore(ct, name);
- if (i >= 0){
- //person_t p;
- person_t *p= (ct->friends + i);
- printf("请输入修改用户的姓名:");
- scanf("%s", p->name);//name是一个数组
- printf("请输入修改用户的性别:");
- scanf("%s", p->sex);
- printf("请输入修改 用户的年纪:");
- scanf("%d", &(p->age));
- printf("请输入修改用户的电话:");
- scanf("%s", p->telphone);
- printf("请输入修改用户的地址:");
- scanf("%s", p->address);
- //(*ct)->friend[(*ct)->size] = p;
- memcpy((ct)->friends + (ct)->size, &p, sizeof(p));
- printf("修改用户%s成功\n", p->name);
- }
- else{
- printf("你要修改的联系人%s不存在\n",name);
- }
- }
-
- //清空通讯录
- void ClearContact(contact_t *ct)
- {
- assert(ct);
- ct->size = 0;
- }
- ///
- //删除好友
- void DelFriend(contact_t *ct)
- {
- assert(ct);
- printf("请输入你要删除的人的姓名#");
- char name[NAME_SIZE];
- scanf("%s", name);
- int i = SearchCore(ct, name);
- if (i >= 0){
- //将最后的人的信息直接覆盖到当前位置
- ct->friends[i] = ct->friends[ct->size - 1];
- ct->size -= 1;
- printf("删除成功\n");
- }
- else
- {
- printf("你要删除的人%s不存在\n", name);
- }
- }
- //
- //显示通讯录
- void ShowContact(contact_t *ct){
- assert(ct);
- int i = 0;
- printf("|cap:%d|size:%d|\n", ct->cap, ct->size);
- printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
- for (; i < ct->size; i++){
- person_t *p = ct->friends + i;
- printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", p->name, p->sex, p->age, p->telphone, p->address);
- }
- }
-
- //比较联系人
- static int CmpPerson(const void *p1,const void *p2)
- {
- assert(p1);
- assert(p2);
- person_t *_p1 = (person_t *)p1;
- person_t *_p2 = (person_t *)p2;
-
- return strcmp(_p1->name, _p2->name);
- }
- /
- //通讯录排序
- void SortContact(contact *ct)
- {
- assert(ct);
- if (!IsEmpty(ct)){
- qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson);
- }
-
- }
contact.h
- #ifndef _CINTACT_H_
- #define _CONTACT_H_
-
- //person 内部的元素的大小
- #define NAME_SIZE 32
- #define SEX_SIZE 8
- #define TELPHONE_SIZE 16
- #define ADDRESS_SIZE 128
-
- #include <stdio.h>
- #include <Windows.h>
- #include <assert.h>
- #pragma warning(disable:4996)
-
- //通讯的初始信息
- #define INIT_NUM 1000//通讯录初始大小
- #define INC_SIZE 5//每次扩容扩5个
-
- //文件信息
- #define SAVE_FILE "save.txt"
-
- typedef struct person{
- char name[NAME_SIZE];
- char sex[SEX_SIZE];
- int age;
- char telphone[TELPHONE_SIZE];
- char address[ADDRESS_SIZE];
- //int ok;
- }person_t;
-
- typedef struct contact{
- FILE *save;
- int cap; //容量
- int size; //当前有效好友
- person_t friends[0];//柔性数组
- }contact_t;
-
-
- void InitContact(contact_t **ct);
- void AddFriend(contact_t **ct);
- void ShowContact(contact_t *ct);
- void ModFriend(contact_t *ct);
- void SearchFriend(contact_t *ct);
- void ClearContact(contact_t *ct);
- void DelFriend(contact_t *ct);
- void SortContact(contact_t *ct);
- #endif
到此这篇关于C语言实现可排序通讯录的示例代码的文章就介绍到这了,更多相关C语言 可排序通讯录内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!