【C/C++】课程设计:通讯录管理系统源码,C语言链表实现

news2025/1/13 5:09:54

大家好呀,亲爱的小伙伴们!你们今天有在编写代码吗?

如果有熟悉的小伙伴看到我,就会知道又到了学习源码项目的好时机了!没错,今天要分享的同样是一个经典的管理系统项目:通信录管理系统!我们一起来探索一下吧!

涉及知识领域:C语言,链表数据结构

开发所需工具:Visual Studio 2022/2019(如果没有安装这款软件,也可以点击获取哦)

完成一个通讯录管理系统,具体要求如下:

1. 建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等

2. 能够提供添加、删除和修改通讯录信息的功能

3. 能够提供安不同方式查询的功能;如按姓名或年龄、电话等查询

4. 将通讯录保存在文件中

5. 能够按表格方式输出通讯录信息

6. 退出程序


也不说太多多余的话了,先看一下效果图:

 为了照顾那些想要快速完成项目设计的同学,咱们就不进行源码的解析了,直接上全部源码吧!

源码分享:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    char num[6];   // 将编号数组大小修改为6,以容纳字符串结尾的'\0'
    char name[10]; // 将姓名数组大小修改为10,以容纳字符串结尾的'\0'
    char sex[4];   // 将性别数组大小修改为4,以容纳字符串结尾的'\0'
    char phone[14]; // 将电话数组大小修改为14,以容纳字符串结尾的'\0'
    char addr[32]; // 将地址数组大小修改为32,以容纳字符串结尾的'\0'
} DataType;

typedef struct node
{
    DataType data;
    struct node* next;
} ListNode;

typedef ListNode* LinkList;

void CreateList(LinkList* L, int m)
{
    int i;
    LinkList s, r;
    *L = (LinkList)malloc(sizeof(ListNode));
    (*L)->next = NULL;
    r = *L;

    for (i = 0; i < m; i++)
    {
        s = (LinkList)malloc(sizeof(ListNode));
        printf("输入第%d位编号:", i + 1);
        scanf("%5s", s->data.num); // 读取最多5个字符到编号数组
        printf("\n输入姓名:");
        scanf("%9s", s->data.name); // 读取最多9个字符到姓名数组
        printf("\n输入性别:");
        scanf("%3s", s->data.sex); // 读取最多3个字符到性别数组
        printf("\n输入电话:");
        scanf("%13s", s->data.phone); // 读取最多13个字符到电话数组
        printf("\n输入地址:");
        scanf("%31s", s->data.addr); // 读取最多31个字符到地址数组
        s->next = NULL;
        r->next = s;
        r = s;
    }
}

int ListLength(LinkList L)
{
    LinkList p;
    int length = 0;
    p = L->next;
    while (p)
    {
        length++;
        p = p->next;
    }
    return length;
}

int ListInsert(LinkList* L, int i, DataType d)
{
    LinkList p, s;
    int length;
    length = ListLength(*L);
    p = (*L)->next;
    int j = 1;
    if (!p || i > length + 1)
        return 0;
    while (p && j < i - 1)
    {
        p = p->next;
        j++;
    }
    s = (LinkList)malloc(sizeof(ListNode));
    s->data = d;
    s->next = p->next;
    p->next = s;
    return 1;
}

int ListDelete(LinkList* L, int i)
{
    LinkList p, q;
    p = *L;
    int j = 0;
    int length;
    length = ListLength(*L);
    if (!p || i > length)
        return 0;
    while (p && j < i - 1)
    {
        p = p->next;
        j++;
    }
    q = p->next;
    printf("\n被删除的人员信息为:\n");
    printf("\n编号:%s  姓名:%s  性别:%s  电话:%s 地址:%s", q->data.num, q->data.name, q->data.sex, q->data.phone, q->data.addr);
    p->next = q->next;
    free(q);
    return 1;
}

int GetElem(LinkList L, int i, DataType* d)
{
    LinkList p;
    p = L->next;
    int j = 1;
    int length;
    length = ListLength(L);
    if (!p || i > length)
        return 0;
    while (j < i)
    {
        p = p->next;
        j++;
    }
    *d = p->data;
    return 1;
}

void print(LinkList L)
{
    LinkList p;
    p = L->next;
    while (p)
    {
        printf("\n编号:%s  姓名:%s  性别:%s  电话:%s 地址:%s", p->data.num, p->data.name, p->data.sex, p->data.phone, p->data.addr);
        p = p->next;
    }
}

