简易电话簿实现二(动态)

来源:互联网 发布:mac 键盘符号 编辑:程序博客网 时间:2024/05/21 14:09

第一次实现电话簿我们实现了静态版本,将电话簿的大小给定,不论你用多少,都会一次性开辟很大一块空间,一旦数据存储满,那么就得重新修改电话簿大小。所以我们将代码改进,将电话簿实现为动态存储。简单的来说就是:在初始化的同时,先开辟一小块空间使用,在接下来操作的过程中,检查开辟的空间是否饱和,一旦饱和,再次追加一块空间使用。

静态存储参考简单电话簿实现一(静态)。

代码如下:


test.h

#ifndef __TEL_H__#define __TEL_H__#include <stdio.h>#include <Windows.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <assert.h>#define NAME_MAX 20#define SEX_MAX 5#define TELE_MAX 12#define ADD_MAX 20#define DEFAULT_SZ 3#define DEFAULT_INC 2typedef struct S //每个联系人的信息{char name[NAME_MAX];char sex[SEX_MAX];int age;char telenum[TELE_MAX];char address[ADD_MAX];}People;typedef struct C{People *Book;int count;int capacity; //电话本容量,若人数超过此容量,则再动态开辟}PCON,*Pcon;void menu();//菜单void Inittel(Pcon pcon);//初始化void Check_Mem(Pcon pcon); // 检查空间void Add(Pcon pcon); //添加联系人信息void Delete(Pcon pcon);//删除指定联系人信息void Search(Pcon pcon);//查找指定联系人信息void Change(Pcon pcon);//修改指定联系人信息void All_print(Pcon pcon);//显示所有联系人信息void All_delete(Pcon pcon);//清空所有联系人void Name_sort(Pcon pcon);//按名字排序void Exit(Pcon pcon);//退出并释放内存空间#endif // !__TEL_H__


tele.c(各功能实现)

#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"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");printf("******************************\n");}void Inittel(Pcon pcon)//初始化{assert(pcon);pcon->Book = malloc(DEFAULT_SZ * sizeof(People));if (pcon->Book == NULL){printf("%s\n", strerror(errno));return;}pcon->capacity += DEFAULT_SZ;pcon->count= 0;}void Check_Mem(Pcon pcon) //检查空间{if (pcon->capacity == pcon->count){People *tmp = realloc(pcon->Book, sizeof(People)*(pcon->capacity + DEFAULT_INC));if (tmp == NULL){printf("%s\n", strerror(errno));return;}elsepcon->Book = tmp;pcon->capacity += DEFAULT_INC;} }//查找判断int search(Pcon pcon,char* name){int i = 0;for (i = 0; i < pcon->count; i++){if (strcmp(pcon->Book[i].name, name) == 0)return i;}return -1;}//显示信息void All_print(Pcon pcon){printf("%10s%5s%5s%11s%20s\n", "名字", "性别", "年龄", "电话", "地址");int i = 0;for (i = 0; i < pcon->count; i++){printf("%10s%5s%5d%11s%20s\n",pcon->Book[i].name,pcon->Book[i].sex,pcon->Book[i].age,pcon->Book[i].telenum,pcon->Book[i].address);}}//增加void Add(Pcon pcon){Check_Mem(pcon);printf("请输入姓名:    \t");scanf("%s", pcon->Book[pcon->count].name);printf("请输入性别:    \t");scanf("%s", pcon->Book[pcon->count].sex);printf("请输入年龄:    \t");scanf("%d", &pcon->Book[pcon->count].age);printf("请输入电话号码:\t");scanf("%s", pcon->Book[pcon->count].telenum);printf("请输入地址:    \t");scanf("%s", pcon->Book[pcon->count].address);pcon->count++;printf("添加成功 \n");}//删除指定人信息void Delete(Pcon pcon){int i = 0;int choice = 0;char name[NAME_MAX] = { 0 };printf("请输入你要删除人的姓名:\n");scanf("%s", name);int ret = search(pcon, name);if (ret == -1){printf("删除失败没找到\n");}else{printf("确定你的选择:输入1完成删除,输入2返回\n");scanf("%d", &choice);if (choice == 1){for (i = ret; i < pcon->count - 1; i++){pcon->Book[i] = pcon->Book[i + 1];}printf("删除成功\n");pcon->count--;}else if (choice == 2)return;}}//查找指定人信息void Search(Pcon pcon){char name[NAME_MAX];printf("请输入你要查找人的名字:\n");scanf("%s", name);int ret = search(pcon, name);if (ret == -1){printf("没找到\n");return;}else{printf("%10s%5s%5s%11s%20s\n", "名字", "性别", "年龄", "电话", "地址");printf("%10s%5s%5d%11s%20s\n", pcon->Book[ret].name, pcon->Book[ret].sex,pcon->Book[ret].age, pcon->Book[ret].telenum,pcon->Book[ret].address);}}//修改void Change(Pcon pcon){char name[NAME_MAX];printf("请输入你要修改人的名字:\n");scanf("%s", name);int ret = search(pcon, name);if (ret == -1){printf("没找到要修改人的信息\n");return;}else{printf("请输入姓名:    \t");scanf("%s", pcon->Book[ret].name);printf("请输入性别:    \t");scanf("%s", pcon->Book[ret].sex);printf("请输入年龄:    \t");scanf("%d", &pcon->Book[ret].age);printf("请输入电话号码:\t");scanf("%s", pcon->Book[ret].telenum);printf("请输入地址:    \t");scanf("%s", pcon->Book[ret].address);printf("修改完成\n");}}//按名字排序void Name_sort(Pcon pcon){int i = 0;int j = 0;for (i = 0; i < pcon->count - 1; i++){for (j = 0; j < pcon->count - i - 1; j++){if (strcmp(pcon->Book[j].name,pcon->Book[j + 1].name) > 0){People tmp = pcon->Book[j];pcon->Book[j] = pcon->Book[j + 1];pcon->Book[j + 1] = tmp;}}}printf("排序成功!\n");}//清空void All_delete(Pcon pcon){int choice = 0;printf("确定删除?1.yes 2.no\n");scanf("%d", &choice);if (choice == 1){pcon->count = 0;printf("清空成功");}elsereturn;}void Exit(Pcon pcon){free(pcon->Book);pcon->Book = NULL;printf("正在退出...\n");}


test.c


#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"void test(){int input = 0;PCON con;Inittel(&con);do{menu();printf("请选择你的操作>:");scanf("%d",&input);switch (input){case 1:Add(&con); //添加联系人信息break;case 2:Delete(&con);//删除指定联系人信息break;case 3:Search(&con);//查找指定联系人信息break;case 4:Change(&con);//修改指定联系人信息break;case 5:All_print(&con);//显示所有联系人信息break;case 6:All_delete(&con);//清空所有联系人break;case 7:Name_sort(&con);//按名字排序break;case 0:Exit(&con);break;default:printf("选择错误请重新选择- - :");break;}} while (input);}int main(){test();system("pause");return 0;}