C语言实现简单的通讯录管理系统

本文实例为大家分享了C语言实现通讯录管理系统的具体代码,供大家参考,具体内容如下

要实现一个通讯录管理系统,需要用到结构体、指针、文件操作、动态管理等内容。

效果展示:

实现思路

通讯录中的联系人包括姓名、年龄、性别、电话、住址,因此可以定义一个结构体PeoInfo来存储这些信息。

同时,由于通讯录需要记录当前的大小,以此来方便我们对通讯录realloc进行扩容,所以需要定义通讯录结构体Contact来保存这些信息,其中该结构体中可以嵌套一个PeoInfo类型的指针。

当定义完结构体以后,就可以对定义的结构体进行增删查改,其中可以先使用malloc对通讯录结构体进行初始化,然后再完成添加、删除、查找、修改、保存、排序、清空等一系列函数。

在保存时,需要用到文件指针将数据保存到文件中,因此在一开始当前目录下需要一个相应的文件。
同时在初始化时,也要将文件中的数据读取到我们的结构体指针指向的内容中。
在这里使用contact.txt文件来保存信息:

为了方便,我们将函数声明,函数实现,以及游戏的实现放到三个不同文件里:

contact.h内容

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>

#define MAX_NAME 10//名字的大小
#define MAX_SEX 5//性别大小
#define MAX_TELE 15//电话大小
#define MAX_ADDR 30//地址大小
#define DEFAULT_SZ 3 //通讯录默认的大小

enum Option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    SORT,
    SAVE,
    CLEAR
};
struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
};

//通讯录类型
struct Contact
{
    struct PeoInfo* data;//存放信息
    int size;//记录当前已经有的元素个数
    int capacity;//当前通讯录的最大容量
};

//初始化通讯录
void InitContact(struct Contact* ps);

//增加通讯录内容
void AddContact(struct Contact* ps);

//打印通讯录信息
void ShowContact(const struct Contact* ps);

//删除通讯录信息
void DelContact(struct Contact* ps);

//查找通讯录信息
void SearchContact(const struct Contact* ps);

//修改指定联系人
void ModifyContact(struct Contact* ps);

//按姓名排序
void SortContact(struct Contact* ps);

//释放动态开辟的内存
void DestroyContact(struct Contact* ps);

//保存通讯录
void SaveContact(struct Contact* ps);

//加载文件中的信息到通讯录
void LoadContact(struct Contact* ps);

//清空通讯录
void ClearContact(struct Contact* ps);

这个文件中主要包括结构体的创建,以及各种函数的声明。

contact.c内容

#include"contact.h"

void InitContact(struct Contact* ps)
{
    ps ->data =(struct PeoInfo*) malloc(DEFAULT_SZ * sizeof(struct PeoInfo));
    if (ps->data == NULL)
    {
        printf("空间开辟失败");
        return;
    }
    ps->size = 0;
    ps->capacity = DEFAULT_SZ;
    //把文件中存放的信息加载到通讯录中
    LoadContact(ps);
}
void CheckCapacity(struct Contact* ps)
{
    if (ps->size == ps->capacity)
    {
        struct PeoInfo* ptr = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 5) * sizeof(struct PeoInfo));
        if (ptr != NULL)
        {
            ps->data = ptr;
            ps->capacity += 5;
        }
    }
}
void LoadContact(struct Contact* ps)
{
    struct PeoInfo tmp = { 0 };
    FILE* pfRead = fopen("contact.txt", "rb");
    if (pfRead == NULL)
    {
        printf("文件不存在:%s\n", strerror(errno));
        return;
    }
    //读取文件
    while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead))
    {
        CheckCapacity(ps);
        ps->data[ps->size] = tmp;
        ps->size++;
    }
    fclose(pfRead);
    pfRead = NULL;
}

void AddContact(struct Contact* ps)
{
    //检测当前通讯录的容量,如果满了则增容
    CheckCapacity(ps);
    printf("请输入名字->");
    scanf("%s", ps->data[ps->size].name);
    printf("请输入年龄->");
    scanf("%d", &(ps->data[ps->size].age));
    printf("请输入性别->");
    scanf("%s", ps->data[ps->size].sex);
    printf("请输入电话->");
    scanf("%s", ps->data[ps->size].tele);
    printf("请输入地址->");
    scanf("%s", ps->data[ps->size].addr);
    
    ps->size++;
    printf("添加成功\n");
    
}

