单链表实现通讯录

news2025/1/14 20:30:31

不过多赘述了

顺序表的增删查改-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.coloradmin.cn/o/1623401.html

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

相关文章

施耐德EOCR-DS3-60S电机保护器 5-60A 24-240VAC/DC

三和EOCR株式会社是韩国的电动机保护器生产企业&#xff0c;公司由金仁锡博士&#xff08;施耐德电气集团韩国执行官&#xff09;于1981年建立。 2001年&#xff0c;为了把企业发展成性的、战略性企业&#xff0c;随后加入了法国施耐德电气集团公司。 EOCR主要产品有电子式电…

没有文件服务器,头像存哪里合适

没有文件服务器&#xff0c;头像存哪里合适 1. 背景 之前有同学私信我说&#xff0c;他的项目只是想存个头像&#xff0c;没有别的文件存储需求&#xff0c;不想去用什么Fastdfs之类的方案搭建文件服务器&#xff0c;有没有更简单且无需后期维护的方案&#xff0c;我喝了一口…

MP2110A Anritsu 安立 采样示波器 眼图设备 简述

MP2110A是一款集成了误码率测试仪&#xff08;BERT&#xff09;和采样示波器的一体化测量仪器&#xff0c;主要用于光学模块的误码率&#xff08;BER&#xff09;测量、眼图分析等评估操作。它支持从10G到800G的光学模块制造过程中的检测分91522。MP2110A内置4通道采样示波器&a…

【InternLM实战营---第七节课笔记】

一、本期课程内容概述 本节课的主讲老师是【曹茂松、刘卓鑫】。教学内容主要包括以下三个部分&#xff1a; 1.大模型评测的背景 2.大模型评测工具OpenCompass的介绍 3.OpenCompass实战 二、学习收获 为什么要研究大模型的评测&#xff1f; 首先&#xff0c;研究评测对于我们全…

Spring Boot框架强大的事件驱动模型(ApplicationEvent)

文章目录 前言应用场景异步处理事务边界外的操作跨微服务通信系统监控与日志聚合UI更新生命周期管理工作流或业务流程缓存同步 小试牛刀定义事件实现事件处理器注册事件处理器发布事件测试事件 写在最后 前言 在Spring Boot应用中&#xff0c;事件处理器是指那些处理特定类型事…

SCP收容物121~130

注 &#xff1a;此文接SCP简介以及116~120的介绍,本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-121 scp-122 scp-123 scp-124 …

webpack面试题(持续汇总ing。。。)

webpack的编译过程 初始化 此阶段&#xff0c;webpack会将CLI参数、配置文件、默认配置进行融合&#xff0c;形成一个最终的配置对象。对配置的处理过程是依托一个第三方库 yargs 完成的。此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备目前&#xff0c;…

IDEA左右两侧的Project,Structure,Maven等按钮消失

目录 问题描述解决方法 问题描述 学习的时候 左右两侧没有这些按钮感觉切换很不方便 之前每次加载MAVEN都要在View里手动把他点出来 解决方法 选择File-Settings

文化旅游3D数字孪生可视化管理平台推动文旅产业迈向更加美好的未来

随着数字化、智能化管理成为文旅产业发展的必然趋势&#xff0c;数字孪生公司深圳华锐视点创新性地推出了景区三维可视化数字孪生平台&#xff0c;将线下的实体景区与线上的虚拟世界完美融合&#xff0c;引领智慧文旅新潮流。 我们运用先进的数字孪生、web3D开发和三维可视化等…

树莓派学习笔记--Wiring Pi库的安装

前言 在刚开始学习树莓派的时候&#xff0c;新版本操作系统与旧版本有一定的区别&#xff0c;就导致跟着网上的教程来出现了很多问题&#xff0c;然后网上新操作系统的教程又很少&#xff0c;就导致前些时间学习一直没有进展。最近终于是把这些问题解决了。所以记录下来这些东西…

怎么办xgp会员一年多少钱xgp会员怎么开轻松教你xgp会员开通教程

怎么办&#xff1f;xgp会员一年多少钱&#xff1f;xgp会员怎么开&#xff1f;轻松教你xgp会员开通教程 XGP平台是由微软公司开发的xbox游戏平台的pc版本&#xff0c;为电脑玩家提供了一个游玩微软游戏的平台&#xff0c;XGP平台因其独特的会员服务而广受玩家们好评&#xff0…

windows本地提权--dll劫持不带引号的服务不安全的服务

免责声明:本文仅做技术交流与学习... 目录 一.dll劫持 过程: 火绒剑检测: ChkDllHijack检测: 检测出来有--->msf生成dll后门 二.不带引号服务 路径 1-找不带引号的服务 2-改名上传 3-监听后-->等待服务重启 4-getuid拿下 三.不安全的服务权限配合MSF accessc…

常见的网站

1.小林coding图解计算机网络、操作系统、计算机组成、数据库&#xff0c;让天下没有难懂的八股文&#xff01;https://xiaolincoding.com/ 2.

三数之和 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将所有的三元组都算出来看是否为0, 题目要求去重操作, 所以我们可以使用set去重解法二: 因为我们知道当计算两数之和时, 我们使用的方法是将数组排序,然后利用"双指针"那么同理, 计算三个数之和: 1. 排序2. 固定一个数a, …

语义分割——PartNet大规模三维对象数据集

PartNet&#xff1a;一个大规模、细粒度、实例级和分层注释的三维对象数据集 介绍 随着计算机视觉和三维数据处理技术的飞速发展&#xff0c;对大规模、高质量的三维对象数据集的需求日益增长。在这样的背景下&#xff0c;PartNet应运而生&#xff0c;它是一个具有开创性的三维…

【论文笔记 | 异步联邦】 FedBuff

1. 论文信息 Federated Learning with Buffered Asynchronous Aggregation&#xff0c;International Conference on Artificial Intelligence and Statistics&#xff0c;2022&#xff0c;ccfc 2. introduction 2.1.1. 背景&#xff1a; 同步 FL &#xff0c;随训练过程中…

深耕“星光电务”党建品牌 引领保障企业高质量发展

在日前闭幕的2024年首届全国企业党务工作者论坛中&#xff0c;中铁十一局集团电务工程有限公司提交的论文《深耕“星光电务”党建品牌 引领保障企业高质量发展》荣获优秀论文奖。该论文由陈柯、刘敏之、徐干、姜亦珂联合撰写&#xff0c;展示了他们在党建工作中的创新实践与显著…

X.509数字证书的签名和指纹

X.509 是一种非常普遍的数字证书标准,由国际电信联盟(ITU)制定。它定义了证书的格式和一种验证证书有效性的方法。X.509 证书的结构遵循特定的语法和编码规则,通常使用 ASN.1 (Abstract Syntax Notation One) 进行描述和编码。 一个典型的X.509证书通常包含:版本、序列号、…

SignalR中的重连机制和心跳监测机制详解

一. 重连机制 声明&#xff1a;   本节仅介绍重连机制和心跳监测机制&#xff0c;基于Core 3.1框架&#xff0c;至于SignalR其它的一些基本使用&#xff0c;包括引入、Hub、配置等常规操作&#xff0c;在本节中不介绍&#xff0c;后续写Core下的SignalR 说明   默认是没有重…

汽车Type-C接口:特点与要求解析

汽车Type-C接口的需求增长 随着汽车科技的不断发展&#xff0c;车载电子设备的功能和数量不断增加&#xff0c;因此&#xff0c;对于汽车Type-C接口的需求也在逐渐增长。作为一种高速、多功能的连接标准&#xff0c;汽车Type-C接口在车载设备连接中扮演着越来越重要的角色。 …