实现一个简单的通讯录

本文介绍了一个简单的通讯录管理系统的设计与实现。该系统采用C语言,能够存储1000条联系人信息,支持添加、删除、查找、修改等功能,并能按姓名排序显示所有联系人。系统通过结构体数组组织数据,提供了直观的操作界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


实现一个通讯录:
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址


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

未使用开辟动态内存的方法:

头文件部分(test.h)

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACTS_H__
#define __CONTACTS_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define N 1000
typedef struct contact
{
    char name[20];
    char sex[4];
    int age;
    int telephone;
    char address[20];
}*c;
void show(struct contact *c, int len); //struct contact *c:结构体指针指向这个结构体
//int len:结构体数组的长度
void add(struct contact *c, int len, int flag);
int Delete(struct contact *c, int d_number, int len);
void find(struct contact *c, int d_number, int len);
void empty(struct contact *c);//清空联系人
void modify(struct contact *c, int m_member, int len);//修改联系人
int cmp(const void*a, const void*b);
void sort(struct contact *c, int len);//根据联系人的名字进行排序 
#endif

contact.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"test.h"
void show(struct contact *c, int len)
{
    assert(c);
    int i = 0;
    for (i = 0; i < len; i++)
    {
        printf("name:%s sex:%s age:%d telephone:%d address:%s", \
            c[i].name, c[i].sex, c[i].age, c[i].telephone, c[i].address);
        printf("\n");
    }
}
void add(struct contact *c, int len, int flag)
{
    int i = 0;
    for (i = flag; i < len; i++)
    {
        printf("输入姓名:");
        scanf("%s",&c[i].name);
        printf("输入性别:");
        scanf("%s", &c[i].sex);
        printf("输入年龄:");
        scanf("%d", &c[i].age);
        printf("输入电话号码:");
        scanf("%d", &c[i].telephone);
        printf("输入地址:");
        scanf("%s", &c[i].address);
    }
}
int Delete(struct contact *c, int d_number, int len) //删除联系人 
{
    int i = 0;
    for (i = d_number - 1; i < len - 1; i++)
    {
        c[i] = c[i + 1];
    }
}
void find(struct contact *c, int d_number, int len)
{
    if (d_number - 1 >= 0 || d_number - 1 < len)
    {
        printf("name:%s sex:%s age:%d telephone:%d address:%s", \
            c[d_number].name, c[d_number].sex, c[d_number].age, c[d_number].telephone, c[d_number].address);
        printf("\n");
    }
    else
    {
        printf("不存在");
            return;
    }
}
void empty(struct contact *c)//清空联系人
{
    int i = 0;
    for (i = 0; i < 1000; i++)
    {
        memset(c + i, 0, sizeof(struct contact));
    }
}
void modify(struct contact *c,int m_member,int len)//修改联系人
{
    char name[20];
    printf("输入要修改联系人姓名:");
    scanf("%s", name);
    for(m_member = 0; m_member < len; m_member++)
    {
        if (strcmp(c[m_member].name, name) == 0)
        {
            printf("修改的姓名为:");
            scanf("%s", &c[m_member].name); 
            printf("修改的性别为:");
            scanf("%s", &c[m_member].sex);
            printf("修改的年龄为:");
            scanf("%d", &c[m_member].age);
            printf("修改的电话为:");
            scanf("%d", &c[m_member].telephone);
            printf("修改的地址为:");
            scanf("%s", &c[m_member].address);
            break;
        }
    }
    if (m_member == len)
    {
        printf("没有此人\n");
        return; 
    }
}
int cmp(const void*a, const void*b)
{
    struct contact *aa = (struct contact *)a;
    struct contact *bb = (struct contact *)b;
    if (aa->name != bb->name)
        return (strcmp((aa->name), (bb->name)));
}
void sort(struct contact *c, int len)
{
    assert(c);
    qsort(c, len, sizeof(struct contact), cmp);

}

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"test.h"
void menu()
{
    printf("*************************\n");
    printf("*******   通讯录   ******\n");
    printf("1.Add   2.Delete   3.Find\n");
    printf("4.Empty 5.Modify   6.Sort\n");
    printf("0.Exit             7.Show\n");
    printf("*************************\n");
    printf("*************************\n");
}

int main()
{
    struct contact people[N];
    int len = 0;
    int delete_number = 0;
    int flag = 0;//定义一个标志位来表示结构体数组中每个结构体的位置
    int input;
    menu();
    while (1)
    {
        printf("请选择");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
        {
                  printf("请添加len个联系人的信息:");
                      scanf("%d", &len);
                  add(people,len+flag,flag);
                  flag = flag + len;
        }break;
        case 2:
        {
                  printf("请输入要删除第i个联系人的信息:");
                      scanf("%d", &delete_number);
                  Delete(people,delete_number,len+flag);
                  flag = flag - 1;
        }break;
        case 3:
        {
                  int find_number =0;
                  printf("请输入要查找的第i个联系人的信息:");
                  scanf("%d", &find_number);
                  find(people,delete_number,len+flag);
        }break;
        case 4:
        {
                  printf("清空所有联系人");
                  empty(people);
        }break;
        case 5:
        {
                  int m_member = 0;
                  modify(people,m_member,len+flag);
        }break;
        case 6:
        {
                  printf("根据名字排序所有人:");
                  sort(people,len+flag);
        }break;
        case 7:
        {
                  printf("打印所有人的信息:");
                  show(people,flag);
        }break;
        case 0:
        {
                  exit(1);
        }
        default:printf("输入有误!");
        }
    }
    system("pause");
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值