void ShowContact(const struct Contact* ps)
{
    if (ps->size == 0)
    {
        printf("通讯录为空\n");

    }
    else
    {
        int i = 0;
        printf("%-10s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
        {
            for (i = 0; i < ps->size; i++)//打印每个通讯录元素
            {
                printf("%-10s\t%-4d\t%-5s\t%-12s\t%-20s\n", 
                    ps->data[i].name, ps->data[i].age, ps->data[i].sex, 
                    ps->data[i].tele, ps->data[i].addr);
            }
        }
    }
}
//查找联系人位置
int FindByName(const struct Contact* ps, char name[MAX_NAME])
{
    //查找要删除人的位置
    int i = 0;
    for (i = 0; i < ps->size; i++)
    {
        if (0 == strcmp(ps->data[i].name, name))
        {
            return i;//找到返回下标
        }
    }
    return -1;//找不到返回-1
}

void DelContact(struct Contact* ps)
{
    char name[MAX_NAME];
    printf("请输入要删除人的名字:->");
    scanf("%s", name);
    //查找要删除人的位置
    int pos=FindByName(ps, name);//找到返回名字所在的下标,找不到返回-1
    
    if (pos==-1)
    {
        printf("联系人不存在\n");
    }
    else
    {
        //删除
        int j = 0;
        for (j = pos; j < ps->size-1; j++)
        {
            ps->data[j] = ps->data[j + 1];
        }
        ps->size--;
        printf("删除成功\n");
    }

}

void SearchContact(const struct Contact* ps)
{
    char name[MAX_NAME];
    printf("请输入要查找人的名字:->");
    scanf("%s", name);
    int pos = FindByName(ps, name);//找到返回名字所在的下标,找不到返回-1
    if (pos == -1)
    {
        printf("联系人不存在\n");
    }
    else
    {
        printf("%-10s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");        
        printf("%-10s\t%-4d\t%-5s\t%-12s\t%-20s\n",
         ps->data[pos].name, ps->data[pos].age, ps->data[pos].sex,
         ps->data[pos].tele, ps->data[pos].addr);
            
    }        
}

void ModifyContact(struct Contact* ps)
{
    char name[MAX_NAME];
    printf("请输入要修改人的名字:->");
    scanf("%s", name);
    int pos = FindByName(ps, name);//找到返回名字所在的下标,找不到返回-1
    if (pos == -1)
    {
        printf("联系人不存在\n");
    }
    else
    {
        printf("请输入名字->");
        scanf("%s", ps->data[pos].name);
        printf("请输入年龄->");
        scanf("%d", &(ps->data[pos].age));
        printf("请输入性别->");
        scanf("%s", ps->data[pos].sex);
        printf("请输入电话->");
        scanf("%s", ps->data[pos].tele);
        printf("请输入地址->");
        scanf("%s", ps->data[pos].addr);

        printf("修改完成\n");
    }
}

void SortContact(struct Contact* ps)
{
    for (int i = 0; i < ps->size - 1; ++i)
    {
        for (int j = 0; j < ps->size - i - 1; ++j)
        {
            if (strcmp(ps->data[j].name, ps->data[j + 1].name) > 0)
            {
                struct PeoInfo tmp = ps->data[j];
                ps->data[j] = ps->data[j + 1];
                ps->data[j + 1] = tmp;
            }
        }
    }
    printf("按姓名排序成功\n");
}

//释放动态开辟的空间
void DestroyContact(struct Contact* ps)
{
    free(ps->data);
    ps->data=NULL;
}

void SaveContact(struct Contact* ps)
{
    FILE* pfWrite = fopen("contact.txt", "wb");
    if (pfWrite == NULL)
    {
        printf("%s\n", strerror(errno));
        return;
    }
    //将通讯录的信息写入文件
    int i = 0;
    for (i = 0; i < ps->size; i++)
    {
        fwrite(&(ps->data[i]), sizeof(struct PeoInfo), 1, pfWrite);
    }
    printf("保存成功\n");
    fclose(pfWrite);
    pfWrite = NULL;
}

void ClearContact(struct Contact* ps)
{
    printf("确定要清空通讯录吗?<Y/N> :>");
    char ch;
    getchar();//清空缓存区里面的\n
    scanf("%c", &ch);
    if (ch == 'Y' || ch == 'y')
    {
        ps->size = 0;
        memset(ps->data, 0, sizeof(ps->data));
        printf("清空成功\n");
    }
    else
    {
        printf("取消清空\n");
    }
    
}

在这个文件中我们将声明的函数进行了定义,用到的方法都比较简单。

test.c内容

#include"contact.h"
void menu()
{
    printf("**************************************************\n");
    printf("****1.添加联系人        2.删除联系人**************\n");
    printf("****3.查找联系人        4.修改联系人*************\n");
    printf("****5.展示所有联系人    6.按姓名排序联系人********\n");
    printf("****7.保存通讯录        8.清空通讯录*************\n");
    printf("**************0.退出通讯录************************\n");
    printf("**************************************************\n");
}

int main()
{
    int input = 0;
    //创建通讯录
    int size = 0;
    struct Contact con;//con是通讯录
    //初始化通讯录
    InitContact(&con);

    do
    {
        menu();
        printf("请选择->");
        scanf("%d", &input);
        switch (input)
        {
        case ADD:
            AddContact(&con);
            system("pause");
            system("cls");
            break;
        case DEL:
            DelContact(&con);
            system("pause");
            system("cls");
            break;
        case SEARCH:
            SearchContact(&con);
            system("pause");
            system("cls");
            break;
        case MODIFY:
            ModifyContact(&con);
            system("pause");
            system("cls");
            break;
        case SHOW:
            ShowContact(&con);
            system("pause");
            system("cls");
            break;
        case SORT:
            SortContact(&con);
            system("pause");
            system("cls");
            break;
        case SAVE:
            SaveContact(&con);
            system("pause");
            system("cls");
            break;
        case CLEAR:
            ClearContact(&con);
            system("pause");
            system("cls");
            break;
        case EXIT:
            SaveContact(&con);
            //释放动态开辟的内存
            DestroyContact(&con);
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
}

在这个文件中将对菜单进行打印,同时进行函数的调用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言使用结构体实现简单通讯录

    C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 代码实现: 头文件: #ifndef __HEAD_H__ ////防止头文件被多次调用 #define __HEAD_H__ #include<stdio.h> #include<string.h> #in

  • C语言基于哈希表实现通讯录

    本文为大家分享了C语言基于哈希表实现通讯录的具体代码,供大家参考,具体内容如下 1.需求分析 本演示程序用C语言编写,完成哈希表的生成,电话号码的插入.以及查找等功能. (1)按提示输入相应的联系人的相关资料: (2)以相应的输出形式输出所存储的的联系人的资料: (3)程序可以达到建立.添加.查找.打印的功能: (4)程序可以判断用户输入的非法数据并引导正确的输入. 2.概要设计 存储电话号码的记录时,若在存储位置和其关键字之间建立某种确定的对应关系使得每个关键字和存储结构中一个唯一的存储位置相

  • C语言通讯录管理系统完整版

    C语言实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能.. 完整的代码如下: #include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计算字节//

  • C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include<stdio.h> #include<string.h> #include<stdlib.h> #include<windows.h> struct stu //第一部分:声明结构体类型struct stu { char name[100];//姓名为字符串型

  • C语言实现简单的通讯录

    用C语言写了一个简单的通讯录,说简单一是功能简单,二是也没有加读写文件操作,只是作为链表操作的一个练习,希望能给这方面的新手一此引导和帮助. 代码: /* 转贴请注明出处 */ /* 作者:小浦原(ID:blueboy82006) */ /* http://blog.csdn.net/blueboy82006 */ #include <stdio.h> #include <stdlib.h> #include<string.h> #include<ctype.h&

  • C语言通讯录管理系统课程设计

    本文实例为大家分享了C语言通讯录管理系统课程设计,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <windows.h> struct Sign{ char name[8]; char sex[4]; char birthday[12]; char phone[11]; char postcode[7]; char addr[30]; struct Sign *next; }pe; char Ph

  • 使用C语言打造通讯录管理系统和教学安排系统的代码示例

    通讯录管理系统 实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能.. 完整的代码如下: #include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计

  • C语言实现通讯录功能

    本文实例为大家分享了C语言实现通讯录功能的具体代码,供大家参考,具体内容如下 先定义头文件 #ifndef __CONTACT_H__ #define __CONTACT_H__ #define NAME_LEN 10 #define SEX_LEN 6 #define TELE_LEN 12 #define ADDR_LEN 20 #define MAX_PEO 1000 typedef struct PEO { char name[NAME_LEN]; int age; char sex[S

  • C语言实现通讯录系统

    C语言通讯录系统实现,供大家参考,具体内容如下 需求分析: 利用文件读,写的方法 实现增加通讯录联系人信息 实现删除通讯录联系人信息 实现查找通讯录联系人信息 实现修改通讯录联系人信息 实现查看现有通讯录联系人信息 代码实现: // main.c // C语言通讯录实现 // // Created by Brisinga on 15/10/14. // Copyright © 2015年 yan. All rights reserved. // #include <stdio.h> #incl

  • 用C语言实现简易通讯录

    C语言实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 **提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人** 思路分析: 首先我们可以分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件里可以包含一些相应信息,当实现文件和测试文件包含自己定义的头文件时便可以获得一些相关的信息.所以头文件里

随机推荐