目录
  • 1.目的
  • 2.分部流程
    • 1.初始化通讯录
    • 2.添加联系人
    • 3.判断联系人是否存在
    • 4.判断通讯录是否已满
    • 5.判断通讯录是否为空
    • 6.通讯录扩容
    • 7.核心函数
    • 8.查找联系人
    • 9.修改联系人
    • 10.清空通讯录
    • 11.删除联系人
    • 12.显示通讯录
    • 13.比较联系人
    • 14.通讯录排序
  • 3.总代码展示

    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#");
    }
    

    C语言实现可排序通讯录的示例代码

    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");
    	}
    }

    C语言实现可排序通讯录的示例代码

    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;
    }

    C语言实现可排序通讯录的示例代码

    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);
    	}
    }
    

    C语言实现可排序通讯录的示例代码

    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);
    	}
    }
    

    C语言实现可排序通讯录的示例代码

    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);
    	}
    }
    

    C语言实现可排序通讯录的示例代码

    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 
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。