目录
近期刚学习了动态内存开辟,浅浅写一下通讯录练练手😝😁😁😁
1.主函数部分(躯干)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct eachperson//每一个人信息
{
char name[20];
char sex[10];
int age;
char telephone[20];
char address[100];
};
struct list//通讯录
{
int number;//当前联系人的个数
int capacity;//通讯录总容量
struct eachperson* data;//每个联系人的信息
}list;
int main()
{
list.number = 0;
list.capacity = 4;
struct eachperson* tem1 = (struct eachperson*)malloc(list.capacity * (sizeof(struct eachperson)));
if (tem1 == NULL)
{
printf("初始化空间失败,程序退出");
return 0;
}
list.data = tem1;//进行空间的初始化,起始空间总容量为四个练习人的信息
int n;
do
{
printf("*************请输入012345**************\n");
printf("*************0.退出********************\n");
printf("*************1.添加信息****************\n");
printf("*************2.删除信息****************\n");
printf("*************3.打印信息****************\n");
printf("*************4.查找信息****************\n");
printf("*************5.修改信息****************\n");//打印菜单
scanf("%d", &n);
switch (n)
{
case 1:
addlist(&list);//添加联系人的信息
break;
case 2:
dellist(&list);//删除指定联系人的信息
break;
case 3:
printlist(&list);//打印通讯录
break;
case 4:
searchlist(&list);//查看指定联系人的信息
break;
case 5:
modifylist(&list);//修改指定联系人的信息
break;
case 0:
printf("退出成功!!!");
break;
default:
printf("无该选项,请重新选择\n\n\n");
break;
}
} while (n);
free(list.data);//释放空间
return 0;
}
注:函数传参时,需传递通讯录的地址,方可进行原通讯录的修改
2.各个函数的实现(枝叶)
void printlist(struct list* p)//打印通讯录
{
printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < p->number; i++)
{
printf("%-10s\t", p->data[i].name);
printf("%-7s\t", p->data[i].sex);
printf("%-7d\t", p->data[i].age);
printf("%-15s\t", p->data[i].telephone);
printf("%-15s\t", p->data[i].address);
printf("\n");
}
printf("\n\n\n");
}
int findname(struct list* p, char* m)//查找联系人,若存在返回对应序号;不存在,返回-1
{
for (int i = 0; i < p->number; i++)
{
if (strcmp(p->data[i].name, m) == 0)
return i;
}
return -1;
}
void addlist(struct list* p)//添加联系人的信息
{
char pname[20];
int newcapacity;
if (p->number == p->capacity)//判断是否通讯录已满,需要扩容
{
newcapacity = 2 + p->capacity;//若通讯录已满,则再增加两个联系人的容量
struct eachperson* tem = (struct eachperson*)realloc(p->data, newcapacity * sizeof(struct eachperson));
if (tem == NULL)
{
printf("通讯录扩容失败,请重新添加联系人\n\n\n");
return;
}
p->data = tem;
p->capacity = newcapacity;
printf("通讯录已扩容\n");//提示信息
}
printf("请输入所添加人的信息>\n");
printf("请输入姓名> \n ");
scanf("%s", p->data[p->number].name);
printf("请输入性别> \n ");
scanf("%s", p->data[p->number].sex);
printf("请输入年龄> \n ");
scanf("%d", &p->data[p->number].age);
printf("请输入电话> \n ");
scanf("%s", p->data[p->number].telephone);
printf("请输入地址> \n ");
scanf("%s", p->data[p->number].address);
printf("添加成功\n");
p->number++;
printf("\n\n\n");
return;
}
void dellist(struct list* p)//删除指定联系人的信息
{
printf("请输入需删除联系人的姓名\n");
while (1)
{
char pname[20];
scanf("%s", pname);
int k = findname(&list, pname);
if (k == -1)
{
printf("所选联系人不存在,请重新输入");
}
else
{
for (int i = k; i < p->number - 1; i++)
{
p->data[i] = p->data[i + 1];
}
p->number--;
break;
}
}
printf("\n\n\n");
}
void searchlist(struct list* p)//查看指定联系人的信息
{
printf("请输入所查询联系人的姓名\n");
char pname[20];
scanf("%s", pname);
int k = findname(&list, pname);
if (k == -1)
{
printf("所查询联系人不存在\n");
}
else
{
printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-10s\t", p->data[k].name);
printf("%-7s\t", p->data[k].sex);
printf("%-7d\t", p->data[k].age);
printf("%-15s\t", p->data[k].telephone);
printf("%-15s\t", p->data[k].address);
printf("\n\n\n");
}
}
void modifylist(struct list* p)//修改指定联系人的信息
{
printf("请输入需修改联系人的姓名\n");
char pname[20];
scanf("%s", pname);
int k = findname(&list, pname);
if (k == -1)
{
printf("需修改联系人不存在\n");
}
else
{
int d;
printf("请输入所需修改的信息\n1.姓名\n2.性别\n3.年龄\n4.电话\n5.地址\n");
scanf("%d", &d);
printf("\n");
if (d == 1)
{
scanf("%s", p->data[k].name);
}
if (d == 2)
{
scanf("%s", p->data[k].sex);
}
if (d == 4)
{
scanf("%s", p->data[k].telephone);
}
if (d == 5)
{
scanf("%s", p->data[k].address);
}
if (d == 3)
{
scanf("%d", &p->data[k].age);
}
}
}
3.总代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct eachperson//每一个人信息
{
char name[20];
char sex[10];
int age;
char telephone[20];
char address[100];
};
struct list//通讯录
{
int number;//当前联系人的个数
int capacity;//通讯录总容量
struct eachperson* data;//每个联系人的信息
}list;
void printlist(struct list* p)//打印通讯录
{
printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < p->number; i++)
{
printf("%-10s\t", p->data[i].name);
printf("%-7s\t", p->data[i].sex);
printf("%-7d\t", p->data[i].age);
printf("%-15s\t", p->data[i].telephone);
printf("%-15s\t", p->data[i].address);
printf("\n");
}
printf("\n\n\n");
}
int findname(struct list* p, char* m)//查找联系人,若存在返回对应序号;不存在,返回-1
{
for (int i = 0; i < p->number; i++)
{
if (strcmp(p->data[i].name, m) == 0)
return i;
}
return -1;
}
void addlist(struct list* p)//添加联系人的信息
{
char pname[20];
int newcapacity;
if (p->number == p->capacity)//判断是否通讯录已满,需要扩容
{
newcapacity = 2 + p->capacity;//若通讯录已满,则再增加两个联系人的容量
struct eachperson* tem = (struct eachperson*)realloc(p->data, newcapacity * sizeof(struct eachperson));
if (tem == NULL)
{
printf("通讯录扩容失败,请重新添加联系人\n\n\n");
return;
}
p->data = tem;
p->capacity = newcapacity;
printf("通讯录已扩容\n");//提示信息
}
printf("请输入所添加人的信息>\n");
printf("请输入姓名> \n ");
scanf("%s", p->data[p->number].name);
printf("请输入性别> \n ");
scanf("%s", p->data[p->number].sex);
printf("请输入年龄> \n ");
scanf("%d", &p->data[p->number].age);
printf("请输入电话> \n ");
scanf("%s", p->data[p->number].telephone);
printf("请输入地址> \n ");
scanf("%s", p->data[p->number].address);
printf("添加成功\n");
p->number++;
printf("\n\n\n");
return;
}
void dellist(struct list* p)//删除指定联系人的信息
{
printf("请输入需删除联系人的姓名\n");
while (1)
{
char pname[20];
scanf("%s", pname);
int k = findname(&list, pname);
if (k == -1)
{
printf("所选联系人不存在,请重新输入");
}
else
{
for (int i = k; i < p->number - 1; i++)
{
p->data[i] = p->data[i + 1];
}
p->number--;
break;
}
}
printf("\n\n\n");
}
void searchlist(struct list* p)//查看指定联系人的信息
{
printf("请输入所查询联系人的姓名\n");
char pname[20];
scanf("%s", pname);
int k = findname(&list, pname);
if (k == -1)
{
printf("所查询联系人不存在\n");
}
else
{
printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-10s\t", p->data[k].name);
printf("%-7s\t", p->data[k].sex);
printf("%-7d\t", p->data[k].age);
printf("%-15s\t", p->data[k].telephone);
printf("%-15s\t", p->data[k].address);
printf("\n\n\n");
}
}
void modifylist(struct list* p)//修改指定联系人的信息
{
printf("请输入需修改联系人的姓名\n");
char pname[20];
scanf("%s", pname);
int k = findname(&list, pname);
if (k == -1)
{
printf("需修改联系人不存在\n");
}
else
{
int d;
printf("请输入所需修改的信息\n1.姓名\n2.性别\n3.年龄\n4.电话\n5.地址\n");
scanf("%d", &d);
printf("\n");
if (d == 1)
{
scanf("%s", p->data[k].name);
}
if (d == 2)
{
scanf("%s", p->data[k].sex);
}
if (d == 4)
{
scanf("%s", p->data[k].telephone);
}
if (d == 5)
{
scanf("%s", p->data[k].address);
}
if (d == 3)
{
scanf("%d", &p->data[k].age);
}
}
}
int main()
{
list.number = 0;
list.capacity = 4;
struct eachperson* tem1 = (struct eachperson*)malloc(list.capacity * (sizeof(struct eachperson)));
if (tem1 == NULL)
{
printf("初始化空间失败,程序退出");
return 0;
}
list.data = tem1;//进行空间的初始化,起始空间总容量为四个练习人的信息
int n;
do
{
printf("*************请输入012345**************\n");
printf("*************0.退出********************\n");
printf("*************1.添加信息****************\n");
printf("*************2.删除信息****************\n");
printf("*************3.打印信息****************\n");
printf("*************4.查找信息****************\n");
printf("*************5.修改信息****************\n");//打印菜单
scanf("%d", &n);
switch (n)
{
case 1:
addlist(&list);//添加联系人的信息
break;
case 2:
dellist(&list);//删除指定联系人的信息
break;
case 3:
printlist(&list);//打印通讯录
break;
case 4:
searchlist(&list);//查看指定联系人的信息
break;
case 5:
modifylist(&list);//修改指定联系人的信息
break;
case 0:
printf("退出成功!!!");
break;
default:
printf("无该选项,请重新选择\n\n\n");
break;
}
} while (n);
free(list.data);//释放空间
return 0;
}
代码自行取用,错误欢迎指出,😝😝😝🐻