void menu()
{
    printf("--------------------------------------------1.通讯录链表的建立----------------------------------------------------------");
    printf("\n--------------------------------------------2.通讯者节点的插入----------------------------------------------------------");
    printf("\n--------------------------------------------3.通讯者节点的查询----------------------------------------------------------");
    printf("\n--------------------------------------------4.通讯者节点的删除----------------------------------------------------------");
    printf("\n--------------------------------------------5.通讯录链表的输出----------------------------------------------------------");
    printf("\n--------------------------------------------0.退出管理系统--------------------------------------------------------------");
}

int main()
{
    LinkList L;
    DataType d, d1;
    int m, location, length, choose;
    menu();
p:
    printf("\n请输入你的选项:");
    scanf("%d", &choose);

    switch (choose)
    {
    case 1:
        printf("请输入通讯录人数:");
        scanf("%d", &m);
        CreateList(&L, m);
        goto p;
    case 2:
        printf("\n输入要插入的位置:");
        scanf("%d", &location);
        printf("输入插入人员的编号:");
        scanf("%5s", d.num);
        printf("\n输入姓名:");
        scanf("%9s", d.name);
        printf("\n输入性别:");
        scanf("%3s", d.sex);
        printf("\n输入电话:");
        scanf("%13s", d.phone);
        printf("\n输入地址:");
        scanf("%31s", d.addr);
        ListInsert(&L, location, d);
        goto p;
    case 3:
        printf("\n请输入查询位置");
        scanf("%d", &location);
        GetElem(L, location, &d);
        printf("查询到的人员信息为:\n");
        printf("\n编号:%s  姓名:%s  性别:%s  电话:%s 地址:%s", d.num, d.name, d.sex, d.phone, d.addr);
        goto p;
    case 4:
        printf("\n输入要删除的位置:");
        scanf("%d", &location);
        ListDelete(&L, location);
        goto p;
    case 5:
        print(L);
        goto p;
    case 0:
        printf("系统已退出。");
        break;
    default:
        printf("输入错误,请重新输入");
        goto p;
    }

    return 0;
}

通讯录管理系统就到此结束啦,大家赶紧试试吧!如果遇到C语言/C++学习问题无法解决,可以来我下方粉丝群交流提问!

粉丝群:(同时也是更多源码素材获取通道):点击加入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/945017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白学Linux都能学会

文章目录 1. 初识Linux1.1 操作系统1.2 Linux发展历程1.3 Linux简介1.3.1 什么是 Linux1.3.2 Linux的特点 1.4 Linux和Unix区别1.5 Linux和Windows区别1.6 Linux发行商和常见发行版1.7 Linux 应用领域**1.8 Linux之CentOS**1.9 总结 2. 系统与设置命令2.1 学习命令的原因2.2 Li…

7天GMV达220万美元!TikTok Shop爆品榜出炉。

7天GMV达220万美元&#xff01;TikTok Shop爆品榜出炉 8月28日消息&#xff0c;据跨境指南联合TikTok数据分析平台EchoTik发布的数据&#xff0c;监测了上周TikTok Shop印尼、马来西亚、泰国、美国市场GMV前10的商品。上周在印尼市场GMV排名前10的商品中&#xff1a;FREE ONGK…

Kotlin协程flow缓冲buffer

Kotlin协程flow缓冲buffer 先看一个普通的flow&#xff1a; import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.runBlocking import kotlin.system.measureTimeMillisfun main(args: Array<String>) {val delayTime 100Lru…

初试nacos服务注册中心

项目基本流程是想获取订单信息的同时获取用户信息&#xff0c;所以order服务提供nacos获取user服务提供的用户信息。 启动nacos服务 在bin目录下的cmd命令行下执行 startup.cmd -m standalone 单机部署 启动服务 服务注册到nacos Nacos是SpringCloudAlibaba的组件&#xff0c…

Yolov8小目标检测(12):动态稀疏注意力BiFormer | CVPR 2023

💡💡💡本文改进:动态稀疏注意力,cvpr2023。 BiFormer | 亲测在红外弱小目标检测涨点,map@0.5 从0.755提升至0.758 💡💡💡Yolo小目标检测,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,带你轻松实现小…

【GPT,Flask】用Python Flask结合OpenAI的GPT API构建一个可自主搭建的内容生成应用网站

【背景】 自己构建模型并进行训练需要很高的知识,技能和资源门槛。如今,通过OpenAI提供的API,则可以快速通过GPT能力构建可以提供内容生成服务的在线网站。这套框架可以提供给用户,用户可以利用该框架在自己的环境(比如自己的公司内)构建内容生成服务。你也可以自己上线…

【C++入门】模版初阶(泛型编程)

