概述
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语言 可排序通讯录内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!
最后
以上就是妩媚金毛为你收集整理的C语言实现可排序通讯录的示例代码的全部内容,希望文章能够帮你解决C语言实现可排序通讯录的示例代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复