单链表实现通讯录

不过多赘述了

顺序表的增删查改-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.mfbz.cn/a/572410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.MMD ray渲染 材质的添加及打光方法

材质 前置准备 先准备好模型和场景 将ray控制器拖入进去 添加完默认的材质以后的效果 打开插入材质页面 打开MaterialMap栏 将流萤的模型展开 自发光 现在给领带添加一个自发光效果 在自发光Emissive里&#xff0c;打开x1&#xff0c;选择albedo&#xff0c;白光 现在…

使用微软Phi-3-mini模型快速创建生成式AI应用

微软Phi-3大语言模型是微软研究院推出的新一代系列先进的小语言模型。Phi-3系列包括phi-3-mini、phi-3-small和phi-3-medium三个不同规模的版本。这些模型在保持较小的参数规模的同时&#xff0c;通过精心设计的训练数据集和优化的算法&#xff0c;实现了与大型模型相媲美的语言…

【CVPR2023】Re:InterHand:一个用于3D交互手部姿态估计的重光照数据集

这篇论文的标题是《A Dataset of Relighted 3D Interacting Hands》&#xff0c;作者是Gyeongsik Moon, Shunsuke Saito, Weipeng Xu, Rohan Joshi, Julia Buffalini, Harley Bellan, Nicholas Rosen, Jesse Richardson, Mallorie Mize, Philippe de Bree, Tomas Simon, Bo Pen…

玩转PyCharm

玩转PyCharm PyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个集成开发环境&#xff0c;它最大的优点是能够大大提升Python开发者的工作效率&#xff0c;为开发者集成了很多用起来非常顺手的功能&#xff0c;包括代码调试、高亮语法、代码跳转、智能提示、自动补…

MyBatis 核心配置讲解(上)

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的互金摸鱼侠。 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成&#xff0c;到这里基础篇的内容就结束了。 从今天开始&#xff0c;我们正式进入 MyBatis 学习的第二阶段&#xff1a;MyBatis 的…

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡),简单绘图工具制作

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

maya blendshape

目录 shape编辑器 maya创建blendshape python 脚本 添加形变动画 查看顶点个数 shape编辑器 打开方式&#xff1a; 窗口-动画编辑器-形变编辑器 maya创建blendshape python 脚本 import maya.cmds as cmds# 创建基础网格 - 球体 baseMesh cmds.polySphere(name"bas…

Postman 工具发送请求的技巧与实践

在开发和测试 API 时&#xff0c;发送 JSON 格式的请求是一个常见需求。 在 Postman 中构建和发送 JSON 请求 创建一个新的请求 首先&#xff0c;在 Postman 启动界面上找到并点击 “New” 按钮&#xff0c;选择 “HTTP Request” 来开始新建一个请求。这一步骤允许你定义请…

Unity射击游戏开发教程:(7)Powerup的使用

确定 PowerUp 效果应持续多长时间 我在游戏中放置的第一个道具是三重射击。当玩家收集三重射击能量时,他们可以一次发射 3 束激光,而正常情况下只能发射 1 束激光。在实施道具时,您需要考虑它们的功能以及它将如何影响游戏玩法。至于三连射&

Linux-缓冲区(简单理解)

1. 缓冲区是什么 缓冲区就是一段内存空间。 2. 为什么要有缓冲区 IO写入有两种&#xff1a; 写透模式&#xff08;WT&#xff09; 成本高&#xff0c;效率低写回模式&#xff08;WB&#xff09; 成本低&#xff0c;效率高 写透模式&#xff1a;每次的文件写入都要立即刷新…

海外仓WMS管理系统:标准化海外仓管理模式,效率和管理模式双提升

就目前的跨境电商发展速度和体量来看&#xff0c;标准化海外仓管理的模式不再是一个选项&#xff0c;而是必走之路。 今天会重点和大家聊一下&#xff0c;海外仓企业应该如何利用好WMS管理系统&#xff0c;快速的标准化仓库管理的模式&#xff0c;以及大家比较关心的&#xff0…

JAVA读取文件完成词频统计

词频统计原数据和结果数据地址&#xff1a;https://download.csdn.net/download/LiHaoHang6/88845654?spm1001.2014.3001.5501 运行效果展示&#xff1a; 原数据展示&#xff1a; 词频统计思路&#xff1a; 1&#xff1a;先通过BufferedReader来读取本地文本文件,之后将文本…

excel 按照姓名日期年月分组求和

excel 需要按照 姓名 日期的年份进行金额求和统计&#xff0c;采用sumifs 进行统计 注意&#xff1a;sumifs 不支持 合并列拆分计算&#xff0c;合并列只会计算一个值 表格数据大概如下&#xff1a;(sheet) ABC姓名日期金额A2023/01/01500A2023/01/151500B2023/01/01200B202…

基于SpringBoot开发的同城租房系统租房软件APP小程序源码

项目背景 一、市场前景 随着城市化进程的加快和人口流动性的增强&#xff0c;租房市场正逐渐成为一个不可忽视的巨大市场。传统的租房方式往往存在着信息不对称、效率低下等问题&#xff0c;而同城租房软件的出现&#xff0c;则有效地解决了这些问题&#xff0c;为租房市场注…

云计算时代,企业面临的云安全风险

如今&#xff0c;随着云计算等新兴科技的发展&#xff0c;不同类型企业间的关联越来越多&#xff0c;它们之间的业务边界已被打破&#xff0c;企业上云成为了大势所趋。云计算应用帮助企业改变了IT资源不集中的状况&#xff0c;同时&#xff0c;数据中心内存储的大量数据信息&a…

Mediator 中介者

意图 使用一个中介者对象来封装一系列的对象交互。中介者使各个对象不需要显式地互相引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立的改变他们之间的交互。 结构 Mediator&#xff08;中介者&#xff09;定义一个接口用于各同事&#xff08;Colleague&#xff0…

数值积分——复化梯形求积公式 | 北太天元

复化求积法的思想&#xff1a; 将区间 [ a , b ] [a,b] [a,b]进行 n n n等分&#xff0c;步长 h b − a n h\frac{b-a}{n} hnb−a​&#xff0c;等分点 x k a k h , k 0 , 1 , 2 , ⋯ , n x_{k}akh,k0,1,2,\cdots,n xk​akh,k0,1,2,⋯,n, 先在每个子区间 [ x k , x k 1 ] …

普惠金融淘金热:抢占‘高成长‘企业,抓住下一个十年的财富机遇!

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 2013年&#xff0c;十八届三中全会正式提出“发展普惠金融”&#xff0c;普惠金融自此上升为国家战略&#xff1b;十年来&#xff0c;我国普惠金融取得了长足发展&#xff0c;逐步构建了多层次、广覆盖的中国特…

文件上传漏洞-白名单检测

如何确认是否是白名单检测 上传一张图片与上传一个自己构造的后缀&#xff0c;如果只能上传图片不能上传其它后缀文件&#xff0c;说明是白名单检测。 绕过技巧 可以利用 00 截断的方式进行绕过&#xff0c;包括 %00 截断与 0x00 截断。除此之外如果网站存在文件包含漏洞&…

《环阳宗海逍遥游》

第一天:《六十八道拐》五月二日游兴浓&#xff0c;大观公园门囗逢。海埂西门再集合&#xff0c;蓝光城里意无穷。呈贡过后松茂过&#xff0c;阳宗镇上心欢融。宜良城中暂歇脚&#xff0c;六十八拐路难通。宜良住宿赏夜色&#xff0c;期待明朝再接龙。 第二天:《情人岛苗王峡行》…
最新文章