单链表实现通讯录

不过多赘述了

顺序表的增删查改-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/bkmoo/article/details/137566495?spm=1001.2014.3001.5502

使用顺序表实现通讯录-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/bkmoo/article/details/137676561?spm=1001.2014.3001.5502这里没有使用文件操作只是简单的使用单链表创造一次性的单链表,主要体现是单链表的使用。

首先创建头文件,用来放置函数的声明。contact.h文件,函数的功能分别是创建节点(初始化),通讯录的增删查改和展示通讯录,销毁通讯录。

contact.h代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100//前置声明
typedef struct SListNode contact;//用户数据
typedef struct PersonInfo
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}PeoInfo;struct SListNode
{PeoInfo* pival;contact* next;
};//创建节点//初始化通讯录
contact* newNode();
//添加通讯录数据
void AddContact(contact* con);
//删除通讯录数据
void DelContact(contact* con);
//展示通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact** con);
//销毁通讯录数据
void DestroyContact(contact** con);

接着创建contact.c文件放置函数功能实现的代码

创建节点,包含对节点初始化contact* newNode()

contact* newNode()
{
    contact* Node = (contact*)malloc(sizeof(contact));
    Node->pival = (PeoInfo*)malloc(sizeof(PeoInfo));
    Node->next = NULL;
    return Node;
}

要记住使用结构体指针储存数据时要分配内存空间,否则就会报错

增加联系人void AddContact(contact* con)

//添加
void AddContact(contact* con)
{
    //PeoInfo arr;
    contact* pcur = con;
    contact* newnode = newNode();
    contactadd(newnode);
    while (pcur->next != NULL)
    {
        pcur = pcur->next;
    }
    pcur->next = newnode; // 在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址
    //因此要先解引用后链接(->相当于一层解引用)
 }

先创建节点初始化,输入数据后。得到一个完整的节点后进行操作,不然就很乱,这样更容易操作。

在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址,因此要先解引用后链接(->相当于一层解引用)

这里使用到的contactadd函数是输入联系人内容的操作contactadd

void contactadd(contact* con)
{
    //PeoInfo* ret = (PeoInfo*)malloc(sizeof(PeoInfo));
    printf("请输入联系人姓名:\n");
    scanf("%s", con->pival->name);

    printf("请输入联系人性别:\n");
    scanf("%s", con->pival->sex); 

    printf("请输入联系人年龄:\n");
    scanf("%d", &(con->pival->age));

    printf("请输入联系人电话\n");
    scanf("%s", con->pival->tel);

    printf("请输入联系人地址:\n");
    scanf("%s", con->pival->addr);
}

查找操作void FindContact(contact* con)

实现查找操作要先创建一个函数用来寻找节点,方便后续的删除修改操作。一般查找联系人是以人名来找,因此还要一个name数组。

查找节点的函数contact* findContact(contact* con, char a[])

contact* findContact(contact* con, char a[])
{

    con = con->next;
    while (con != NULL)
    {
        if (strcmp(con->pival->name, a) == 0)
        {
            return con;
        }
        con = con->next;
    }
    return NULL;
}

//查找
void FindContact(contact* con)
{
    printf("请输入要查找的联系人名字:\n");
    char a[NAME_MAX];
    scanf("%s", a);

    contact* ret = findContact(con, a);
    if (ret)
    {
        printf("找到了\n");
    }
    else
    {
        printf("没找到\n");
    }

}

删除联系人

删除操作需要先找到要删除的联系人使用contact* findContact(contact* con, char a[])函数

//删除
void DelContact(contact* con)
{
    contact* pcur = con;

    printf("请输入要删除的联系人名字:\n");
    char a[NAME_MAX];
    scanf("%s", a);
    contact* ret = findContact(con, a);
    if (ret)
    {
        while (pcur->next != ret)
        {
            pcur = pcur->next;
        }
        pcur->next = ret->next;
        free(ret);
        ret = NULL;
    }
    else
    {
        printf("查无此人\n");
    }
}

修改联系人数据void ModifyContact(contact** con)

需要先找到需要修改的联系人

//修改
void ModifyContact(contact** con)
{
    contact* pcur = con;

    printf("请输入要修改的联系人名字:\n");
    char a[NAME_MAX];
    scanf("%s", a);

    contact* ret = findContact(con, a);

    if (ret)
    {
        contactadd(ret);
    }
    else
    {
        printf("查无此人\n");
    }
}

展示操作void ShowContact(contact* con)

//展示
void ShowContact(contact* con)
{
    con = con->next;
    while (con != NULL)
    {
        printf("姓名:%s ", con->pival->name);
        printf("性别:%s", con->pival->sex);
        printf("年龄:%d", con->pival->age);
        printf("电话:%s", con->pival->tel);
        printf("地址:%s", con->pival->addr);
        printf("\n");
        con = con->next;
    }
}

最后销毁链表

//销毁
void DestroyContact(contact** con)
{
    contact* pcur = *con;
    contact* perv = pcur->next;
    while (pcur)
    {
        free(pcur->pival);
        free(pcur);
        pcur = perv;
        if (pcur == NULL)
        {
            break;
        }
        perv = perv->next;
    }
}

