【C語言】簡單實現通訊錄

【C語言】簡單實現通訊錄

已實現功能

  新建聯繫人
  刪除指定聯繫人
  查找指定聯繫人
  修改指定聯繫人
  顯示所有聯繫人
  清空所有聯繫人
  按姓名排序聯繫人

待實現功能

  通訊錄加密
  通訊錄聯網保存
  通訊錄導入導出

實現效果展示

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

頭文件

#ifndef __TONYXUNLU_H__
#define __TONGXUNLU_H__

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <string.h>

#define DEFAULT 2      //通信錄默認大小
#define NAME_MAX 10
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDRESS_MAX 50   
#define ADD_NUM 2      //每次擴容默認步長

enum OPTION
{
    EXIT,
    ADD,
    DEL,
    FIND,
    MODIFY,
    DISPLAY,
    EMPTY,
    SORT
};

typedef struct PLEINFO  //通訊錄個人信息結構體
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    unsigned char age;
    char telephone[TELE_MAX];
    char address[ADDRESS_MAX];
}PLEINFO;

typedef struct CONTACT   //通訊錄結構體
{
    unsigned int count;
    unsigned int capacity;
    PLEINFO *data;
}CONTACT;

CONTACT my_contact;

void InitContact(CONTACT *pcontact);    //初始化通訊錄

void Modify(CONTACT *pcontact);   //修改聯繫人信息

void SubCapacity(CONTACT *pcontact);  //覈查縮小通訊錄容量

void AddCapacity(CONTACT *pcontact);  //覈查增加通訊錄容量

void Add(CONTACT *pcontact);  //新建聯繫人

void Del(CONTACT *pcontact);   //刪除聯繫人

int Find(CONTACT *pcontact);  //查找聯繫人

void Display(CONTACT *pcontact);  //顯示所有聯繫人

void Sort(CONTACT *pcontact);  //按姓名排序聯繫人

void Empty(CONTACT *pcontact);   //清空聯繫人

void menu();  //菜單

void Exit(CONTACT *pcontact);  //關閉通訊錄

#endif //_TONGXUNLU_H__

功能實現文件

#include "tongxunlu.h"


void InitContact(CONTACT *pcontact)    //初始化通訊錄
{
    pcontact->capacity = DEFAULT;
    pcontact->count = 0;
    pcontact->data = (PLEINFO *)calloc(sizeof(PLEINFO), pcontact->capacity);
    if (pcontact->data == NULL)
    {
        printf("\n初始化通訊錄失敗\n");
        system("pause");
        exit(-1);
    }
}

void SubCapacity(CONTACT *pcontact)  //覈查縮小通訊錄容量
{
    if (pcontact->capacity > pcontact->count && pcontact->count != 0)
    {
        int result = pcontact->capacity - pcontact->count;
        PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity - result)*sizeof(PLEINFO));
        if (tmp != NULL)
        {
            pcontact->data = tmp;
            tmp = NULL;
            pcontact->capacity -= result;
        }
        else
        {
            perror("縮容失敗");
            Exit(pcontact);
            exit(-1);
        }
    }
}

void AddCapacity(CONTACT *pcontact)  //覈查增加通訊錄容量
{
    if (pcontact->capacity == pcontact->count)
    {
        PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity + ADD_NUM)*sizeof(PLEINFO));
        if (tmp != NULL)
        {
            pcontact->data = tmp;
            tmp = NULL;
            pcontact->capacity += ADD_NUM;
        }
        else
        {
            perror("擴容失敗");
            Exit(pcontact);
            exit(-1);
        }
    }
}

void Add(CONTACT *pcontact)  //新建聯繫人
{
    AddCapacity(pcontact);

    printf("\n\t新建聯繫人\n\n");
    printf("請輸入聯繫人姓名:>");
    scanf("%s", (pcontact->data[pcontact->count].name));
    printf("請輸入聯繫人性別:>");
    scanf("%s", (pcontact->data[pcontact->count].sex));
    printf("請輸入聯繫人年齡:>");
    scanf("%d", &((pcontact->data[pcontact->count].age)));
    printf("請輸入聯繫人電話:>");
    scanf("%s", (pcontact->data[pcontact->count].telephone));
    printf("請輸入聯繫人住址:>");
    scanf("%s", (pcontact->data[pcontact->count].address));

    ++pcontact->count;
    printf("\n\t聯繫人增加成功\n");
    system("pause");
}

void Del(CONTACT *pcontact)   //刪除聯繫人
{
    int i = Find(pcontact);

    if (i == -1)
    {
        printf("\n沒有找到該聯繫人\n");
        system("pause");
        return;
    }
    else
    {
        pcontact->data[i] = pcontact->data[--pcontact->count];
    }
    SubCapacity(pcontact);
    printf("\n刪除成功\n");
    system("pause");
}

unsigned int Find(CONTACT *pcontact)  //查找聯繫人
{
    char name[10];
    unsigned int i = 0;

    printf("請輸入你要操作的聯繫人的姓名:>");
    scanf("%s", name);

    for (i = 0; i < pcontact->count; i++)
    {
        if (!strcmp(pcontact->data[i].name, name))
        {
            return i;
        }
    }
    return -1;
}

