C语言——通讯录实现

一、介绍

本文只是对于结构体类型的练习。

只是简单的静态通讯录实现,没有具体的UI界面,只有一些简单的功能,同时也比较粗糙,有很多地方没有经过足够的打磨。

二、源码

本项目包含三个文件:

test.c/cpp

#include "contacts_list.h"

int main()
{
	int status = 0;

	Contacts_list contacts_list;//通讯录结构体变量

	InitContact(&contacts_list);
	int res = 0;
	int num = 0;
	do
	{
		menu();//打印菜单

		scanf("%d", &status);

		system("cls");

		switch (status)
		{
		case 1:
			AddContact(&contacts_list);
			break;
		case 2:
			DeleteContact(&contacts_list);
			break;
		case 3:
			char name1[21];
			printf("please type in the name>:");
			scanf("%s", name1);
			res = SearchContact(&contacts_list, name1);
			if (res != -1)
			{
				printf("%d\n", res);
			}
			else
			{
				printf("cannot find\n");
			}
			break;
		case 4:
			char name2[21];
			printf("please type in the name>:");
			scanf("%s", name2);
			ModifyContact(&contacts_list,name2);
			break;
		case 5:
			DisplayContact(&contacts_list);
			break;
		case 6:
			printf("1.sort by name\n");
			printf("2.sort by age\n");
			scanf("%d", &num);
			SortContact(&contacts_list,num);
			break;
		case 0:
			printf("exit\n");
			break;
		default :
			printf("error\n");
			break;
		}
	} while (status);

	return 0;
}

contact.c/cpp

#include "contacts_list.h"

void menu()
{
	printf("*************************************\n");
	printf("*****  1.add            2.del    ****\n");
	printf("*****  3.search         4.modify ****\n");
	printf("*****  5.display        6.sort   ****\n");
	printf("*****  0.exit                    ****\n");
	printf("*************************************\n");
	printf("please choose a option>:");
}

void InitContact(Contacts_list* list)
{
	int i = 0;
	for (i = 0; i < 100; i++)
	{
		list->num = 0;//将联系人个数初始化为零
		memset(list->data, 0, sizeof(list->data));//将数据部分初始化为0
	}
}

void AddContact(Contacts_list* list)
{
	if (list->num == MAXCONTACTS)
	{
		printf("there is no more space\n");//没有空间
		return;
	}
	printf("please type in name(maximum 20)>:");
	scanf("%s", list->data[list->num].name);
	printf("please type in gender(maximum 8)>:");
	scanf("%s", list->data[list->num].gender);
	printf("please type in age>:");
	scanf("%d", &(list->data[list->num].age));
	list->num++;
	printf("operating successfully\n");
}

void DisplayContact(const Contacts_list* list)
{
	int i = 0;
	for (i = 0; i < list->num; i++)
	{
		printf("name: %s\n", list->data[i].name);
		printf("gender: %s\n", list->data[i].gender);
		printf("age: %d\n", list->data[i].age);
		printf("-------------------------\n");
	}
	printf("display successfully\n");
}

void DeleteContact(Contacts_list* list)
{
	char name[21];
	if (list->num == 0)
	{
		printf("there is no contact can be deleted\n");//联系人为零,无需删除
		return;
	}

	printf("please type in the name who you want to delete>:");
	scanf("%s", name);
	int res = SearchContact(list, name);

	if (res != -1)
	{
		int i = 0;
		for (i = res; i < list->num - 1; i++)
		{
			list->data[i] = list->data[i + 1];
		}
		list->num--;
		printf("delete successfully\n");
	}
	else
	{
		printf("cannot find\n");//没找到要删除的联系人
		return;
	}
}

int SearchContact(Contacts_list* list, const char* string)
{
	int i = 0;
	for (i = 0; i < list->num; i++)
	{
		if (strcmp(list->data[i].name, string) == 0)
		{
			return i;//查找到返回下标
		}
	}
	return -1;//未查找到返回-1
}

void ModifyContact(Contacts_list* list, const char* string)
{
	int res = SearchContact(list, string);
	if (res == -1)
	{
		printf("cannot find\n");
		return;
	}
	printf("please type in name(maximum 20)>:");
	scanf("%s", list->data[res].name);
	printf("please type in gender(maximum 8)>:");
	scanf("%s", list->data[res].gender);
	printf("please type in age>:");
	scanf("%d", &(list->data[res].age));

	printf("modification successfully\n");
}

int cmp_by_name(const void* element1, const void* element2)
{
	PeopleInfo* ele1 = (PeopleInfo*)element1;//强制转换为联系人结构体类型,方便访问name变量
	PeopleInfo* ele2 = (PeopleInfo*)element2;
	return strcmp(ele1->name, ele2->name);
}

int cmp_by_age(const void* element1, const void* element2)
{
	int res = ((PeopleInfo*)element1)->age - ((PeopleInfo*)element2)->age;
	return ((-res < 0) - (res < 0));
}

void SortContact(Contacts_list* list, int num)
{
	switch (num)
	{
	case 1:
		qsort(list->data, list->num, sizeof(list->data[0]), cmp_by_name);
		printf("sort successfully\n");
		break;
	case 2:
		qsort(list->data, list->num, sizeof(list->data[0]), cmp_by_age);
		printf("sort successfully\n");
		break;
	default :
		printf("error\n");
		break;
	}
}

contact.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define MAXCONTACTS 100

//打印菜单函数
void menu();

//声明联系人信息结构体变量
typedef struct PeopleInfo
{
	char name[21];
	char gender[9];
	int age;
}PeopleInfo;

//声明通讯录结构体变量
typedef struct Contacts_list
{
	PeopleInfo data[MAXCONTACTS];//存放联系人数据
	int num;//记录通讯录联系人个数
}Contacts_list;

//初始化函数
void InitContact(Contacts_list* list);

//添加联系人
void AddContact(Contacts_list* list);

//显示通讯录
void DisplayContact(const Contacts_list* list);

//删除联系人
void DeleteContact(Contacts_list* list);

//查找联系人
int SearchContact(Contacts_list* list, const char* string);

//修改联系人
void ModifyContact(Contacts_list* list,const char* string);

//排序联系人
void SortContact(Contacts_list* list, int num);

//按名字排序
int cmp_by_name(const void* element1, const void* element2);

//按年龄排序
int cmp_by_age(const void* element1, const void* element2);

如有错误,欢迎指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值