c语言简单通讯录

日常之中通讯录的基本要求应该满足这样几个条件:

1.读出

2.列出所有记录(列出姓名,电话号等)
3.查询功能

4.修改更能

5.删除功能

6.保存功能

其中主要用到的知识点:

动态开辟内存,根据用户需要创建通讯录大小

练习结构体的声明定义使用

熟悉指针传参的过程

代码分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件里可以包含一些相应信息,当实现文件和测试文件包含自己定义的头文件时便可以获得一些相关的信息。所以头文件里应该包括一个结构体,这个结构体里应包含姓名,性别,年龄,电话,住址。同时还可以定义一个结构体,这个结构体里包含通讯录,同时通讯录里人员的计数变量,将通讯录的地址传到别的地方便可以实现对它遍历或者其他操作。 
第二个模块便是我们的测试函数,测试函数便可以实现我们的菜单打印,同时由我们接收不同的值便可以实现不同的操作,就是相应的方法的实现,这里很明显可以通过一个switch语句来进行控制。
第三个模块便是我们的方法实现的函数,将模块2里定义的类型为通讯录的地址传到各个方法里,这样便可以实现对通讯录的操作。
add_lish.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define NAME 20
#define PHONE 20
#define ADDRESS 50
struct Person {
    char name[NAME];
    char sex;
    int age;
    char phoneNum[PHONE];
    char address[ADDRESS];
    char flag;   //标记,=1表示人被删除
}*ppsn;


void add_person(struct Person * ppsn);   //增加一个人
void del_person(struct Person * ppsn);   //删除指定人
void find_person(struct Person * ppsn);     //寻找指定人
void update(struct Person * ppsn);      //更新人信息
void show_all(struct Person * ppsn);    //显示所有人
void clear();                       //清空所有人
void sort_by_name(struct Person * ppsn);    //按名排序
void init(int size);        //初始化

test.c

#include "add_list.h"
#include <stdio.h>
void menu() {
    printf("**************************************\n");
    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");
}

int main()
{

    printf("请选择你想创建的通讯录大小\n");
    int sizeOfAdd;
    scanf("%d", &sizeOfAdd);
    init(sizeOfAdd);
    int chose;
    do {
        menu();
        scanf("%d", &chose);
        switch (chose) {
        case 1:add_person(ppsn);
                break;
        case 2:del_person(ppsn);
                break;
        case 3:find_person(ppsn);
                break;
        case 4:update(ppsn);
                break;
        case 5:show_all(ppsn);
                break;
        case 6:clear(ppsn);
                break;
        case 7:sort_by_name(ppsn);
                break;
            default:break;

        }

    } while (chose);

    system("pause");
}

add_list.c

#include "add_list.h"
#include <stdio.h>
#include <stdlib.h>
//通讯录目前总人数
int sumCount = 0;
//动态开辟的大小
int sizeOfAdd = 0;
void init(int size)
{
    sizeOfAdd = size;
    ppsn = NULL;
    ppsn = (struct Person *)malloc(size * sizeof(struct Person));
}
void clear() {
    free(ppsn);
    ppsn = (struct Person *)malloc(sizeOfAdd * sizeof(struct Person));
    if (ppsn == NULL) {
        printf("清空失败");
    }
}
void add_person(struct Person * ppsn)
{
    ppsn += sumCount;
    if (ppsn != NULL) {
        printf("请依次输入姓名 性别 年龄 电话 地址,中间用空格隔开\n");
        scanf("%s %c %d %s %s", ppsn->name, &ppsn->sex, &ppsn->age, ppsn->phoneNum, ppsn->address);
        ppsn->flag = 0;
        sumCount += 1;
    }
}
void del_person(struct Person * ppsn)
{   
    char name[NAME];
    printf("请输入删除人的姓名\n");
    scanf("%s", name);
    if (ppsn == NULL) {
        return;
    }
    int count = sumCount;
    for (; ppsn != NULL&&count; count--, ppsn++) {
        if (strcmp(ppsn->name, name) == 0 && !(ppsn->flag)) {
            printf("已经删除 %s %c %d %s %s\n", ppsn->name, ppsn->sex, ppsn->age, ppsn->phoneNum, ppsn->address);
            ppsn->flag = 1;
            return;
        }
    }

}
void show_all(struct Person * ppsn)
{
    int count = sumCount;
    while (ppsn != NULL && count--) {
        if(!(ppsn->flag))
            printf("%s %c %d %s %s\n", ppsn->name, ppsn->sex, ppsn->age, ppsn->phoneNum, ppsn->address);
        ppsn++;
    }
}

int cmp(const void *a, const void *b) {
    struct Person *pa = (struct Person *)a;
    struct Person *pb = (struct Person *)b;
    return strcmp(pa->name, pb->name);
}
void sort_by_name(struct Person * ppsn) {
    if (ppsn == NULL) {
        return;
    }
    qsort(ppsn, sumCount, sizeof(struct Person), cmp);
}
void find_person(struct Person * ppsn) {
    char name[NAME];
    printf("请输入删除人的姓名\n");
    scanf("%s", name);
    if (NULL == name || ppsn == NULL) {
        return;
    }
    int count = sumCount;
    for (; ppsn != NULL && count; count--,ppsn++) {
        if (strcmp(ppsn->name, name) == 0 && !(ppsn->flag)) {
            printf("%s %c %d %s %s\n", ppsn->name, ppsn->sex, ppsn->age, ppsn->phoneNum, ppsn->address);
            return;
        }
    }
    printf("没有找到\n");
}

void update(struct Person * ppsn) {
    char name[NAME];
    printf("请输入删除人的姓名\n");
    scanf("%s", name);
    if (NULL == name || ppsn == NULL) {
        return;
    }
    int count = sumCount;
    for (; ppsn != NULL && count; count--, ppsn++) {
        if (strcmp(ppsn->name, name) == 0 && !(ppsn->flag)) {
            printf("找到联系人,请依次输入姓名 性别 年龄 电话 地址,中间用空格隔开\n");
            scanf("%s %c %d %s %s", ppsn->name, &ppsn->sex, &ppsn->age, ppsn->phoneNum, ppsn->address);
            return;
        }
    }
    printf("没有找到\n");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值