目录 1.泛型编程2.函数模版2.1函数模版的概念2.2函数模版的使用2.3函数模版的原理2.4函数模版的实例化2.5 模板参数的匹配原则 3.类模版3.1类模版的定义格式3.2类模版的实例化 1.泛型编程 让我们思考一个小问题&#xff1a;如何实现一个通用的交换函数呢&#xff1f; 在解决这…

自动泊车的自动驾驶控制算法

1. 自动泊车系统 自动泊车系统(AutomatedParkingASSiSt,APA)利用车辆搭载的传感器感知车辆周边环境,扫描满足当前车辆停放的障碍物空间车位或线车位,并通过人机交互(HumanMachine Interface,HMI)获取驾驶员对目标车位的选择或自动确定目标车位,自动规划泊车路径,通过控制器向车…

【C++笔记】C++内存管理

【C笔记】C内存管理 一、C中动态内存申请的方式二、new和delete的实现原理2.1、operator new和operator delete函数 一、C中动态内存申请的方式 在C语言中我们需要动态申请空间的时候我们通常都是用malloc函数&#xff0c;但是malloc函数对自定义类型是没什么问题的&#xff0…

ATA-2161高压放大器的电子实验案例(案例合集)

ATA-2161是一款理想的可放大交直流信号的单通道高压放大器。最大差分输出1600Vp-p(800Vp)高压&#xff0c;可以驱动高压型负载。凭借其优异的指标参数受到不少电子工程师的喜欢&#xff0c;其在电子实验中的应用也非常频繁&#xff0c;下面为大家整理出ATA-2161高压放大器的应用…

无涯教程-Android - Intents/Filters

Android Intent 是要执行的操作的抽象描述。它可以与 startActivity 一起启动Activity&#xff0c;将 broadcastIntent 发送给任何BroadcastReceiver组件&#xff0c;并与 startService(Intent)或 bindService(Intent&#xff0c;ServiceConnection&#xff0c;int)与后台服务进…

jq——点击显示隐藏来回切换、图片来回切换

案例展示 案例代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>显示隐藏</title></head><script src"js/jquery.js"></script><style>.switch {width: 50px;height: 50px;…

antd table minHeight

网上常见设置antd table最小宽度的方案&#xff1a; 这种方法也不是不可以&#xff0c;但是若需要动态设置最小高度的话&#xff0c;这样写就不是很合适。 所以这边选择动态计算table高度的方法来实现&#xff1a; 第一步&#xff1a;计算table scroll height const getTab…

「CSS|前端开发|页面布局」03 开发网站所需要知道的CSS:如何实现你想要的页面布局

本文主要介绍如何分析页面布局&#xff0c;了解HTML标签元素的默认布局以及如何修改标签元素的布局方式&#xff0c;最终能够结合CSS框架实现任意我们看到或者想到的页面布局。 文章目录 本系列前文传送门一、场景说明二、页面布局设计逻辑三、CSS布局编写逻辑HTML元素的默认布…

【附安装包】CorelCAD2023安装教程

软件下载 软件&#xff1a;CorelCAD版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;534.17M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.bai…

证券型代币成为新焦点!交易上链,合规也要上链?

“数字化正在使传统行业的边界变得模糊&#xff0c;这是一场真正的金融革命。”麦肯锡早在2017年的《在没有边界的世界中竞争》报告中就以此形容了数字化浪潮。随着对虚拟资产的全球接受度增加&#xff0c;监管机构也开始对其潜力展开讨论。 当代币被视为金融工具时&#xff0c…

java对时间序列每x秒进行分组

问题&#xff1a;将一个时间序列每5秒分一组&#xff0c;返回嵌套的list&#xff1b; 原理&#xff1a;int除int会得到一个int&#xff08;也就是损失精度&#xff09; 输入&#xff1a;排序后的list&#xff0c;每几秒分组值 private static List<List<Long>> get…

Yolov8-pose关键点检测:模型轻量化创新 | PConv结合c2f | CVPR2023 FasterNet

💡💡💡本文解决什么问题:新的partial convolution(PConv),通过同时减少冗余计算和内存访问可以更有效地提取空间特征。 PConv| GFLOPs从9.6降低至8.5,参数量从6482kb降低至6134kb, mAP50从0.921提升至0.925 Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.n…

Centos7.9安装ElasticSearch6

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,同时也可以作为一个近实时的数据存储系统。接下来我们快速安装一个集群模式的ES. ## 1.安装JDK1.8 mv jdk-8u301-linux-x64.tar.gz /usr/local/ cd /usr/local/ …