C语言集合(通讯录实现)

一、头文件

#define _CRT_SECURE_NO_WARNINGS 1
#define EXPAND 5
#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 15
#define PLACE_MAX 20

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <string.h>

enum menu
{
	ex = 0,
	add,
	delet,
	find,
	change,
	show,
	clear,
	sort,
};

typedef struct student
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char place[PLACE_MAX];
}Stu;

typedef struct contact
{
	Stu* person;
	int num;
	int capability;
}Cont;

void Add(Cont* contact);
void Show(Cont* contact);
void Find(Cont* contact);
void Change(Cont* contact);
void Delet(Cont* contact);
void Clear(Cont* contact);
int compare(void* a, void* b);

二、.c函数文件

#include "contacts.h"

void Add(Cont* contact)
{
	assert(contact);
	if (contact->capability == 0 || contact->capability == contact->num)
	{
		Stu* arr = (Stu*)realloc(contact->person, (contact->capability += EXPAND) * sizeof(Stu));
		if (arr != NULL)
		{
			contact->person = arr;
			contact->capability += EXPAND;
			printf("增容成功\n");
		}
		else
		{
			perror("ADD");
			printf("增容失败\n");
			return;
		}
	}

	Stu* arr = contact->person;
	int i = contact->num;
	printf("请输入姓名、性别、年龄、电话、地址(用空格分开):");
	scanf("%s %s %d %s %s", (arr + i)->name, (arr + i)->sex, &((arr + i)->age), (arr + i)->tel, (arr + i)->place);
	contact->num += 1;
	printf("增加成功!\n");
}

void Show(Cont* contact)
{
	assert(contact);
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\t\n", "姓名", "年龄", "性别", "电话", "地址");
	Stu* arr = contact->person;
	for (int i = 0; i < contact->num; i++)
	{
		printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\t\n", 
			(arr + i)->name, 
			(arr + i)->sex, 
			(arr + i)->age, 
			(arr + i)->tel, 
			(arr + i)->place);
	}
}

void Find(Cont* contact)
{
	assert(contact);
	char input[NAME_MAX];
	printf("请输入想要搜索的人名:");
	scanf("%s", input);
	Stu* arr = contact->person;
	for (int i = 0; i < contact->num; i++)
	{
		if (!(strcmp((arr + i)->name, input)))
		{
			printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\t\n", "姓名", "年龄", "性别", "电话", "地址");
			printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\t\n",
				(arr + i)->name,
				(arr + i)->sex,
				(arr + i)->age,
				(arr + i)->tel,
				(arr + i)->place);
			break;
		}
	}
	printf("没有此人!\n");
}

void Change(Cont* contact)
{
	assert(contact);
	char input[NAME_MAX] = {0};
	printf("请输入想要修改的人名:");
	scanf("%s", input);
	Stu* arr = contact->person;
	for (int i = 0; i < contact->num; i++)
	{
		if (!(strcmp((arr + i)->name, input)))
		{
			printf("请输入姓名、性别、年龄、电话、地址(用空格分开):");
			scanf("%s %s %d %s %s", (arr + i)->name, (arr + i)->sex, &((arr + i)->age), (arr + i)->tel, (arr + i)->place);
			printf("修改成功!\n");
			return;
		}
	}
	printf("没有此人!\n");
}

void Delet(Cont* contact)
{
	assert(contact);
	char input[NAME_MAX] = { 0 };
	printf("请输入想要删除的人名:");
	scanf("%s", input);
	Stu* arr = contact->person;
	for (int i = 0; i < contact->num; i++)
	{
		if (!(strcmp((arr + i)->name, input)))
		{
			while (i < contact->num - 1)
			{
				memcpy(arr + i, arr + i + 1, sizeof(Stu));
				i++;
			}
			contact->num -= 1;
			printf("删除成功!\n");
			return;
		}
	}
	printf("没有此人!\n");
}

void Clear(Cont* contact)
{
	assert(contact);
	memset(contact->person, 0, contact->num * sizeof(Stu));
	contact->num = 0;
}

int compare(void* a, void* b)
{
	return strcmp(((Stu*)a)->name, ((Stu*)b)->name);
}

三、.c测试文件

#include "contacts.h"

void menu()
{
	printf("**********欢迎来到通讯录************\n");
	printf("*******1. add       2. delet********\n");
	printf("*******3. find      4. change*******\n");
	printf("*******5. show      6. clear********\n");
	printf("*******7. sort      0. exit*********\n");
}

int main()
{
	int input = 0;
	Cont contact = {NULL,0,0};
	
	do
	{
		menu();
		printf("请输入你的选择:");
		scanf("%d", &input);

		switch (input)
		{
		case add:
			Add(&contact);
			break;
		case delet:
			Delet(&contact);
			break;
		case find:
			Find(&contact);
			break;
		case change:
			Change(&contact);
			break;
		case show:
			Show(&contact);
			break;
		case clear:
			Clear(&contact);
			break;
		case sort:
			qsort(contact.person, contact.num, sizeof(Stu), compare);
			Show(&contact);
			break;
		case ex:
			printf("退出成功!");
			break;
		}

	} while (input);

	free(contact.person);
	contact.person = NULL;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值