c语言动态内存开辟实现通讯录系统-链表

C语言通讯录系统的增删改查实现 在C语言开发的历史长河中,它以其强大的系统调用能力和灵活性,被广泛应用于系统编程和嵌入式开发。C语言的这些特点,使得它在需要高效内存管理和直接硬件操作的通讯录系统中,依然占据着重要的地位。结构体是C语言中一种复合数据类型,它允许将不同类型的数据项组合成一个单一的类型。在通讯录系统中,结构体可以用来创建一个具有多个属性的“联系人”类型,这些属性可能包括姓名、电话号码、电子邮箱等信息。通过结构体,我们能够以一个统一的方式来处理这些不同的信息。// 定义一个联系人结构体。 阅读详情

通讯录

实现一个通讯录系统含有:添加,删除,查找,展示,退出等功能。

 

思路

  • 创建一个person结构体包含
    name;phone;age 等信息;还需一个结构体指针
  • 因为要以链表的方法(动态内存开辟)来写,所以在结构细中还需要一个结构体指针来存储下一个结构体变量的地址,这样就可以连续不断的找到下一个人的信息
struct Person{
    char name[16];
    char phone[11];
    short age;
    struct Person *next;    //结构体指针,存储下一个结构体变量的地址
};
  • 用字符数组存储电话号码,因为电话号码的每位都是0~9,用字符数组足以

画一个图帮助理解
这里写图片描述
- 这样一直延续,最后一个结构体内存空地址,这样就将分散的每个结构体变量连了起来,这就是链表。
 

代码

 

框架

int main()
{
    int choice = 0;
    struct Person *head = NULL;    //保存最开始的结构体变量地址
    do
    {
        menu();                    //展菜单函数
        printf("请输入指令:");
        scanf("%d",&choice);
        switch (choice) {
            case 1:
                //添加
                init(&head);
                break;
            case 2:
                //展示
                show(head);
                break;
            case 3:
                //查找
                find(head);
                break;
            case 4:
                //删除
                delete(&head);
                break;
            case 0:
                //退出
                printf("已退出!\n");
            default:
                break;
        } 

    }while (choice);

    return 0;
}

展示菜单

void show(const struct Person *ph)
{
    while (ph != NULL)
    {
        printf("name:%s\n",ph->name);
        printf("phone:%s\n",ph->phone);
        printf("age:%hd\n",ph->age);
        ph = ph->next;
    }
}

添加功能

  • 动态开辟一个person结构体变量,将本次开辟的地址放到上一次中,结构体内的next存下一次开辟的地址。
  • 因为要改变head指向的内容所以需要用二级指针
void init(struct Person **ph)
{
    struct Person *p = malloc(sizeof(struct Person));
    printf("name:");
    scanf("%s",p->name);
    printf("phone:");
    scanf("%s",p->phone);
    fflush(stdin);
    printf("age:");
    //fflush(stdin);
    scanf("%hd",&p->age);
    p->next = NULL;
    if (*ph == NULL)   
    //ph为空说明本次就是第一次开辟,所以将head改为p
    {
        *ph = p;                
    }
    else     
    {
        struct Person *tmp = *ph; 
        //循环找到结尾的结构体变量,即next为空的那个。
        while (tmp->next != NULL){
            tmp = tmp->next;}      
        //将next改为本次的p,将上一次的结尾和这次连起来
        tmp->next = p;
    }
}

展示功能

void show(const struct Person *ph)
{
    while (ph != NULL)
    {
        printf("name:%s\n",ph->name);
        printf("phone:%s\n",ph->phone);
        printf("age:%hd\n",ph->age);
        ph = ph->next;
    }
}

查找功能

int find(struct Person *ph)
{
    char name[16];
    printf("请输入要查找的姓名:");
    scanf("%s",name);
    while (ph != NULL)
    {
        if (strcmp( ph->name, name) == 0 )
        {
            printf("name:%s\n",ph->name);
            printf("phone:%s\n",ph->phone);
            printf("age:%hd\n",ph->age);
            return 1;
        }
        ph = ph->next;
    }
    printf("查无此人\n");
    return 0;
}

删除功能