contact.c代码

#include "contact.h"void prin(contact* con)
{con = con->next;while (con != NULL){printf("姓名:%s ", con->pival->name);printf("性别:%s", con->pival->sex);printf("年龄:%d", con->pival->age);printf("电话:%s", con->pival->tel);printf("地址:%s", con->pival->addr);printf("\n");con = con->next;}
}contact* newNode()
{contact* Node = (contact*)malloc(sizeof(contact));Node->pival = (PeoInfo*)malloc(sizeof(PeoInfo));Node->next = NULL;return Node;
}//联系人数据
void contactadd(contact* con)
{//PeoInfo* ret = (PeoInfo*)malloc(sizeof(PeoInfo));printf("请输入联系人姓名:\n");scanf("%s", con->pival->name);printf("请输入联系人性别:\n");scanf("%s", con->pival->sex); printf("请输入联系人年龄:\n");scanf("%d", &(con->pival->age));printf("请输入联系人电话\n");scanf("%s", con->pival->tel);printf("请输入联系人地址:\n");scanf("%s", con->pival->addr);
}
//添加
void AddContact(contact* con)
{//PeoInfo arr;contact* pcur = con;contact* newnode = newNode();contactadd(newnode);//先创建,初始化,输入数据后。即一个完整的节点后进行操作,不然就很乱while (pcur->next != NULL){pcur = pcur->next;}pcur->next = newnode; // 在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址//因此要先解引用后链接(->相当于一层解引用)}contact* findContact(contact* con, char a[])
{con = con->next;while (con != NULL){if (strcmp(con->pival->name, a) == 0){return con;}con = con->next;}return NULL;
}
//查找
void FindContact(contact* con)
{printf("请输入要查找的联系人名字:\n");char a[NAME_MAX];scanf("%s", a);contact* ret = findContact(con, a);if (ret){printf("找到了\n");}else{printf("没找到\n");}}
//删除
void DelContact(contact* con)
{contact* pcur = con;printf("请输入要删除的联系人名字:\n");char a[NAME_MAX];scanf("%s", a);contact* ret = findContact(con, a);if (ret){while (pcur->next != ret){pcur = pcur->next;}pcur->next = ret->next;free(ret);ret = NULL;}else{printf("查无此人\n");}
}//修改
void ModifyContact(contact** con)
{contact* pcur = con;printf("请输入要修改的联系人名字:\n");char a[NAME_MAX];scanf("%s", a);contact* ret = findContact(con, a);if (ret){contactadd(ret);}else{printf("查无此人\n");}
}//展示
void ShowContact(contact* con)
{con = con->next;while (con != NULL){printf("姓名:%s ", con->pival->name);printf("性别:%s", con->pival->sex);printf("年龄:%d", con->pival->age);printf("电话:%s", con->pival->tel);printf("地址:%s", con->pival->addr);printf("\n");con = con->next;}
}//销毁
void DestroyContact(contact** con)
{contact* pcur = *con;contact* perv = pcur->next;while (pcur){free(pcur->pival);free(pcur);pcur = perv;if (pcur == NULL){break;}perv = perv->next;}
}

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

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

相关文章

全程免费的ssl证书申请——七步实现网站https

全程免费的ssl证书申请步骤如下&#xff1a; 1 准备工作 首先确定好需要的证书类型&#xff0c;如单域名证书、通配符证书和多域名证书&#xff0c;准备好需要安装证书的域名。 2 选择CA 选择提供免费证书的服务商——JoySSL&#xff0c;并访问其官方网站&#xff0c;创建一…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域&#xff0c;3D建模和动画的需求各异&#xff0c;因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说&#xff0c;软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…

【智能算法应用】灰狼算法(GWO)在低照度图像增强中的应用

目录 1.算法原理2.数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.数学模型 对于低照度图像的增强方式可以采用非线性变换函数来对图像的灰度值进行变化&#xff0c;对于不同环境下质量不同的图像&#xff0c;可以将…

YOLOv8+PyQt5输电线路缺陷检测(目前最全面的类别检测,可以从图像、视频和摄像头三种路径检测)

1.效果视频&#xff1a;YOLOv8PyQt5输电线路缺陷检测&#xff08;目前最全面的类别检测&#xff0c;可以从图像、视频和摄像头三种路径检测&#xff09;_哔哩哔哩_bilibili 资源包含可视化的输电线路缺陷检测系统&#xff0c;可识别图片和视频当中出现的五类常见的输电线路缺陷…

python:pyqt5案例(简易浏览器)

1、上接pyqt5基础https://blog.csdn.net/weixin_73011353/article/details/138051734https://blog.csdn.net/weixin_73011353/article/details/138051734 2、基本模块 # 定义一个名为BrowserWindow的类&#xff0c;继承自QMainWindow class BrowserWindow(QMainWindow):def _…

美国电子电器产品FCC认证讲解

美国FCC认证简介 FCC全称是Federal Communications Commission&#xff0c;中文为美国联邦通信委员会。于1934年由CommunicationACT建立&#xff0c;是美国政府的一个独立机构&#xff0c;直接对国会负责。FCC通过控制无线电广播、电视、电信、卫星和电缆来协调和国际的通信。涉…

Axure琐碎细节

文章目录 琐碎细节注释预览编写原型图的时候可以把颜色改为灰色标尺竖直文字左对齐Axure中的文字怎么添加元件层级问题如何找到各种各样的形状&#xff0c;比如三角形了 五角星了 十字架了给按钮设置简单的交互动作通过锁来等比例缩放 琐碎细节 注释 有时候我们需要给我们的元…

阿里云操作日记

昨天买了一个超级便宜的阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽&#xff0c;40G ESSD Entry云盘&#xff0c;搭载一个简单的系统&#xff0c;就想到了docker轻量级&#xff0c;易于管理 其实docker很好用&#xff0c;第一步就是安装docker 一、docker安装与端口…

盲返模式:电商领域的新玩法与商业创新

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是什么是盲返模式&#xff1f; 随着互联网的深入发展&#xff0c;电商行业正面临着前所未有的机遇与挑战。在这个竞争激烈的市场环境中&#xff…

uniapp 使用地图

可以使用 map | uni-app官网 uniapp中的map标签&#xff0c;也可以自己引入地图的js 如下图 使用 uniapp中的map标签 需要注意要配置key

HTML 中创建 WebSocket服务与接收webSocket发送内容

效果图 服务端 html客户端接受的消息 接下来开始实现服务端 创建server.js const WebSocket require(ws);const wss new WebSocket.Server({ port: 8877 });wss.on(connection, function connection(ws) {console.log(WebSocket connection opened.);// 每隔 5 秒发送一次…

人耳的七个效应

1、掩蔽效应 • 人们在安静环境中能够分辨出轻微的声音&#xff0c;即人耳对这个声音的听域很低&#xff0c;但在嘈杂的环境中轻微的声音就会被淹没掉&#xff0c;这时将轻微的声音增强才能听到。 • 这种在聆听时&#xff0c;一个声音的听阈因另一声音的出现而提高的现象&…

2.搭建增长模型-福格行为模型

福格行为模型 Bmat B为行动 m是动机 a是能力 t是触发 mat三者是同时出现的 比如连续签到30天&#xff0c;才送1天会员&#xff0c;这明摆着欺负人&#xff0c;用户难有积极性 但是签到即可或者会员1天&#xff0c;连续30天送30天&#xff0c;这样用户每天都会积极的来签到&…

【数据结构】哈希桶

目录 前言&#xff1a; 开散列&#xff08;哈希桶&#xff09; 开散列的概念 哈希桶的模拟实现 整体框架 查找 插入 删除 析构函数 前言&#xff1a; 闭散列线性探测缺点&#xff1a;一旦发生哈希冲突&#xff0c;所有的产生哈希冲突的数据连续存储在一块区域&#xff…

ios微信小程序禁用下拉上拉

第一步&#xff1a; page.json配置页面的"navigationStyle":"custom"属性&#xff0c;禁止页面滑动 "navigationStyle":"custom" 第二步&#xff1a; 页面里面使用scroll-view包裹内容&#xff0c;内容可以内部滑动 <view class&…

Oracle中rman使用记录

最近在项目中&#xff0c;遇到使用RMAN的操作来恢复数据库中某个时间归档日志&#xff0c;RMAN的原理和理解&#xff0c;网友们百度了解一下。我重点将实操部分了。直接上实验环节&#xff0c;让网友更懂。&#xff08;特别提醒&#xff1a;我是1:1用VMware克隆数据库进行RMAN还…

如何看待AIGC技术

目录 1.概述 2.技术应用 2.1.媒体与内容创作 2.2.教育与学习 ​​​​​​​2.3.艺术创作 ​​​​​​​2.4.游戏产业 ​​​​​​​2.5.工业设计 ​​​​​​​2.6.对未来社会的影响 2.7.可能的发展方向 ​​​​​​​2.8.小结 3.伦理与风险 3.1.AIGC技术面临…

零基础HTML教程(26)--表单元素标注

文章目录 1. 引子2. 使用标注3. 元素的id与name4. 更好的写法5. 小结 1. 引子 我们看一个表单&#xff1a; <form>姓名&#xff1a;<input type"text"><br>手机号:<input type"text"><br>年龄:<input type"text&qu…

MES管理系统工单管理模块的重要性

在现代制造企业中&#xff0c;MES管理系统作为生产流程管理的核心&#xff0c;工单模块则扮演着不可或缺的角色。它不仅是MES管理系统的基石&#xff0c;更是连接各个生产环节的纽带&#xff0c;确保生产流程的顺畅与高效。 首先&#xff0c;我们需要明确MES管理系统在制造企业…

深度解析 Spring 源码:揭秘BeanFactory 之谜

文章目录 一、认识BeanFactory1.1 BeanFactory的概述1.2 BeanFactory与 ApplicationContext的区别 二、BeanFactory源码解读2.1 BeanFactory 接口2.1.1 getBean()2.1.2 containsBean()2.1.3 isSingleton() 2.2 DefaultListableBeanFactory 类2.2.1 registerBeanDefinition()2.2…