通讯录动态版本

来源:互联网 发布:淘宝运费险怎么赔付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