C语言——通讯录实现

一、介绍

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

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

二、源码

本项目包含三个文件:

test.c/cpp

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

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

cpp 复制代码
#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);

如有错误,欢迎指正。

相关推荐
wanzhong233321 小时前
学习triton-第1课 向量加法
开发语言·python·高性能计算
三千道应用题1 天前
C#语言入门详解(18)传值、输出、引用、数组、具名、可选参数、扩展方法
开发语言·c#
忧郁的蛋~1 天前
使用.NET标准库实现多任务并行处理的详细过程
开发语言·c#·.net
dragon_perfect1 天前
全流程基于Yolov8实现在Label-Studio实现半自动标注,已经把整个流程理清楚,把所有的坑解决。
开发语言·python·yolo·labelstudio
kalvin_y_liu1 天前
四款主流深度相机在Python/C#开发中的典型案例及技术实现方案
开发语言·python·数码相机
劲镝丶1 天前
malloc概述
c语言·开发语言·c++
1373i1 天前
【Python】pytorch数据操作
开发语言·pytorch·python
努力努力再努力wz1 天前
【C++进阶系列】:万字详解红黑树(附模拟实现的源码)
java·linux·运维·c语言·开发语言·c++
路弥行至1 天前
从0°到180°,STM32玩转MG996R舵机
c语言·数据库·stm32·单片机·嵌入式硬件·mcu·mongodb
枫fengw1 天前
9.8 C++
开发语言·c++