通过动态分配结构体实现通讯录

#define _CRT_SECURE_NO_WARNINGS 1
/*实现一个通讯录;


通讯录可以用来存储1000个人的信息,每个人的信息包括:


姓名、性别、年龄、电话、住址






提供方法:


1.添加联系人信息


2.删除指定联系人信息


3.查找指定联系人信息


4.修改指定联系人信息


5.显示所有联系人信息


6.清空所有联系人


7.以名字排序所有联系人*/


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


typedef struct People
{
char name[20];
char sex[5];
int age;
int tel[11];
char add[50];


}People;


typedef struct Clist
{
People *a;
int count;
int capacity;
};
void Init_Clist(Clist *P)
{
P->count = 0;
P->a = (People *)malloc(sizeof(People)* 3);
memset(P->a, 0, sizeof(People)* 3);
P->capacity = 3;
}
void check_Clist(Clist *P)
{
if (P->count <= P->capacity)
{
P->a = (People*)realloc(P->a, sizeof(People)* 3);
P->capacity = P->capacity + 3;
}
}
int rearch(Clist *L, char *name)


{


int ret = 0;
int i = 0;
for (; i < (L->count); i++)
{
if (strcmp(L->a[i].name, name) == 0)


return i;
}
return -1;//没找到相同的名字
}
void add_peo(Clist *P)//增加联系人信息
{


        check_Clist(P);
printf("请输入要添加的联系人姓名\n");


scanf("%s", &P->a[P->count].name);


printf("请输入要添加的联系人的性别\n");


scanf("%s", &P->a[P->count].sex);


printf("请输入要添加的联系人的年龄\n");


scanf("%d", &P->a[P->count].age);


printf("请输入要添加的联系人的手机号\n");


scanf("%s", &P->a[P->count].tel);


printf("请输入要添加的联系人的地址\n");


scanf("%s", &P->a[P->count].add);


P->count++;


printf("联系人数据添加成功\n");

}
void del_peo(Clist *L)//删除指定联系人信息


{
char name[20];
int ret = 0;
int i = 0;
printf("请输入你想要删除的联系人的姓名\n");
scanf("%s", &name);
ret = rearch(L, name);
if (ret == -1)
{
printf("想要删除的联系人不存在\n");
}
else
{
for (i = ret; i <= L->count; i++)
{
L->a[i] = L->a[i + 1];
}
printf("删除成功\n");
}
L->count--;
}


void ser_peo(Clist *L)//查找指定联系人信息


{


char name[20];


int ret = 0;


int i = 0;


printf("请输入你想要删除的联系人的姓名\n");


scanf("%s", &name);


ret = rearch(L, name);


if (ret == -1)


{


printf("您查找的联系人不存在\n");


}


else


{


printf("联系人姓名%s\n", L->a[ret].name);


printf("联系人性别%s\n", L->a[ret].sex);


printf("联系人年龄%d\n", L->a[ret].age);


printf("联系人手机号%s\n", L->a[ret].tel);


printf("联系人地址%s\n", L->a[ret].add);






}


}




void mod_peo(Clist *L)//修改指定联系人信息


{


char name[20];


int ret = 0;


int i = 0;


printf("请输入你想要删除的联系人的姓名\n");


scanf("%s", &name);


ret = rearch(L, name);


if (ret == -1)


{


printf("您查找的联系人不存在\n");


}


else


{


printf("请输入要修改的联系人姓名\n");


scanf("%s", &L->a[ret].name);


printf("请输入要修改的联系人的性别\n");


scanf("%s", &L->a[ret].sex);


printf("请输入要修改的联系人的年龄\n");


scanf("%d", &L->a[ret].age);


printf("请输入要修改的联系人的手机号\n");


scanf("%s", &L->a[ret].tel);


printf("请输入要修改的联系人的地址\n");


scanf("%s", &L->a[ret].add);


printf("联系人数据修改成功成功\n");


}


}




void pri_peo(Clist *L)//显示所有联系人信息


{


int i = 0;


for (; i < L->count; i++)


{


printf("第%d个联系人信息:\n", i + 1);


printf("联系人姓名%s\n", L->a[i].name);


printf("联系人性别%s\n", L->a[i].sex);


printf("联系人年龄%d\n", L->a[i].age);


printf("联系人手机号%s\n", L->a[i].tel);


printf("联系人地址%s\n", L->a[i].add);


printf("\n");


}


}






void emp_peo(Clist *L)//.清空联系人信息


{


L->count = 0;


return;


}
void menu()


{


printf("            欢迎使用通讯录            \n");


printf("**********1.添加联系人信息************\n");


printf("********2.删除指定联系人信息**********\n");


printf("********3.查找指定联系人信息**********\n");


printf("********4.修改指定联系人信息**********\n");


printf("********5.显示所有联系人信息**********\n");


printf("**********6.清空联系人信息************\n");


printf("******7.以名字排序所有联系人信********\n");


printf("****** 0.退出当前通讯录系统 ********\n");


}


int main()


{


Clist L;
Init_Clist(&L);


menu();


int n = 0;


printf("请选择您所要进行的操作\n");


scanf("%d", &n);


while (n)


{






switch (n)


{


case 0:


return 0;


case 1:


add_peo(&L);


break;


case 2:


del_peo(&L);


break;


case 3:


ser_peo(&L);


break;


case 4:


mod_peo(&L);


break;


case 5:


pri_peo(&L);


break;


case 6:


emp_peo(&L);


break;


case 7:


//sort_peo(&L);


break;


default:


printf("输入参数错误\n");


}


printf("\n");


menu();


printf("请选择您所要进行的操作\n");


scanf("%d", &n);






}

}

这里和之前的普通结构体通讯录区别不大甚至很多函数都是一模一样的,只是需要在结构体中添加一个当前空间变量,知道你现在的结构体能放下多少个通讯里,然后在添加之前需要将你现在有的空间和已经占有的空间进行比较,如果你现在拥有的空间等于你使用的空间的话,这时候你就需要再增加一些空间来进行存储。然后每次分配了空间之后要对空间大小变量进行更改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值