C语言实现通讯录

Contact.h

#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define MAX 1000

enum Con {
    EXIT=0,
    ADD,
    DEL,
    FIND,
    SHOW,
    MODIFY,
    CLEAR,
    SORT,
    DELCON
};

typedef struct PeopleInfo {
    int No;
    char name[20];
    char sex[5];
    int age;
    char tele[11];
    char addr[30];
}pInfo;

typedef struct Ctct {
    int num;
    pInfo arr[MAX];
}Ctct;
void InitCtct(Ctct* con);
void addPeople(Ctct* con);
void delPeople(Ctct* con);
void modifyPeople(pInfo* p);
void showPeople(const Ctct* con);
void delCon(Ctct* con);
void sortPeopleByName(Ctct* con);
pInfo* findPeopleById(Ctct* con, int No);
pInfo* findPeopleByName(Ctct* con, char name[]);

Contact.c

初始化通讯录
void InitCtct(Ctct* con) {
    assert(con);
    con->num = 0;
    memset(con->arr, 0, sizeof(con->arr));
}
添加联系人
void addPeople(Ctct* con) {
    assert(con);
    if (con->num >= MAX) {
        printf("通讯录已满\n");
        return;
    }
    con->arr[con->num].No = (con->num)+1;
    printf("请输入姓名:");
    scanf("%s", con->arr[con->num].name);
    printf("请输入性别:");
    scanf("%s", con->arr[con->num].sex);
    printf("请输入年龄:");
    scanf("%d", &con->arr[con->num].age);
    printf("请输入电话:");
    scanf("%s", con->arr[con->num].tele);
    printf("请输入地址:");
    scanf("%s", con->arr[con->num].addr);
    
    if(con->arr[con->num].name&& con->arr[con->num].sex && con->arr[con->num].age && con->arr[con->num].tele && con->arr[con->num].addr)
        printf("添加成功!\n");
    else 
        printf("添加失败!\n");
    ++(con->num);
    
}
 
展示联系人
void showPeople(const Ctct* con) {
    assert(con);
    printf("%-5s %-20s %-5s %-3s %-11s %-30s\n", "编号", "姓名", "性别", "年龄", "电话", "地址");
    for (int i = 0; i < con->num; i++) {
        printf("%-5d %-20s %-5s  %-3d  %-11s %-30s\n",
            con->arr[i].No,
            con->arr[i].name,
            con->arr[i].sex,
            con->arr[i].age,
            con->arr[i].tele,
            con->arr[i].addr);
    }
}
删除整个通讯录
void delCon(Ctct* con) {
    assert(con);
    free(con);
    con = NULL;
    printf("清理成功\n");
}
删除指定联系人
void delPeople(Ctct* con, char name[]) {
    for (int i = 0; i < con->num; i++) {
        if (strcmp(con->arr[i].name, name) == 0) {
            for (int j = i; j < con->num; j++) {
                con->arr[j] = con->arr[j + 1];
            }
        }
    }
    con->num--;
}
查找指定联系人(两种)
pInfo* findPeopleById(Ctct* con,int No) {
    assert(con);
    assert(No > 0);
    if (No > (con->num)) {
        printf("不在查找范围\n");
        return NULL;
    }
    for (int i = 0; i < con->num; i++) {
        if (con->arr[i].No == No) {
            printf("%-5s %-20s %-5s %-3s %-11s %-30s\n", "编号", "姓名", "性别", "年龄", "电话", "地址");
            printf("%-5d %-20s %-5s  %-3d  %-11s %-30s\n",
                con->arr[i].No,
                con->arr[i].name,
                con->arr[i].sex,
                con->arr[i].age,
                con->arr[i].tele,
                con->arr[i].addr);
            return &(con->arr[i]);
        }
    }
    printf("未找到\n");
    return NULL;
}
pInfo* findPeopleByName(Ctct* con, char name[]) {
    assert(con);
    assert(name);
    for (int i = 0; i < con->num; i++) {
        if (strcmp(con->arr[i].name,name)==0) {
            printf("%-5s %-20s %-5s %-3s %-11s %-30s\n", "编号", "姓名", "性别", "年龄", "电话", "地址");
            printf("%-5d %-20s %-5s  %-3d  %-11s %-30s\n",
                con->arr[i].No,
                con->arr[i].name,
                con->arr[i].sex,
                con->arr[i].age,
                con->arr[i].tele,
                con->arr[i].addr);
            return &(con->arr[i]);
        }
    }
    printf("未找到\n");
    
    return NULL;
}
修改联系人
void modifyPeople(pInfo* p) {
    printf("请输入姓名:");
    scanf("%s", p->name);
    printf("请输入性别:");
    scanf("%s", p->sex);
    printf("请输入年龄:");
    scanf("%d", &p->age);
    printf("请输入电话:");
    scanf("%s", p->tele);
    printf("请输入地址:");
    scanf("%s", p->addr);
}
按名字排序
void sortPeopleByName(Ctct* con) {
    for (int i = 0; i < con->num-1; i++) {
        for (int j = 0; j < con->num - 1 - i; j++) {
            if (strcmp(con->arr[j].name,con->arr[j + 1].name) > 0) {
                pInfo tmp = con->arr[j];
                con->arr[j] = con->arr[j + 1];
                con->arr[j + 1] = tmp;
            }
        }
    }
}

