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语言 可排序通讯录内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/m0_46245582/article/details/121580452