int delete(struct Person **ph)
{
    char name[16];
    struct Person *p1 = *ph;
    struct Person *p2 = NULL;
    printf("请输入要删除的姓名:");
    scanf("%s",name);

    while (p1 != NULL)
    {
        if (strcmp( p1->name, name) == 0 )
        {
            break;
        }
        p2 = p1;
        p1 = p1->next;
    }
    if (p2 == NULL)
    {
        *ph = p1->next;
        free(p1);
    }
    else
    {
        p2->next = p1->next;
        free(p1);
    }

    return 0;
}

 

整体代码及结果展示

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

struct Person{
    char name[16];
    char phone[11];
    short age;
    struct Person *next;
};
void init(struct Person **ph)
{
    struct Person *p = malloc(sizeof(struct Person));
    printf("name:");
    scanf("%s",p->name);
    printf("phone:");
    scanf("%s",p->phone);
    fflush(stdin);
    printf("age:");
    //fflush(stdin);
    scanf("%hd",&p->age);
    p->next = NULL;
    if (*ph == NULL)
    {
        *ph = p;
    }
    else
    {
        struct Person *tmp = *ph;
        while (tmp->next != NULL){
            tmp = tmp->next;}
        tmp->next = p;
    }


}
void show(const struct Person *ph)
{
    while (ph != NULL)
    {
        printf("name:%s\n",ph->name);
        printf("phone:%s\n",ph->phone);
        printf("age:%hd\n",ph->age);
        ph = ph->next;
    }
}
int find(struct Person *ph)
{
    char name[16];
    printf("请输入要查找的姓名:");
    scanf("%s",name);
    while (ph != NULL)
    {
        if (strcmp( ph->name, name) == 0 )
        {
            printf("name:%s\n",ph->name);
            printf("phone:%s\n",ph->phone);
            printf("age:%hd\n",ph->age);
            return 1;
        }
        ph = ph->next;
    }
    printf("查无此人\n");
    return 0;
}
int delete(struct Person **ph)
{
    char name[16];
    struct Person *p1 = *ph;
    struct Person *p2 = NULL;
    printf("请输入要删除的姓名:");
    scanf("%s",name);

    while (p1 != NULL)
    {
        if (strcmp( p1->name, name) == 0 )
        {
            break;
        }
        p2 = p1;
        p1 = p1->next;
    }
    if (p2 == NULL)
    {
        *ph = p1->next;
        free(p1);
    }
    else
    {
        p2->next = p1->next;
        free(p1);
    }

    return 0;
}
void menu()
{
    printf("+------------------------+\n");
    printf("+        通讯录系统       +\n");
    printf("+    1.添加   2.展示      +\n");
    printf("+    3.查找   4.删除      +\n");
    printf("+    0.退出               +\n");
    printf("+------------------------+\n");

}
int main()
{
    int choice = 0;
    struct Person *head = NULL;
    do
    {
        menu();
        printf("请输入指令:");
        scanf("%d",&choice);
        switch (choice) {
            case 1:
                //添加
                init(&head);
                break;
            case 2:
                //展示
                show(head);
                break;
            case 3:
                //查找
                find(head);
                break;
            case 4:
                //删除
                delete(&head);
                break;
            case 0:
                //退出
                printf("已退出!\n");
            default:
                break;
        }

    }while (choice);

    return 0;
}

结果
这里写图片描述

C语言实现通讯录系统源码解析与实战 每个联系人都有姓名、电话、邮箱、地址……这些都该放在哪?当然是一个统一的结构里!// 姓名// 电话// 邮箱// 地址int age;// 年龄// 性别 ('M'/'F')} Contact;工欲善其事,必先利其器 🔧。常用工具:Valgrind:Linux 下最强内存调试神器:GCC/Clang 自带,编译时注入检测静态分析器(如 Clang Static Analyzer)如果你在写一个高频通讯录服务,每秒创建销毁几千个联系人,会成为瓶颈。 阅读详情

相关推荐

C语言实现个人通讯录管理系统项目实战

通讯录管理系统是C语言中一个经典且实用的综合项目,它涵盖了结构体、链表、文件操作、内存管理、函数指针等核心编程技术。本章将从整体角度出发,介绍通讯录系统的开发背景、功能需求、技术选型以及项目目标,为后续章节的深入讲解奠定基础。通过本项目,读者将理解为什么选择C语言来实现此类系统,并对项目整体结构有初步认知,掌握从数据结构设计到功能模块划分的完整开发流程。链表是一种线性数据结构,由多个节点组成。每个节点包含两个部分:数据域:用于存储数据;指针域:用于指向下一个节点。

weixin_35815766的博客 633

