【C语言进阶】通讯录动态版本

通讯录动态版本


一.何为动态版本?

二.效果图

三.项目目录

四.头文件

五.源文件


一.何为动态版本?

1.通讯录人员数量自己设定好以后,人数存满可以自动新增空间

2.新增销毁功能,清空人员

二.效果图

三.项目目录

四.头文件
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define ORIGINAL 1 //原始容量空间
#define INC 2 //每次扩容两个人容量空间
#define NAME 10
#define SEX 5
#define PHONE 15
#define ADDRESS 20
enum option
{
	Add = 1,
	Del,
	Search,
	Modify,
	Show,
	Sort,
	Destory
};
typedef struct member
{
	char name[NAME];
	char sex[SEX];
	int age;
	char phone[PHONE];
	char address[ADDRESS];
}member;
//静态版本
//typedef struct txl
//{
//	member data[MAX_member];
//	int capacity;
//}txl;
//动态版本
typedef struct txl
{
	member* data; //改为指针
	int capacity;
	int count;//新增一个变量表示能放的总容量 
}txl; 
int findname(txl*,char[]); //索引
void init(txl* ); //初始化
void add(txl*); //添加用户
void del(txl*); //删除用户
void search(txl*); //查找用户
void modify(txl*); //修改用户
void show(txl*); //列出用户
void sort(txl*); //排序用户
void destory(txl*); //销毁通讯录 动态版本新增
五.源文件
#include "txl.h"
int main()
{
	txl txl; 
	int input = 0;
	init(&txl); 
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case Add:
			add(&txl);
			break;
		case Del:
			del(&txl);
			break;
		case Search:
			search(&txl);
			break;
		case Modify:
			modify(&txl);
			break;
		case Show:
			show(&txl);
			break;
		case Sort:
			sort(&txl);
			break;
		case Destory:
			destory(&txl);
			break;
		}
	} while (input);
}
#include "txl.h"
void menu()
{
	putchar('\n');
	printf("-------------------------------\n");
	printf("---1.添加用户---2.删除用户---\n");
	printf("---3.查找用户---4.修改用户---\n");
	printf("---5.列出用户---6.排序用户---\n");
	printf("---7.清空用户-----------------\n");
	printf("请选择:");
}
int findname(txl* txl,char name[])
{
	for (int i = 0; i<txl->capacity; i++)
	{
		if (strcmp(name, txl->data[i].name) == 0)
		{
			return i;
		}
		
	 }return -10;
}
void init(txl* txl)
{
	//静态版本
	//txl->capacity = 0;
	//memset(txl->data, 0, sizeof(txl->data));
	//动态版本
	txl->capacity = 0;	
	txl->count = ORIGINAL;
	txl->data =(member*)calloc(ORIGINAL, sizeof(member));
	if (txl->data == NULL)
	{
		printf("%s", strerror(errno));
	}
}
void add(txl* txl)
{
	if (txl->capacity == txl->count)
	{
		//静态版本
		//printf("人数已满,无法添加");
		//动态版本
		member * ptr = (member*)realloc(txl->data, (txl->capacity+INC)*sizeof(member));
		if (ptr != NULL)
		{
			txl->data = ptr;		
			txl->count += INC;
		}
	}
	printf("请输入姓名:");
	scanf("%s", txl->data[txl->capacity].name);
	printf("请输入性别:");
	scanf("%s", txl->data[txl->capacity].sex);
	printf("请输入年龄:");
	scanf("%d", &(txl->data[txl->capacity].age));
	printf("请输入电话:");
	scanf("%s", txl->data[txl->capacity].phone);
	printf("请输入地址:");
	scanf("%s", txl->data[txl->capacity].address);
	printf("添加成功!");
	txl->capacity++;
}
void del(txl* txl)
{
	member tmp;
	char name[NAME] = { 0 };
	printf("请输入要删除的联系人姓名:");
	scanf("%s",name);
	int i = findname(txl,name);
	if (i!=-10)
	{
		for (int i = findname(txl, name); i < txl->capacity - 1; i++)
		{
			tmp = txl->data[i];
			txl->data[i] = txl->data[i + 1];
			txl->data[i + 1] = tmp;
		}
		txl->capacity--;
		printf("删除成功!");
	}
	else
	{
		printf("联系人不存在!");
	}
}
void search(txl* txl)
{
	char name[NAME] = { 0 };
	printf("请输入要查找的联系人姓名:");
	scanf("%s", name);
	int i = findname(txl, name);
	if (i != -1)
	{
		printf("%-5s%-5s%-5s%-15s%-15s", "姓名", "性别", "年龄", "电话", "地址");
		putchar('\n');
		printf("%-5s%-6s%-5d%-15s%-15s", txl->data[i].name, txl->data[i].sex, txl->data[i].age, txl->data[i].phone, txl->data[i].address);
	}
	else
	{
		printf("联系人不存在!");
	}
}
void modify(txl* txl)
{
	char name[NAME] = { 0 };
	printf("请输入要修改的联系人姓名:");
	scanf("%s", name);
	int i = findname(txl, name);
	if (i != -1)
	{
		printf("请输入姓名:");
		scanf("%s", txl->data[i].name);
		printf("请输入性别:");
		scanf("%s", txl->data[i].sex);
		printf("请输入年龄:");
		scanf("%d", &(txl->data[i].age));
		printf("请输入电话:");
		scanf("%s", txl->data[i].phone);
		printf("请输入地址:");
		scanf("%s", txl->data[i].address);
		printf("修改成功!");
	}
	else
	{
		printf("联系人不存在!");
	}
}
void show(txl* txl)
{
	printf("%-5s%-5s%-5s%-15s%-15s", "姓名", "性别", "年龄", "电话", "地址");
	putchar('\n');
	for (int i = 0; i < txl->capacity; i++)
	{
		printf("%-5s%-6s%-5d%-15s%-15s",txl->data[i].name,txl->data[i].sex, txl->data[i].age, txl->data[i].phone, txl->data[i].address);
		putchar('\n');
   }
}
void sort(txl* txl)
{
	int input = 0;
	member tmp;
	printf("--1.按人名排序-2.按年龄排序--");
	putchar('\n');
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		for (int i = 0; i < txl->capacity-1; i++)
		{
			for (int j = i; j < txl->capacity; j++)
			{
				if (strcmp(txl->data[i].name, txl->data[j].name) > 0)
				{
					tmp = txl->data[i];
					txl->data[i] = txl->data[j];
					txl->data[j] = tmp;
				}
			}
		}
		printf("排序成功!");
		break;
	case 2:
		for (int i = 0; i < txl->capacity - 1; i++)
		{
			for (int j = i; j < txl->capacity; j++)
			{
				if (txl->data[i].age>txl->data[j].age)
				{
					tmp = txl->data[i];
					txl->data[i] = txl->data[j];
					txl->data[j] = tmp;
				}
			}
		}
		printf("排序成功!");
		break;
	}
}
void destory(txl* txl)
{
	free(txl->data);
	txl->data = NULL;
	printf("销毁成功!");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值