通讯录动态版本
来源:互联网 发布:淘宝运费险怎么赔付25 编辑:程序博客网 时间:2024/06/10 23:11
这个就是在静态的基础上稍加改进 让它的空间具有可变性,用多少空间申请多少空间,不会浪费空间,大大改善了代码
1、头文件contact.h
#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAX_NAME 20#define MAX_SEX 5#define MAX_TELE 13#define MAX_ADDRESS 50#define INIT_SIZE 2//初始大小#define SIZE 2//每次申请的空间大小struct contact{ char name[MAX_NAME]; char sex[MAX_SEX]; int age; char tele[MAX_TELE]; char address[MAX_ADDRESS];};struct MyStruct{ struct contact *arr; int i; int sz;};enum { EXIT, ADD, DELETE, SEARCH, MOD, PRINT_CONTACT, CLEAR_CONTACT, SORT};void Add(struct MyStruct *p);int Search_Place(struct MyStruct *p);void Delete(struct MyStruct *p);void Search(struct MyStruct *p);void Mod(struct MyStruct *p);void Init_Contact(struct MyStruct *p);void Print_Contact(struct MyStruct *p);void Clear_Contact(struct MyStruct *p);void Sort(struct MyStruct *p);void Menu();
2、实现代码contact.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"void Init_Contact(struct MyStruct *p)//对结构体成员进行初始化{ p->i = 0; p->arr = (struct contact *)malloc(sizeof(struct contact) * INIT_SIZE); if (p->arr == NULL) { printf("开辟失败"); } memset(p->arr, 0, INIT_SIZE*sizeof(struct MyStruct));//这个就是将结构体数组全部初始化为0 p->sz = INIT_SIZE;}void Check(struct MyStruct *p){ if (p->sz ==p->i)//判断是否需要申请空间 { struct contact *ptr = (struct contact *)realloc(p->arr, SIZE*sizeof(struct contact));//realloc申请的空间已经初始化了 if (ptr == NULL) { printf("动态开辟失败"); exit(1); } p->arr = ptr; p->sz += SIZE; }}void Add(struct MyStruct *p){ printf("录入联系人信息\n"); printf("请录入联系人姓名:"); scanf("%s", p->arr[p->i].name); printf("\n请录入联系人性别:"); scanf("%s", p->arr[p->i].sex); printf("\n请录入联系人年龄:"); scanf("%d", &p->arr[p->i].age); printf("\n请录入联系人电话:"); scanf("%s", p->arr[p->i].tele); printf("\n请录入联系人住址:"); scanf("%s", p->arr[p->i].address); p->i++; printf("\n联系人信息录入完毕\n");}int find_place(struct MyStruct *p){ char name[MAX_NAME]; printf("请输入姓名:"); scanf("%s", name); for (int i = 0; i < p->i; i++) { if (strcmp(p->arr[i].name, name) == 0)//利用strcmp对字符串的比较来找位置 { return i; } } return -1;}void Delete(struct MyStruct *p){ if (p->i > 0) { printf("删除联系人\n"); int ret = find_place(p); if (ret != -1) { for (int i = ret; i < p->i - 1; i++)//要让删除位置之后的都向前移动一位 { p->arr[i] = p->arr[i + 1]; } p->i--;//让总数组长度减1 printf("删除完毕\n"); } else { printf("未找到此联系人\n"); } } else { printf("通讯录中无联系人"); }}void Search(struct MyStruct *p){ int ret = find_place(p); if (ret != -1) { printf("姓名:%s 性别:%s 年龄:%d 电话:%s 住址:%s\n", p->arr[ret].name, p->arr[ret].sex, p->arr[ret].age, p->arr[ret].tele, p->arr[ret].address); } else printf("未找到此联系人");}void Mod(struct MyStruct *p){ printf("修改个人信息:\n"); int ret = find_place(p); if (ret != -1) { printf("请输入联系人姓名:"); scanf("%s", p->arr[ret].name); printf("\n请录入联系人性别:"); scanf("%s", p->arr[ret].sex); printf("\n请录入联系人年龄:"); scanf("%d", &p->arr[ret].age); printf("\n请录入联系人电话:"); scanf("%s", p->arr[ret].tele); printf("\n请录入联系人住址:"); scanf("%s", p->arr[ret].address); printf("修改完毕\n"); } else { printf("未找到此联系人"); }}void Sort(struct MyStruct *p){ //简单的冒泡排序算法运用 for (int i = 0; i < p->i - 1; i++) { for (int j = 0; j < (p->i - 1 - i); j++) { if (strcmp(p->arr[i].name, p->arr[j].name) < 0) { struct contact tem;//定义一个结构体类型变量 tem = p->arr[i]; p->arr[i] = p->arr[j]; p->arr[j] = tem; } } } printf("\n排序完成\n");}void Print_Contact(struct MyStruct *p){ if (p->i > 0) { printf("\n联系人信息:\n"); int i = 0; for (i = 0; i < p->i; i++) { printf("姓名:%s 性别:%s 年龄:%d 电话:%s 住址:%s\n", p->arr[i].name, p->arr[i].sex, p->arr[i].age, p->arr[i].tele, p->arr[i].address); } } else { printf("通讯录中无联系人"); }}void Clear_Contact(struct MyStruct *p){ p->i = 0;}void Menu(){ printf("\n ***1 添加联系人信息 ***\n"); printf(" ***2 删除联系人信息 ***\n"); printf(" ***3 查找联系人信息 ***\n"); printf(" ***4 修改联系人信息 ***\n"); printf(" ***5 显示联系人信息 ***\n"); printf(" ***6 清空联系人信息 ***\n"); printf(" ***7 以名字排序联系人 ***\n"); printf(" ***0 退 出 通 讯 录 ***\n");}
3、测试代码test.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"void Test(){ struct MyStruct p; int input = 1; Init_Contact(&p); //这里一定要注意要用地址传递的方式,要不然在不能改变数组内的信息,具体为什么就不一一说了 while (input) //另建议结构体传参时,尽量用地址传递,因为一般地址传递都比值传递的效率高 { Menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case ADD: Add(&p); break; case DELETE: Delete(&p); break; case SEARCH: Search(&p); break; case MOD: Mod(&p); break; case PRINT_CONTACT: Print_Contact(&p); break; case CLEAR_CONTACT: Clear_Contact(&p); break; case SORT: Sort(&p); break; case EXIT: break; default: break; } }}int main(){ Test(); system("pause"); return 0;}
0 0
- 通讯录动态版本
- 通讯录(动态版本)
- 通讯录动态开辟版本
- 通讯录动态版本
- 通讯录--动态版本
- 实现动态版本通讯录(在简易通讯录的基础上)
- 动态的文件版本的通讯录
- c语言实现动态版本通讯录
- 静态通讯录、动态通讯录
- 通讯录小项目(C语言动态版本)
- 【C语言】通讯录:动态开辟内存版和文件版本
- 动态通讯录
- 动态通讯录
- 动态通讯录
- 动态通讯录
- 动态通讯录
- 动态通讯录
- 通讯录.动态
- bzoj3223: Tyvj 1729 文艺平衡树
- 桶排序 -- 相邻最大差值,Maximum Gap(leetcode)
- Struts2中是用拦截器拦截黑名单的demo
- 删除目录及目录里面的文件
- 5W2H七何分析法
- 通讯录动态版本
- Java enum的用法详解
- app引导页(背景图片切换加各个页面动画效果)
- C++ 通过虚函数表,直接外部访问类中的函数,并且脱离类
- 内存字节转成字符串打印
- 大量的QT控件及示例发放
- Android中TextView不获取焦点可以实现跑马灯的效果
- 大数据系列修炼-Scala课程06
- Eclipse的SVN插件与本地svn客户端关联详解