void Modify(CONTACT *pcontact)   //修改聯繫人信息
{
    int i = Find(pcontact);

    if (i == -1)
    {
        printf("\n沒有找到該聯繫人\n");
        system("pause");
        return;
    }
    else
    {
        int input = 0;
        printf("\n---------------------------------------------\n");
        printf("\n\t已找到該聯繫人\n\n姓名:%s\n性別:%s\n年齡:%d\n電話:%s\n住址:%s\n",
            pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
            pcontact->data[i].telephone, pcontact->data[i].address);
        printf("\n---------------------------------------------\n");
        do
        {
            printf("\n1.姓名\t2.性別\t3.年齡\t4.電話\t5.住址\t0.退出\n\n你要修改聯繫人的哪一個信息呢?:>");
            scanf("%d", &input);
            switch (input)
            {
                case 1:
                {
                    printf("姓名修改爲:>");
                    scanf("%s", pcontact->data[i].name);
                }
                    break;
                case 2:
                {
                    printf("性別修改爲:>");
                    scanf("%s", pcontact->data[i].sex);
                }
                    break;
                case 3:
                {
                    printf("年齡修改爲:>");
                    scanf("%d", &(pcontact->data[i].age));
                }
                    break;
                case 4:
                {
                    printf("電話修改爲:>");
                    scanf("%s", pcontact->data[i].telephone);
                }
                    break;
                case 5:
                {
                    printf("住址修改爲:>");
                    scanf("%s", pcontact->data[i].address);
                }
                    break;
                case 0: printf("\n退出修改\n");
                    break;
                default: printf("\n選擇錯誤,請重新選擇\n");
                    break;
            }
        } while (input);
    }
    printf("\n聯繫人修改成功\n");
    system("pause");
}

void Display(CONTACT *pcontact)  //顯示所有聯繫人
{
    unsigned int i = 0;

    printf("\n通訊錄當前 存放聯繫人數量/總容量\t%d/%d\n", pcontact->count, pcontact->capacity);
    printf("\n---------------------------------------------\n");
    printf("\n%-10s%-8s%-9s%-15s%-50s\n\n", "姓名", "性別", "年齡", "電話", "住址");
    for (i = 0; i < pcontact->count; i++)
    {
        printf("%-10s%-8s%-9d%-15s%-50s\n",
            pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
            pcontact->data[i].telephone, pcontact->data[i].address);
    }
    printf("\n---------------------------------------------\n");
    system("pause");
}

void Empty(CONTACT *pcontact)   //清空聯繫人
{

    PLEINFO *tmp = (PLEINFO *)calloc(sizeof(PLEINFO), DEFAULT);
    if (!tmp)
    {
        printf("\n清空失敗,請稍後重新清空\n");
        system("pause");
        return;
    }

    free(pcontact->data);
    pcontact->data = tmp;
    tmp = NULL;

    pcontact->capacity = DEFAULT;
    pcontact->count = 0;
    printf("\n聯繫人清空成功\n");
    system("pause");
}

void Sort(CONTACT *pcontact)  //按姓名排序聯繫人  //冒泡排序
{
    unsigned int i = 0;

    for (i = 0; i < pcontact->count - 1; i++)
    {
        unsigned int j = 0;
        for (j = 0; j < pcontact->count - i - 1; j++)
        {
            if (strcmp(pcontact->data[j].name, pcontact->data[j + 1].name) > 0)
            {
                PLEINFO tmp = pcontact->data[j];
                pcontact->data[j] = pcontact->data[j + 1];
                pcontact->data[j + 1] = tmp;
            }
        }
    }
}

void menu()  //菜單
{
    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\n");
}

void Exit(CONTACT *pcontact)  //關閉通訊錄
{
    free(pcontact->data);
    pcontact->data = NULL;
    pcontact->capacity = 0;
    pcontact->count = 0;
    printf("\n已退出通訊錄\n");
    system("pause");
}

主函數文件

#include "tongxunlu.h"


int main()
{
    int input = 0;

    InitContact(&my_contact);
    do
    {
        system("cls");
        menu();
        printf("你想幹嘛?:>");
        scanf("%d", &input);

        switch (input)
        {
        case EXIT: Exit(&my_contact);
            break;
        case ADD: Add(&my_contact);
            break;
        case DEL: Del(&my_contact);
            break;
        case FIND:
        {
            unsigned int i = Find(&my_contact);
            if (i == -1)
            {
                printf("\n沒有找到聯繫人\n");
                system("pause");
                break;
            }
            printf("\n---------------------------------------------\n");
            printf("\n姓名:%-10s\n性別:%-8s\n年齡:%-9d\n電話:%-15s\n住址:%-50s\n",
                my_contact.data[i].name, my_contact.data[i].sex, my_contact.data[i].age,
                my_contact.data[i].telephone, my_contact.data[i].address);
            printf("\n---------------------------------------------\n");
            system("pause");
        }
            break;
        case MODIFY: Modify(&my_contact);
            break;
        case DISPLAY:Display(&my_contact);
            break;
        case EMPTY: Empty(&my_contact);
            break;
        case SORT: Sort(&my_contact);
            break;
        default: printf("\n你輸錯了,重新輸入吧!\n");
            break;
        }
    } while (input);
    return 0;
}




全文完,感謝瀏覽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章