实现动态通讯录

//////////////////////////////// .h文件  /////////////////////////////
#pragma once 

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//实现一个通讯录;
//通讯录可以用来存储1000个人的信息,每个人的信息包括:
//姓名、性别、年龄、电话、住址
//
//提供方法:

//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 以名字排序所有联系人


#define MAX_SIZE 1000

typedef struct Measage
{
    char name[20];
    int gender;
    int age;
    char tel[20];
    char addr[20];
}*MList;

typedef struct List
{
    MList Man[MAX_SIZE];
    int Size;
}People;       // people * s          s->Man[s->Size]->name


void AddMan(People* s);
void InitMan(People* s);
void DeleteMan(People* s);
int FindMan(People* s);
void ReviseMan(People* s);
void Display(People* s);
void SortMan(People* s);

//////////////////////////// .c 实现文件 //////////////////////////////

#include "标头.h"
#pragma warning(disable:4996)
void InitMan(People* s)
{
    s->capasize = MAX_SIZE;
    s->Man = malloc(MAX_SIZE * sizeof(List));
    s->Size = 0;
    printf("清理成功\n");
}

void IncreaseMan(People* s)
{
    assert(s);
    s->capasize = s->capasize + INCREASEMENT;
    s->Man = realloc(s->Man, s->capasize * sizeof(List));
}

//引发了异常: 读取访问权限冲突。
//**s** 是 0x34F42096。 出现了
void AddMan(People* s)
{
    if (s->Size == MAX_SIZE - 1) {
        IncreaseMan(s);
    }
    printf("\n");
    printf("\n");
    printf("现在进行添加联系人操作\n");
    getchar();
    printf("请输入姓名\n");
    gets(s->Man[s->Size].name);
    printf("请输入性别 1.男性   2.女性\n");
    scanf_s("%d", &(s->Man[s->Size].gender));
    getchar();
    printf("请输入地址\n");
    gets(s->Man[s->Size].addr);
    printf("请输入年龄\n");
    scanf_s("%d", &(s->Man[s->Size].age));
    getchar();
    printf("请输入十一位电话号码\n");
    gets(s->Man[s->Size].tel);
    ++s->Size;
}

void DeleteMan(People* s)
{
    int i = 0;
    int flag = 1;
    char str[20];
    if (s == NULL) {
        printf("空\n");
        return;
    }
    printf("\n");
    printf("\n");
    printf("请输入您要删除的联系人的姓名\n");
    getchar();
    gets(str);
    while (i < s->Size) {
        if (strcmp(s->Man[i].name, str) == 0) {
            flag = 0;
            while (i < (s->Size) - 1) {
                s->Man[i] = s->Man[i + 1];
                ++i;
            }
            --s->Size;
            break;
        }
        ++i;
    }
    if (flag) {
        printf("无此联系人信息\n");
    }
    printf("联系人信息已删除\n");
    printf("\n");
    printf("\n");
}


int FindMan(People* s)
{
    assert(s);
    int i = 0;
    int flag = 1;
    char str[20];
    printf("请输入您要查找的联系人的姓名\n");
    getchar();
    gets(str);
    while (i < s->Size) {
        if (strcmp(s->Man[i].name, str) == 0) {
            flag = 0;
            printf("\n");
            printf("\n");
            printf("电话:%s\n", s->Man[i].tel);
            if ((s->Man[i]).gender == 1) {
                printf("性别男\n");
            }
            else {
                printf("性别女\n");
            }
            printf("年龄 %d\n", s->Man[i].age);
            printf("地址:%s\n", s->Man[i].addr);
            printf("\n");
            printf("\n");
            break;
        }
        ++i;
    }
    if (flag) {
        printf("未找到联系人信息\n");
        return -1;
    }
    return i;
}


void ReviseMan(People* s)
{
    int i = FindMan(s);
    if (i == -1) {
        return;
    }
    else {
        printf("\n");
        printf("\n");
        printf("现在进行修改联系人操作\n");
        getchar();
        printf("请输入姓名\n");
        gets(s->Man[s->Size].name);
        printf("请输入性别 1.男性   2.女性\n");
        scanf_s("%d", &(s->Man[s->Size].gender));
        getchar();
        printf("请输入地址\n");
        gets(s->Man[s->Size].addr);
        printf("请输入年龄\n");
        scanf_s("%d", &(s->Man[s->Size].age));
        getchar();
        printf("请输入十一位电话号码\n");
        gets(s->Man[s->Size].tel);
        printf("\n");
        printf("\n");
    }
}


void Display(People* s)
{
    assert(s);
    int i = 0;
    while (i < s->Size) {
        printf("\n");
        printf("\n");
        printf("姓名:%s\n", s->Man[i].name);
        printf("电话:%s\n", s->Man[i].tel);
        if (s->Man[i].gender == 1) {
            printf("性别男\n");
        }
        else {
            printf("性别女\n");
        }
        printf("年龄 %d\n", s->Man[i].age);
        printf("地址:%s\n", s->Man[i].addr);
        ++i;
        printf("\n");
        printf("\n");
    }
}


void SortMan(People* s)//按照名字首字母排序
{
    int i = 0;
    int j = 0;
    char tmp[20];
    int flag = 1;
    for (; i < s->Size - 1; ++i) {
        for (; j < s->Size - 1 - i; ++j) {
            if (strcmp(s->Man[i].name, s->Man[i + 1].name) == 1) {
                flag = 0;
                strcpy(tmp, s->Man[i].name);
                strcpy(s->Man[i].name, s->Man[i + 1].name);
                strcpy(s->Man[i + 1].name, tmp);
            }//交换功能代码块
        }
        if (flag)
            break;
    }
}
///////////////////////////  测试文件  /////////////////////////////

#include "标头.h"
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 以名字排序所有联系人
void MENU()
{
    printf("/////////////////// 通讯录 ////////////////////\n");
    printf("////////////// 按键选择相应服务 ///////////////\n");
    printf("//1. 添加联系人信息     2. 删除指定联系人信息//\n");
    printf("//3. 查找指定联系人信息 4. 修改指定联系人信息//\n");
    printf("//5. 显示所有联系人信息 6. 清空所有联系人//////\n");
    printf("////////////7. 以名字排序所有联系人////////////\n");
}


int main() {
    People p;
    int i = 1, j;
    while (i != 0) {
        MENU();
        scanf_s("%d", &i);
        switch (i)
        {
        case 1:
            AddMan(&p);
            break;
        case 2:
            DeleteMan(&p);
            break;
        case 3:
            j = FindMan(&p);
            break;
        case 4:
            ReviseMan(&p);
            break;
        case 5:
            Display(&p);
            break;
        case 6:
            InitMan(&p);
            break;
        case 7:
            SortMan(&p);
            break;
        default:
            break;
        }
    }
    printf("退出\n");
    system("pause");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/liuzhengkai/p/9096973.html