Test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

int menu() {
    int input;
    printf("**********************************\n");
    printf("**********************************\n");
    printf("*****          MENU          *****\n");
    printf("*****    1. ADD    2. DEL    *****\n");
    printf("*****    3. FIND   4. SHOW   *****\n");
    printf("*****    5. MODIFY 6.CLEAR   *****\n");
    printf("*****    7. SORT_BY_NAME     *****\n");    
    printf("*****    8. DEL_CONTACT      *****\n");
    printf("*****    0. EXIT             *****\n");
    printf("**********************************\n");
    printf("**********************************\n");
    printf("请输入数字:");
    scanf("%d", &input);
    return input;
}
int main() {
    int in=1;
    Ctct* con=(Ctct*)malloc(sizeof(Ctct));
    InitCtct(con);
    while (in) 
    {
        in=menu();
        switch (in)
        {
        case EXIT:
            printf("*****          退出          *****\n");
            exit(-1);
        case ADD:
            addPeople(con);
            break;
        case DEL:
            printf("请输入需要删除的姓名:");
            char find[30] = { 0 };
            scanf("%s", find);
            delPeople(con,find);
            break;
        case FIND:
            printf("按编号查找(输入1)或按名查找(输入2)");
            int input;
            scanf("%d", &input);
            if (input == 1) {
                printf("请输入需要查找的编号(从1开始):");
                int find=0;
                scanf("%d", &find);
                findPeopleById(con, find);
            }
            else if (input == 2) {
                printf("请输入需要查找的姓名:");
                char find[30] = { 0 };
                scanf("%s", find);
                findPeopleByName(con, find);
            }
            else {
                printf("无效输入\n");
            }
            
            break;
        case SHOW:
            showPeople(con);
            break;
        case MODIFY:
            printf("输入需要修改的联系人的编号(输入1)或名字(输入2)");
            int input1;
            scanf("%d", &input1);
            if (input1 == 1) {
                printf("输入需要修改的联系人的编号(从1开始):");
                int find = 0;
                scanf("%d", &find);
                pInfo* p=findPeopleById(con, find);
                if (p&&p->name != NULL) modifyPeople(p);
                else printf("修改失败\n");
            }
            else if (input1 == 2) {
                printf("输入需要修改的联系人的姓名:");
                char find[30] = { 0 };
                scanf("%s", find);
                pInfo* p=findPeopleByName(con, find);
                if (p&&p->name != NULL) modifyPeople(p);
                else printf("修改失败\n");
            }
            else {
                printf("无效输入\n");
            }
            break;
        case CLEAR:
            InitCtct(con);
            break;
        case SORT:
            sortPeopleByName(con);
            showPeople(con);
            break;
        case DELCON:
            delCon(con);
        default:
            printf("您输入的数字不对,请重新输入!\n");
            break;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值