大家在编写动态通讯录之前,我希望大家能够了解malloc和realloc的用法:https://blog.csdn.net/cdatreides/article/details/80522095
希望大家能够通过我的这篇博客了解malloc和realloc
头文件:
#ifndef __CONTACT_H__ //防止头文件的重复引用
#define __CONTACT_H__
#endif
#define NAME_NUM 20
#define SEX_NUM 5
#define TELE_NUM 20
#define ADDR_NUM 30
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct Peo//定义个人信息
{
char name[NAME_NUM];
int age;
char sex[SEX_NUM];
char tele[TELE_NUM];
char addr[ADDR_NUM];
}Peo;
typedef struct Concact
{
Peo *data;//指向动态开辟的空间
int sz;//人数
int v;//容量
}Contact, *pContact;
enum ss
{
Exit,
Add,
Del,
Search,
Change,
Show,
Sort,
Clear,
};
void InitContact(pContact pcon);
void AddContact(pContact pcon);
void DelContact(pContact pcon);
void SearchContact(pContact pcon);
void ChangeContact(pContact pcon);
void ShowContact(pContact pcon);
void SortContact(pContact pcon);
void ClearContact(pContact pcon);
void DestroyContact(pContact pcon);
contact.c:
#include"contact.h"
void InitContact(pContact pcon)//初始化
{
pcon->sz = 0;
pcon->data = malloc(2*sizeof(Peo));//data是malloc动态开辟的内存
if (pcon->data == NULL)//判断是否开辟成功
{
perror("use malloc");
exit(EXIT_FAILURE);//若开辟失败,立即退出
}
memset(pcon->data, 0,2*sizeof(Peo));
pcon->v = 2;//目前的容量即为设置好的,为以后的增容做准备
}
void Checkcontact(pContact pcon)//检查容量
{
if (pcon->sz == pcon->v)
{
Peo *ps = realloc(pcon->data, (pcon->v + 2)*sizeof(Peo));
if (ps == NULL)//判断是否为空
{
perror("use malloc");
exit(EXIT_FAILURE);//开辟失败,立即退出
}
else
{
pcon->data = ps;
}
pcon->v += 2;
printf("增容成功\n");
}
}
void AddContact(pContact pcon)
{
assert(pcon->data);
Checkcontact(pcon);//检查容量
printf("输入姓名:");
scanf("%s", pcon->data[pcon->sz].name);
printf("输入年龄:");
scanf("%d", &pcon->data[pcon->sz].age);
printf("输入性别:");
scanf("%s", pcon->data[pcon->sz].sex);
printf("输入电话:");
scanf("%s", pcon->data[pcon->sz].tele);
printf("输入地址:");
scanf("%s", pcon->data[pcon->sz].addr);
pcon->sz++;
printf("添加成功\n");
}
int FindContact(pContact pcon, char name[])//发现
{
int i;
for (i = 0; i < pcon->data; i++)
{
if (strcmp(pcon->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(pContact pcon)//删除
{
char name[NAME_NUM];
printf("输入你要del的名字:");
scanf("%s", name);
int ret=FindContact(pcon, name);
if (ret == -1)
{
printf("你删的不在\n");
return;
}
else
{
int i;
for (i = ret; i < pcon->sz; i++)
{
pcon->data[i] = pcon->data[i + 1];
}
pcon->sz--;
printf("删除成功\n");
}
}
void SearchContact(pContact pcon)//寻找
{
char name[NAME_NUM];
printf("请输入要查询的姓名: ");
scanf("%s", name);
int ret = 0;
ret = FindContact(pcon, name);
if (ret == -1)
{
printf("你要查询的人不存在\n");
return;
}
else
{
printf("姓名:%10s\t性别:%5s\t年龄:%5d\t电话:%10s\t住址:%15s\n", pcon->data[ret].name,
pcon->data[ret].sex,
pcon->data[ret].age,
pcon->data[ret].tele,
pcon->data[ret].addr);
}
}
void ChangeContact(pContact pcon)//修改信息
{
char name[NAME_NUM];
printf("请输入要修改的除联系人\n");
scanf("%s", name);
int ret = 0;
ret = FindContact(pcon, name);
if (ret != -1)
{
printf("请输入修改后的姓名: ");
scanf("%s", pcon->data[ret].name);
printf("请输入修改后的性别: ");
scanf("%s", pcon->data[ret].sex);
printf("请输入修改后的年龄: ");
scanf("%d", &pcon->data[ret].age);
printf("请输入修改后的电话: ");
scanf("%s", pcon->data[ret].tele);
printf("请输入修改后的地址: ");
scanf("%s", pcon->data[ret].addr);
printf("修改完毕\n");
}
else
{
printf("要修改的联系人不存在!\n");
}
}
void ShowContact(pContact pcon)
{
printf("联系人信息:\n");
int i = 0;
printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pcon->sz; i++)
{
printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
pcon->data[i].sex,
pcon->data[i].age,
pcon->data[i].tele,
pcon->data[i].addr);
}
}
void SortContact(pContact pcon)
{
int i = 0;
int j = 0;
for (i = 0; i < pcon->sz - 1; i++)//冒泡排序
{
for (j = 1; j < pcon->sz - i - 1; j++)
{
if (strcmp(pcon->data[i].name, pcon->data[i + 1].name)<0)
{
char tem[NAME_NUM];
strcpy(tem, pcon->data[i].name);
strcpy(pcon->data[i].name, pcon->data[i + 1].name);
strcpy(pcon->data[i].name,tem);
}
}
}
printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pcon->sz; i++)
{
printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
pcon->data[i].sex,
pcon->data[i].age,
pcon->data[i].tele,
pcon->data[i].addr);
}
printf("排序完成\n");
}
void ClearContact(pContact pcon)//清除
{
pcon->sz = 0;
}
void DestroyContact(pContact pcon)//销毁
{
free(pcon->data);
pcon->data = NULL;
pcon->sz = 0;
pcon->v = 0;
}
main.c:
#include"contact.h"
void menu()
{
printf("*********************************\n");
printf("*** 1. Add 2. Del ***\n");
printf("*** 3.Search 4.Change***\n");
printf("*** 5. Show 6.Sort ***\n");
printf("*** 7.Clear 0.Exit ***\n");
printf("*********************************\n");
printf(" \n");
}
int main()
{
Contact my_ps;
InitContact(&my_ps);//初始化
int i;
do{
menu();
printf("请选择>;");
scanf("%d", &i);
switch(i)
{
case 1:AddContact(&my_ps);
break;
case 2:DelContact(&my_ps);
break;
case 3:SearchContact(&my_ps);
break;
case 4:ChangeContact(&my_ps);
break;
case 5:ShowContact(&my_ps);
break;
case 6:SortContact(&my_ps);
break;
case 7:ClearContact(&my_ps);
break;
case 0:DestroyContact(&my_ps);
exit(0);
break;
default:printf("输入错误,重新选择\n");
break;
}
} while (1);
}