通讯录(动态空间)

文章介绍了使用C++编写的通讯录程序,包括数据结构定义(如Contact和po),函数实现(如添加、删除、查找、修改和排序等)以及主函数的流程控制。
#pragma once
#pragma warning(disable:6031)
//contact.h 文件
#define PLUS 2
#define INIT 3


#define num_name 20
#define num_sex 5
#define num_tele 20
#define num_addr 30




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


enum MENU
{
	EXIT,
	ADD,
	DEL,
	FIND,
	FIX,
	SHOW,
	SORT,
};


typedef struct Contact
{
	char name[num_name];// 姓名
	int age;  // 年龄 
	char sex[num_sex];  // 性别
	char tele[num_tele];  // 手机号码
	char addr[num_addr];	// 地址
}Contact;


typedef struct point
{
	Contact* data;
	int len;
	int capacity;
}po;


void Init(po* pc);
void Exit(po* pc);
void Add(po* pc);
void Del(po* pc);
void Find(po* pc);
void Fix(po* pc);
void Show(const po* pc);
void Sort(po* pc);


//contact.c文件
#include "contact.h"


void menu();


void menu()
{
	printf("****************************************************\n");
	printf("****  1.添加联系人  2.删除联系人  3.查找联系人  ****\n");
	printf("****  4.修改联系人  5.显示联系人  6.排序联系人  ****\n");
	printf("****  0.退出通讯录				****\n");
	printf("****************************************************\n");
}


void addspace(po* pc)
{
	Contact* ptr = (Contact*)realloc(pc->data, (pc->capacity * PLUS) * sizeof(Contact));
	if (ptr != NULL)
	{
		pc->data = ptr;
		pc->capacity *= PLUS;
		printf("\n通讯录扩容:%d -> %d\n", pc->capacity / 2, pc->capacity);
	}
	else return;
}
int findspace(po* pc,int rank)
{
	if (pc->len == 0)
	{
		printf("数据为空\n");
		return -2;
	}




	if (rank == DEL) printf("请输入删除者姓名:>");
	else if (rank == FIX) printf("请输入修改者姓名:>");
	else if (rank == FIND) printf("请输入查找者姓名:>");
	char name[num_name] = { 0 };
	scanf("%s", name);
	for (int i = 0; i < pc->len; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			if (rank == DEL) printf("删除%s成功\n", pc->data[i].name);
			else if (rank == FIX) printf("修改%s:\n", pc->data[i].name);
			else if (rank == FIND) printf("查找%s成功\n", pc->data[i].name);
			return i;
		}
	}
	if (rank == DEL) printf("未找到要删除的数据\n");
	else if (rank == FIX) printf("未找到要修改的数据\n");
	else if (rank == FIND) printf("未找到要查找的数据\n");
	return -1;
}




void Init(po* pc)
{
	pc->len = 0;
	pc->capacity = INIT;
	pc->data = calloc(pc->capacity, sizeof(Contact));
	if (pc->data == NULL) return;
}


void Exit(po* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->len = 0;
	pc->capacity = 0;
}
void Add(po* pc)
{
	//超出就扩容
	if (pc->len >= pc->capacity)
	{
		addspace(pc);
	}


	//增加信息
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->len].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->len].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->len].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->len].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->len].addr);


	pc->len++;


	printf("您的信息录入成功!\n");
}
void Del(po* pc)
{
	int i = findspace(pc, DEL);
	if (i >= 0)
	{
		//删除这个人,后面的向前
		for (i; i < pc->len - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->len--;//最后一个直接删除
	}
}
void Find(po* pc)
{
	int i = findspace(pc, FIND);
	if (i >= 0)
	{
		printf("%-20s %-5s %-5s %-20s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-20s %-5d %-5s %-20s %-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr
		);
	}
}
void Fix(po* pc)
{
	int i = findspace(pc, FIX);
	if (i >= 0)
	{
		int timer = 0;


		printf("请输入姓名:>");
		scanf("%s", pc->data[pc->len].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->len].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->len].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[pc->len].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[pc->len].addr);


		printf("修改成功\n");
	}
}


void Show(const po* pc)
{
	printf("%-20s %-5s %-5s %-20s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (int i = 0; i < pc->len; i++)
	{
		//打印每个人信息
		printf("%-20s %-5d %-5s %-20s %-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr
		);
	}
}
void Sort(po* pc)
{
	for (int i = 0; i < pc->len - 1; i++)
	{
		if (strcmp(pc->data[i].name, pc->data[i + 1].name) > 0)
		{
			Contact tmp;
			tmp = pc->data[i];
			pc->data[i] = pc->data[i + 1];
			pc->data[i + 1] = tmp;
		}
	}
}

//test.c文件
#include "contact.h"

int main()
{
    //通讯录
    int input = 0;
    Contact con;//创建对象
    Init(&con);
    do
    {
        menu();
        printf("请输入数字:>");
        scanf("%d", &input);


        switch (input)
        {
        case EXIT:
            Exit(&con);
            break;
        case ADD:
            Add(&con);
            break;
        case DEL:
            Del(&con);
            break;
        case FIND:
            Find(&con);
            break;
        case FIX:
            Fix(&con);
            break;
        case SHOW:
            Show(&con);
            break;
        case SORT:
            Sort(&con);
            break;
        default:
            printf("输入错误\n");
            break;
        }
        
    } while (input);
    return 0; 
}

代码运行显示图例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶孤程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值