通讯录动态版本
一.何为动态版本?
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("销毁成功!");
}