大家在编写动态通讯录之前,我希望大家能够了解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); }