通讯录(链表实现)

通讯录链表实现

ajl2003的博客 1567

用链表实现一个简单的通讯录管理系统

摘 要 本课程设计主要解决对于个人的通讯录,对同学,朋友信息进行管理的问题,通过建立一个相容,一致,易查的同学信息管理系统,实现对好友信息的插入,删除,显示和查询。在本课程设计中,系统开发平台为Windows2000,程序设计语言为C++,程序运行平台为Windws 98/2000/XP。在程序设计中采用了单链表和文件相结合的方法实现对学生成绩管理。程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在实际中解决问题。 关键词 程序设计;通讯录; C++;单链表

C语言大一课设 图书管理系统 链表 动态开辟内存

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #define LEN sizeof(struct book) struct book { char book_name[20]; int number; int count; struct book* next; }; int.

qq_50119037的博客 787

用数据结构-链表实现通讯录管理系统

该程序采用C语言,利用到数据结构-链表的相关知识实现通讯录管理系统,用文本方式存储数据。

用单链表建立的通讯录管理系统

问题描述:设计一个计算机程序,实现通讯录管理。 设计要求: 1.设计一个含有6个菜单项的主控菜单,这6个菜单项的内容和输入提示如下: 1 通讯录链表的建立 2 通讯者结点的插入 3 通讯者结点的查询 4 通讯者结点的删除 5 通讯录链表的输出 0 退出管理系统 请选择0~5: 2.使用数字0~5来选择菜单项,其它输入则不起作用。

用链表来实现通讯录并保存到文件中

| # 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可

qq_53505979的博客 6513

C语言通讯录链表

C语言版通讯录链表,增删改查都已实现,健壮性还不够完善

C语言通讯录的实现(动态链表)

C语言通讯录的实现(动态链表) 编译器VS2017 AddressList.h #pragma once #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct AddressList { char sex; int age; char Tel[20]; cha...

爱上小公举 861

单链表实现通讯录管理系统

用单链表实现通讯录管理系统,数据结构充分应用其中

用链表实现的一个电话本小程序

自己用链表实现的一个简单的电话本,拥有增删改查等功能,适合新手们参考,并且写入了文件功能,具体功能自己体验吧

c语言实现的通讯录系统

#include #include #include //包含字符串函数 使用memest 来对变量进行初始化 //采用define 来定义常量 #define MAX_NAME 11 //名字最大长度 #define MAX_SEX 3 //性别 #define MAX_BIRTHDAY 9 //生日 #define MAX_TEL 21 /

scucszyy的专栏 715

ArcGIS符号库下载 | 制图规范、三调、1:1万地形图、土地利用总体规划图.....

最近整理了一些符号库 涉及的类型比较多 包含有三调的(二调的也加上去了),一些点线面符号库,1:1万地形图,1:5万土地利用,土地利用总体规划图

qq_43173805的博客 2万+

C语言链表实现通讯录系统:数据结构课程设计实战指南

数据结构是计算机科学的核心基础,它研究数据的组织、存储与操作方式,直接影响程序的效率与性能。其中,链表作为一种动态数据结构,通过节点与指针实现元素的非连续存储,在插入与删除操作上具有显著优势。掌握链表原理对于深入理解内存管理、指针操作及算法复杂度至关重要,其技术价值在于能够灵活处理动态数据集,是构建高效、可扩展应用的基础。在众多应用场景中,课程设计项目如通讯录系统,常被用作链表技术的经典实践案例。本文聚焦于使用C语言和单链表实现一个功能完整的通讯录系统,深入探讨了内存管理、文件操作等关键实现细节,并针对内存

weixin_32576389的博客 215

深入浅出:利用NXP S32K3xx的HSE模块实现OTA双分区(AB Swap)与安全回滚

本文深入解析NXP S32K3xx HSE模块在汽车电子OTA双分区架构中的工程实践,详细介绍了HSE模块如何通过AB Swap双分区机制实现固件安全升级与毫秒级回滚。内容涵盖内存重映射硬件原理、分区切换异常处理及寄存器级诊断方法,为开发高可靠嵌入式系统提供实战指导。

weixin_30919429的博客 793

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1344

C语言:动态内存管理

文章包含内存管理函数malloc,free,realloc,calloc以及相关内存常见错误和柔性数组的内容.

想学好c++的oMen的博客 407

Uni-App推送踩坑实录:从云函数URL化到后台推送失效,我都经历了什么

