简易电话簿实现二(动态)
来源:互联网 发布: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;}
阅读全文
0 0
- 简易电话簿实现二(动态)
- 简易电话簿实现一(静态)
- 简易电话簿
- 课程设计--简易电话簿
- 简易动态进度条实现
- C# 小程序之新手练习(二)简单电话簿
- IOC的一种简易实现(二)
- 一个简易的触发器实现(二)
- 实现简易的AOP框架(二)
- 结构体的应用-简易电话簿-20151115
- 电话簿
- 实现动态版本通讯录(在简易通讯录的基础上)
- 通讯录(二)----动态实现
- go语言实现设计模式(二):简易工厂
- C++ 简易string类实现(二)-引用计数
- XmlParser: 简易的 Xml 解析器的实现(二)
- (487-3279)(电话簿)
- 动态代理模式的简易实现
- 1004 n^n的末位数字
- 自定义XML
- HTML基础部分总结 -- V1.3
- Android之设置EditText光标在文字之后显示
- Bootstrap3.0学习第十八轮(JavaScript插件——下拉菜单)
- 简易电话簿实现二(动态)
- psring_Struts2_Spring3整合问题
- nginx 配置中文详解
- Android常用布局管理器总结
- [Leetcode]_30 Substring with Concatenation of All Words
- 棋盘问题
- Bootstrap3.0学习第十九轮(JavaScript插件——标签页)
- cmd中运行打包文件,可以查看报错信息
- C++ std::mem_fn