“`C
#define _CRT_SECURE_NO_WARNINGS
#include “stdio.h”
#include “stdlib.h”
#include “string.h”
struct people {
char name[30];
char sex[10];
char telephone[20];
};
typedef struct people st_people;
struct list {
int size;//通讯录已经有多少个人
int capacity;//通讯录一共能放下多少个人
st_people* arr;//定义一个st_people类型的结构体数组arr[10],zrr[0]存放第一个学生的相关信息
};
typedef struct list st_list;
void Show_list(st_list my_list);
st_list Init_dyn_list(void);
st_list first_scanf_list(st_list my_list);
void query_dyn_list(st_list my_list);
st_list modify_dyn_arr(st_list my_list);//改
st_list insert_last_dyn_arr(st_list my_list);//末尾插入
st_list insert_data_dyn_list(st_list my_list);//插入
st_list delate_last_dyn_arr(st_list my_list);//末尾删
st_list delate_all_dyn_arr(st_list my_list);//全部删
st_list delete_index_dyn_arr(st_list my_list);//删除指定位
void menu();//打印菜单
void update_list_to_file(st_list my_list);//更新通讯录到文件中
st_list readin_file_to_list(st_list my_list);//读取文件到通讯录中
int main()//主函数
{
st_list my_list = Init_dyn_list();
int select ;
do {
menu();
scanf(“%d”, &select);
switch (select)
{
case 0:return 0;
case 1: my_list = first_scanf_list(my_list); update_list_to_file(my_list); Show_list(my_list); system(“pause”); system(“cls”); break;
case 2:Show_list(my_list); update_list_to_file(my_list); system(“pause”); system(“cls”); break;
case 3:query_dyn_list(my_list); update_list_to_file(my_list); system(“pause”); system(“cls”); break;
case 4:my_list = modify_dyn_arr(my_list); update_list_to_file(my_list); Show_list(my_list); system(“pause”); system(“cls”); break;
case 5:my_list = insert_last_dyn_arr(my_list); update_list_to_file(my_list); Show_list(my_list); system(“pause”); system(“cls”); break;
case 6:my_list = insert_data_dyn_list(my_list); update_list_to_file(my_list); Show_list(my_list); system(“pause”); system(“cls”); break;
case 7:my_list = delate_last_dyn_arr(my_list); update_list_to_file(my_list); Show_list(my_list); system(“pause”); system(“cls”); break;
case 8:my_list = my_list = delete_index_dyn_arr(my_list); update_list_to_file(my_list); Show_list(my_list); system(“pause”); system(“cls”); break;
case 9:my_list = delate_last_dyn_arr(my_list); update_list_to_file(my_list); Show_list(my_list); system(“pause”); system(“cls”); break;
case 10:my_list = readin_file_to_list(my_list); update_list_to_file(my_list); system(“pause”); system(“cls”); break;
default:printf(“输入错误\n”); system(“pause”); system(“cls”); break;
}
} while (select);
free(my_list.arr);
}
void Show_list(st_list my_list)//展示通讯录函数
{
printf(“*****************通讯录****************************\n”);
printf(” %10s%10s%20s\n”, “姓名”, “性别”, “电话号码”);
for (int i = 0; i < my_list.size; i++)
{
printf("第%2d 个同学:%10s%10s%20s\n", i + 1, my_list.arr[i].name, my_list.arr[i].sex, my_list.arr[i].telephone);
}
printf("**************************************************\n");
}
st_list Init_dyn_list(void) //初始化函数
{
st_people temp[50] = {
{"","",""}
};
st_list my_list;
int size = 5;
st_people* tmp1 = malloc(sizeof(st_people) * size * 2);//申请一块内存,地址赋给tmp1指针
memcpy(tmp1, &temp, sizeof(st_people) * size);
my_list.arr = tmp1;
my_list.size = size;
my_list.capacity = my_list.size * 2;
return my_list;
}
st_list first_scanf_list(st_list my_list)//初输入函数
{
printf("您准备先录入几个数据");
scanf("%d", &my_list.size);
for (int i = 0; i < my_list.size; i++)
{
printf("请输入第 %d 个同学的姓名,性别,电话(用空格分隔):", i + 1);
scanf("%s %s %s", &my_list.arr[i].name, &my_list.arr[i].sex, &my_list.arr[i].telephone);
}
return my_list;
}
void query_dyn_list(st_list my_list)//查指定位函数
{
int index;
printf("您要查询第几个同学的信息?");
scanf("%d", &index);
printf("您要查询的第%d个同学信息如下:姓名为:%s,性别为:%s,电话号码为:%s\n", index, my_list.arr[index - 1].name, my_list.arr[index - 1].sex, my_list.arr[index - 1].telephone);
}
st_list modify_dyn_arr(st_list my_list)//改
{
int index;
printf("您要改第几个同学的信息?");
scanf("%d", &index);
printf("请输入第 %d 个同学的姓名,性别,电话(用空格分隔):", index);
scanf("%s %s %s", &my_list.arr[index - 1].name, &my_list.arr[index - 1].sex, &my_list.arr[index - 1].telephone);
return (my_list);
}
st_list insert_last_dyn_arr(st_list my_list)//末尾插入
{
int size = my_list.size;
int capcaity = my_list.capacity;
if (size < capcaity)
{
printf("请输入末尾插入的同学的姓名,性别,电话(用空格分隔):");
scanf("%s %s %s", &my_list.arr[size].name, &my_list.arr[size].sex, &my_list.arr[size].telephone);
}
else if (size == capcaity)
{
int* tmp2 = malloc(sizeof(st_people)*capcaity * 2);
memcpy(tmp2, my_list.arr, sizeof(st_people)*size);
free(my_list.arr);
my_list.arr = tmp2;
my_list.capacity = capcaity * 2;
printf("请输入末尾插入的同学的姓名,性别,电话(用空格分隔):");
scanf("%s %s %s", &my_list.arr[size].name, &my_list.arr[size].sex, &my_list.arr[size].telephone);
}
(my_list.size)++;
return(my_list);
}
st_list insert_data_dyn_list(st_list my_list)//中间插入
{
int index ;
printf("您要加入第几个同学的信息?");
scanf("%d", &index);
int size = my_list.size;
int capcaity = my_list.capacity;
if (size < capcaity)//
{
memmove(my_list.arr + index , my_list.arr + index-1, sizeof(st_people)*(size - index+1));
printf("要插入的同学的姓名,性别,电话(用空格分隔):");
scanf("%s %s %s", &my_list.arr[index-1].name, &my_list.arr[index - 1].sex, &my_list.arr[index - 1].telephone);
}
else if (size == capcaity)
{
int* tmp2 = malloc(sizeof(st_people)*capcaity * 2);
memcpy(tmp2, my_list.arr, sizeof(st_people)*size);
free(my_list.arr);
my_list.arr = tmp2;
my_list.capacity = capcaity * 2;
memmove(my_list.arr + index, my_list.arr + index - 1, sizeof(st_people)*(size - index + 1));
printf("要插入的末尾插入的同学的姓名,性别,电话(用空格分隔):");
scanf("%s %s %s", &my_list.arr[index - 1].name, &my_list.arr[index - 1].sex, &my_list.arr[index - 1].telephone);
}
(my_list.size)++;
return my_list;
}
st_list delate_last_dyn_arr(st_list my_list)//末尾删
{
my_list.size--;
return my_list;
}
st_list delate_all_dyn_arr(st_list my_list)//全部删
{
my_list.size=0;
return my_list;
}
st_list delete_index_dyn_arr(st_list my_list)//删除指定位
{
int index;
printf("您要删除第几个同学的信息?");
scanf("%d", &index);
memmove(my_list.arr + index-1, my_list.arr + index , sizeof(st_people)*(my_list.size - index ));
my_list.size--;
return my_list;
}
void menu()//打印菜单
{
printf("***********************\n");
printf("**** 0.退出通讯录 ******\n");
printf("***** 1.新建通讯录 *******\n");
printf("***** 2.展示通讯录 *******\n");
printf("***** 3.查询联系人 *******\n");
printf("******4.修改联系人 *********\n");
printf("******5.末位增加联系人 *********\n");
printf("******6.指定位增加联系人 *********\n");
printf("******7.删除末位联系人 *********\n");
printf("******8.删除指定联系人 *********\n");
printf("***** 9.清空通讯录 *******\n");
printf("***** 10.读取文件中通讯录 *******\n");
printf("***********************\n");
}
void update_list_to_file(st_list my_list)//更新通讯录到文件中
{
int path = "D:\\tongxun.txt";
remove(path);//先删掉原来文件
FILE *fp1;
fp1 = fopen("D:\\tongxun.txt", "w");
for (int i = 0; i < my_list.size; i++)
{
fprintf(fp1,"%10s%10s%20s\n", my_list.arr[i].name, my_list.arr[i].sex, my_list.arr[i].telephone);
}
fclose(fp1);
}
st_list readin_file_to_list(st_list my_list)//读取文件到通讯录中
{
FILE *fp1;
if ((fp1 = fopen("D:\\tongxun.txt", "r")) == NULL)
{
printf("读取错误"); exit;
}
else {
int i = 0;
while (!feof(fp1))
{
fscanf(fp1, "%10s%10s%20s\n", &my_list.arr[i].name, &my_list.arr[i].sex, &my_list.arr[i].telephone);
i++;
my_list.size = i;
}
printf("读取成功");
Show_list(my_list);
}
return my_list;
}
```