本文详细记录了Uni-App开发者在接入uni-push 2.0时遇到的推送失效问题,从云函数URL化到后台推送失效的完整排查过程。通过系统化分析和与官方沟通,最终找到解决方案,并分享了预防措施与最佳实践,帮助开发者避免类似问题。

weixin_42552716的博客 486

C语言动态内存通讯录实现:从malloc到realloc的完整项目指南

在C语言编程中,动态内存管理是核心技能之一,它通过malloc、realloc、free等函数实现运行时内存的按需分配与释放。这一机制解决了静态数组固定大小的局限性,提升了程序的灵活性与资源利用率。其技术价值在于培养开发者对内存的精细控制能力,避免内存泄漏,这是系统编程和性能优化的重要基础。动态内存管理广泛应用于数据结构实现、操作系统开发及嵌入式系统等场景。本文以通讯录管理系统为例,深入讲解如何利用动态内存实现联系人数据的动态扩容与高效管理,其中realloc函数是实现容量动态调整的关键,而结构体与指针的配

weixin_32075843的博客 228

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 694

KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解

在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩

weixin_42519985的博客 251

基于C语言的个人通讯录系统

本次系统程序全程采用dev—C++去开发,编译,调试。 2. 系统基本实现通信录的显示、添加、删除、查询、修改功能及基本实现联系人,电话号码,备注等条件去查询通讯录成员的方法以及拥有较良好的交互界面。 本次系统采用结构体加指针即链表实现。

m0_55709044的博客 1085

【深度学习新浪潮】OpenClaw跟机器人行业有哪些很好的研究结合点?

OpenClaw正通过"AI大脑+机器人肢体"的深度融合,重新定义机器人与人类的交互方式和自主操作能力。近期ROSClaw框架发布、人形机器人集成和空间计算试验等进展,标志着OpenClaw已从概念验证阶段进入实际应用落地期,为机器人行业带来了自然语言控制普及化具身智能平民化和跨平台开发标准化三大变革机遇。

专注:太空算力、AI infra、异构调度、大模型成本工程 228

C语言链表实现通讯录:从数据结构到文件存储的完整实践

数据结构是计算机科学的核心基础,它定义了数据的组织、存储和操作方式。链表作为一种经典的动态数据结构,通过节点和指针实现了内存的按需分配与高效管理,在程序运行时灵活调整数据规模。掌握链表不仅深化了对指针和内存管理的理解,更是实现复杂数据操作的关键技术。在工程实践中,链表常被用于实现通讯录、任务队列、缓存系统等需要频繁增删数据的场景。本文以C语言链表实现通讯录系统为例,详细解析了结构体定义、节点操作、内存管理及数据持久化等关键技术点,并针对输入缓冲区处理、指针边界条件和文件格式鲁棒性等常见陷阱提供了实用的避坑指

weixin_31742871的博客 305

openwrt之luci通信原理(一)

从模板中分离,每个LuCI2子页面也需要一个定义并存放在/www/luci2/view/目录下的一个视图,视图是使用了子页面特定对象的L.ui.view扩展的JavaScript文件。有一点需要注意的是需要提供execute方法,创建视图失败有几种原因,特别是当它需要ubus加载额外的数据使用的时候。所以在execute方法中提供成功或者失败的信息是有意义的。不幸的是在异步方法加载特定数据的时候,不能简单的返回true或false,解决的方法是返回一个Promise对象来运行推迟提供是否成功的信息。

1150

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C语言项目实战:从零构建健壮命令行通讯录系统

数据结构是计算机科学的核心基础,它定义了数据的组织、存储与操作方式,直接影响程序的效率与可维护性。链表作为一种经典的动态数据结构,通过节点与指针实现元素的线性存储,在内存分配上具有灵活性,尤其适合频繁插入与删除的场景。掌握链表操作不仅能深化对指针与内存管理的理解,更是实现高效数据管理的关键技术。在工程实践中,将链表与文件I/O结合,可实现数据的持久化存储,这是许多实际应用(如通讯录、缓存系统)的常见模式。本文以【单链表】和【二进制文件】为核心,通过一个完整的命令行通讯录项目,详细解析如何利用链表管理联系人数

weixin_42116058的博客 244

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: c实现通用冒泡排序
下一篇: 有规律的二维数组中查找一个数
Ruichen_L
博客等级 码龄9年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值