【数据结构】链表的增删改查| 组件化封装

news2024/11/28 13:37:24

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥专栏汇总:全部文章专栏汇总 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ


目录

  • 本文基于链表的基础知识之上, 将常用的增删改查功能 汇总
  • 一、组件化封装的意义
  • 二、链表的增删改查 组件化封装:
    • 总代码文件:
      • 头文件linkedlist.h:
      • 源文件LinkedList.cpp :
      • 用例测试文件useLinkedList.cpp :
  • 三、 本文中所有函数功能列表:


本文基于链表的基础知识之上, 将常用的增删改查功能 汇总

【c语言实现】链表基础知识

在这里插入图片描述


一、组件化封装的意义

组件化封装就是将平时常用的一些函数,根据经验归纳总结到一个文件中,便于以后再次使用。

1.提升代码复用性:组件化封装可以将一些通用的、经常使用的功能和界面进行封装,以供其他模块或项目复用,减少重复工作,提升开发效率。

2.降低维护成本:组件化封装使代码模块化,一旦封装好了某一个功能或界面,就可以在不同的项目中复用。这样可以减少代码冗余,降低维护成本。

3.提高代码可读性和可维护性:不同的组件之间有着清晰的接口和依赖关系,代码的逻辑更加清晰,易于维护和扩展。

4.促进团队合作。

二、链表的增删改查 组件化封装:

总代码文件:

头文件linkedlist.h:

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

/*节点结构体*/
typedef struct node 
{
	struct node *prev;
	void * data;
	struct node *next;
} Node , * PNode;

/*链表结构体*/
typedef struct 
{
	PNode header;
	PNode ender;
	int size;
	PNode nextNode;//迭代器的下一个节点

}LinkedList ,* PLinkedList ;

/*创建链表*/
PLinkedList createLinkedList();
/*创建节点*/
PNode createNode(  void * data);

 /*增加新的节点*/
void add(PLinkedList  list ,  void * data);
 
/*在某节点的位置上插入新节点*/
void insert(PLinkedList  list ,int index,  void * data);

/*删除 指定 下标的节点*/
void* removeIndex(PLinkedList  list ,int index);

/*删除等于参数的首个节点*/
void removeData(PLinkedList  list ,  void* data);

/*某下标对应的 节点*/
void* get(PLinkedList  list ,int index);
/*找到节点*/
PNode findNode(PLinkedList  list ,int index);

/*某下标对应的 节点数据进行更新 */
void set(PLinkedList  list ,int index,  void* newdata);

/*某数据对应的下标*/
int indexOf(PLinkedList  list ,  void* data);

/*节点数量*/
int size(PLinkedList  list );

/*清空链表*/
void clear(PLinkedList  list );


 /*迭代器*/
//产生新的迭代器
void iterator(PLinkedList list);
//是否有下一个节点
int hasNext(PLinkedList list);
//取得下一个节点数据
void* next(PLinkedList list);



/*实现栈stack的功能:LIFO:last in first out */

/* 入栈*/
void push(PLinkedList  list ,  void* data);

/*出栈*/
void* pop(PLinkedList  list );

/*实现队列queue的功能:FIFO:first in first out */
void addFirst(PLinkedList  list ,  void* data);
void addLast(PLinkedList  list ,  void* data);
void* removeFirst(PLinkedList  list);
void* removeLast(PLinkedList  list);

源文件LinkedList.cpp :

#include "linkedlist.h"

PLinkedList createLinkedList()
{
	PLinkedList newList =(PLinkedList) malloc(sizeof(LinkedList));
	newList->header = NULL;
	newList->ender = NULL;
	newList->size = 0;
	newList->nextNode = NULL;
	return newList;
}

PNode createNode(void* data)
{
	PNode newNode = (PNode)malloc( sizeof(Node));
	newNode->prev = NULL;
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

void add(PLinkedList list, void* data)
{
	PNode newNode =createNode(data);
	if (list->size==0)//空链表
	{
		list->header = newNode;
		list->ender = newNode;
	}
	else
	{
		list->ender->next = newNode;
		newNode->prev = list->ender;
		list->ender = newNode;
	}
	list->size++;
}

void insert(PLinkedList list, int index, void* data)
{
	if ( index>= list->size )//追加到尾部 
	{
		add(list, data);
		return;
	}
	 
	PNode newNode = createNode(data);
	//插入到头部
	if (index <=0 )
	{
		newNode->next = list->header;
		list->header->prev = newNode;
		list->header = newNode;
	}
	else
	{
		//1 理想的中间插入
		PNode p = findNode(list, index);
		PNode q = p->prev;

		newNode->next = p;
		p->prev = newNode;

		newNode->prev = q;
		q->next = newNode;
	}
	list->size++;
}

void* removeIndex(PLinkedList list, int index)
{
	PNode p = NULL;//指向被删除的节点
	if (list->size==1)//唯一节点
	{
		p = list->header;
		list->header = list->ender = NULL;
	}
	else if ( index<=0 )
	{
		p = list->header;
		list->header = p->next;
		list->header->prev = NULL;
	}
	else if ( index>=list->size-1)
	{
		p = list->ender;
		list->ender = p->prev;
		list->ender->next = NULL;
	}
	else
	{
		//理想的中间删除
		p = findNode(list, index);
		PNode q = p->prev;
		PNode m = p->next;
		q->next = m;
		m->prev = q;
	}
	if (p!=NULL)
	{
		void* tdata = p->data;
		free(p);
		list->size--;
		return tdata;
	}
	return NULL;
}

void removeData(PLinkedList list, void* data)
{
	int i=indexOf(list, data);
	if (i>=0)
	{
		removeIndex(list, i);
	}
}

void* get(PLinkedList list, int index)
{
	PNode p = findNode(list, index);
	if (p)
	{
		return p->data;
	}
	return NULL;
}

PNode findNode(PLinkedList list, int index)
{
	PNode p = list->header;
	for (int i=0 ;i<index ;i++ )
	{
		p = p->next;
	}
	return p;
}

void set(PLinkedList list, int index, void* newdata)
{
	PNode p=findNode(list, index);
	if (p)
	{
		p->data = newdata;
	}
}

int indexOf(PLinkedList list, void* data)
{
	int i = 0;
	iterator(list);
	while ( hasNext(list))
	{
		if ( next(list)== data)
		{
			return i;
		}
		i++;
	}
	return -1;
}

int size(PLinkedList list)
{
	return list->size;
}

void clear(PLinkedList list)
{
	PNode p = list->header;
	PNode q;
	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}
	list->header = NULL;
	list->ender = NULL;
	list->size = 0;
}

void iterator(PLinkedList list)
{
	list->nextNode = list->header;
}

int hasNext(PLinkedList list)
{
	return list->nextNode!=NULL;
}

void* next(PLinkedList list)
{
	void* data = list->nextNode->data;
	list->nextNode = list->nextNode->next;//为下一次做准备
	return data;
}

void push(PLinkedList list, void* data)
{
	add(list, data);
}

void* pop(PLinkedList list)
{

	return removeIndex(list,list->size-1);
}

void addFirst(PLinkedList list, void* data)
{
	insert(list, 0, data);
}

void addLast(PLinkedList list, void* data)
{
	add(list, data);
}

void* removeFirst(PLinkedList list)
{
	return removeIndex(list,0);
}

void* removeLast(PLinkedList list)
{
	return removeIndex(list,list->size-1);
}

用例测试文件useLinkedList.cpp :

对LinkedList中实现功能的函数进行用例测试

#include "linkedlist.h"
#include "string.h"
/*数据域*/
typedef struct  
{
	int data;

} Data,*PData;
/*创建数据域*/
PData createData(int d);

int main()
{
	PLinkedList list = createLinkedList();
	add(list, "张三");//0
	add(list, "李四");//1
	add(list, "旺旺");//2
	add(list, "天喜");//3 
	add(list, "椰子");//4
	set(list, 1, "路飞");

	printf("下标:%d\n", indexOf(list,"天喜"));
	//removeData(list, "李四");
	//insert(list, 3, "咖啡");
	//insert(list, 8, "末尾");
	//insert(list, 0, "开头");
	/*printf("%s\n",(const char*) removeIndex(list, 2));
	printf("%s\n", (const char*)removeIndex(list, 4));
	printf("%s\n", (const char*)removeIndex(list, 0));*/
	 
	//下标遍历
	//for (int i=0 ;i<size(list); i++)//
	//{
	//	const char * str =  (const char*)get(list, i);
	//	printf("%s\n",str);
	//}

	/*PNode p = list->header;
	while (p)
	{
		printf("%s\n", (const char*)p->data);
		p=p->next;
	}*/
	//iterator(list);
	//while ( hasNext(list) )
	//{
	//	printf("%s\n", (const char*) next(list));
	//}
	
	释放链表
	//clear(list);
	//free(list);
	//list = NULL;

	//PLinkedList list1 = createLinkedList();
	//PLinkedList list2 = createLinkedList();
	//PLinkedList stack = createLinkedList();
	//push(stack, "aa");
	//push(stack, "bb");
	//push(stack, "cc");
	//push(stack, "dd");
 //
	//printf("%s\n", (const char*)pop(stack));//dd
	//printf("%s\n", (const char*)pop(stack));
	//printf("%s\n", (const char*)pop(stack));
	//printf("%s\n", (const char*)pop(stack));
	//PLinkedList queue = createLinkedList();
	//addFirst(queue, "aa");
	//addFirst(queue, "bb");
	//addFirst(queue, "cc");
	//addFirst(queue, "dd");

	//printf("%s\n", (const char*)removeLast(queue)); 
	//printf("%s\n", (const char*)removeLast(queue));
	//printf("%s\n", (const char*)removeLast(queue));
	//printf("%s\n", (const char*)removeLast(queue));

	return 0;
}
 
PData createData(int d)
{
	PData pd = (PData)malloc(sizeof( Data));
	pd->data= d;
	return pd;
}

就是在同一项目下建立一个测试用的文件,输入函数的定义进行功能测试:

如果达到了预期效果,该函数就是编写成功

在这里插入图片描述

三、 本文中所有函数功能列表:

以下是该代码文件中涉及的功能:

  • 创建链表

  • 创建节点

  • 增加新的节点

  • 在某个位置插入新节点

  • 删除指定下标的节点

  • 删除等于参数的首个节点

  • 通过下标获取节点

  • 通过数据查找相应节点并返回节点数据

  • 对某个下标的节点进行更新

  • 获取某个数据的下标

  • 获取链表中的节点数量

  • 清空链表

  • 迭代器:生成迭代器,判断是否有下一个节点,取得下一个节点的数据

  • 实现栈 stack 的功能:添加元素、弹出元素

  • 实现队列 queue 的功能:在链表头尾添加元素,从头或尾移除元素


本链表的增删改查功能组件可以被复用在平时的项目中。


大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。

在这里插入图片描述

大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

BSN-DDC基础网络详解(十一):官方门户OpenAPI说明及开发资料汇总

01 官方门户OpenAPI说明 官方门户OpenAPI是BSN联盟面向算力中心方和平台方开放的一套官方门户业务管理服务接口。“业务开通”和“资金账户充值/提现”操作&#xff0c;需通过官方门户手工执行&#xff0c;官方门户内的其它功能&#xff0c;都建议算力中心方和平台方按照官方…

Mongo集合操作

2、创建切换数据库 2.1 默认数据库 mongo数据库和其他类型的数据库一样&#xff0c;可以创建数据库&#xff0c;且可以创建多个数据库。 mongo数据库默认会有四个数据库&#xff0c;分别是 admin&#xff1a;主要存储MongoDB的用户、角色等信息 config&#xff1a;主要存储…

数据泄露、数据爬取......金融机构要如何保护催收场景下的数据安全?

金融企业的贷后催收是指向借款人发送催收通知和采取其他措施&#xff0c;以确保借款人按时还款并追回逾期贷款的过程。这通常包括电话催收、信函催收、上门访问等方式。贷后催收通常由金融机构内部的专业团队或第三方专业催收公司承担。 由于催收业务会涉及到很多个人信息&…

家政服务预约小程序开发 解放双手享受洁净生活

在外工作忙了了一天回到家还有做不完的家务&#xff0c;很多时候家庭主妇总是受不了这样的生活二崩溃&#xff0c;随着生活水平的提高&#xff0c;上门家政预约类软件层出不穷&#xff0c;让万千家庭足不出户就可在线预约家政服务&#xff0c;在家享受专业的保洁、维修、安装等…

鸿蒙Hi3861学习十四-Huawei LiteOS-M(STA模式)

一、简介 AP&#xff08;Access Point&#xff09;无线接入点 AP是无线接入点&#xff0c;是一个无线网络的创建者&#xff0c;是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。 STA&#xff08;Station&#xff09;站点 STA也可以理解为终端的意思&#xff…

进行性能压力测试的原因、目的和好处

性能压力测试是指在模拟高负载、高并发情况下对软件系统进行测试&#xff0c;以衡量系统在实际使用过程中的性能表现。这些测试可以为生产环境中的应用程序提供关键数据&#xff0c;并帮助开发人员从根本上了解系统的实际性能。在本文中&#xff0c;我们将探讨进行性能压力测试…

微信视频号视频可以下载吗?视频下载器安装使用教程

简介 最近小伙伴推荐了一款视频下载神器&#xff0c;它可以批量下载微信视频号中的视频到本地上&#xff0c;我试了一下非常简单方便&#xff0c;而且还支持预览等操作&#xff0c;今天分享给大家 软件下载 ➤ 微信视频号下载器下载 ⇲ 安装使用教程 安装 我们下载好对应…

Centos7安装配置MySQL 8.0.20

安装配置MySQL 8.0.20 步骤一&#xff1a;安装MySQL 8.0.20 使用wget命令从mysql官网下载MySQL8.0.20安装包&#xff1a; wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz解压安装包&#xff1a; tar -Jxvf mysql-8.0.20-…

QT 操作SQL

目录 一、QT SQL简介 (一&#xff09;、QT SQL对数据库支持 1、驱动层 2、SQL API层 3、用户接口层 &#xff08;二&#xff09;SQLite数据库初识 1、第一步&#xff1a;在项目管理文件&#xff08;.pro&#xff09;中增加数据库模块​编辑 2、第二步&#xff1a;查看…

用讯飞星火大模型1分钟写一个精美的PPT

文章目录 前言SparkDesk讯飞星火认知大模型简介利用讯飞星火写一个转正述职ppt1.告诉讯飞星火我想写一篇转正述职ppt2.利用MindShow一键生成ppt 申请体验写在最后 前言 随着ChatGPT迅速走红,国内各大企业纷纷发力认知大模型领域。经过一段时间的酝酿,讯飞“星火认知大模型”于…

家门口可以参加公益小天使活动啦

“我的布娃娃可以换你的书吗&#xff1f;” “发现有人晕倒&#xff0c;第1步要确认环境安全。” 这是5月14日上午&#xff0c;在武昌区水果湖街道滨湖社区&#xff0c;闲置互换应急科普活动上发生的对话 该活动由水果湖街道滨湖社区和武汉公益小天使联合发起。5月初&#x…

出现找不到msvcp140.dll无法继续执行代码要怎么解决?

出现找不到msvcp140.dll无法继续执行代码要怎么解决&#xff1f;当你尝试在Windows系统上运行某些程序或游戏时&#xff0c;可能会遇到“找不到msvcp140.dll无法继续执行代码”的错误提示。这个错误通常表示你的系统缺少了msvcp140.dll文件&#xff0c;而这个文件是Visual C Re…

SQL server 纵横报表查询

select warehouseid AS 仓库, case when Udf2 SAP THEN SAP WHEN Udf2 SNC THEN SNC ELSE 手工创建 end AS 创建来源 ,COUNT(isnull(UDF2,手工创建)) AS 数量 from DOC_Appointment_Header dah where convert(varchar(10),AddTime,120) > 2022-09-01 --and warehousei…

ASEMI代理ADI亚德诺ADP5054ACPZ-R7供电管理芯片介绍

编辑-Z 本文主要介绍ADP5054ACPZ-R7供电管理芯片的基本特性和应用场景。该芯片支持多路输出&#xff0c;具有高效和可靠性的特点&#xff0c;适用于各种电力系统和工业控制设备。 1、ADP5054ACPZ-R7的基本特性 ADP5054ACPZ-R7是一款高度集成的供电管理芯片&#xff0c;具有以…

python argparse 模块命令行参数解析

1.概述 argparse 是 python 的一个命令行解析包&#xff0c;可根据需要编写高可读性的程序。本文针对项目中对 argparse 的用法&#xff0c;用实例对各个参数进行讲解&#xff0c;力求达到让读者秒懂的目的。 2.api概述 2.1 ArgumentParser 对象 class argparse.ArgumentPar…

msvcr120.dll丢失怎样修复?msvcr120.dll丢失修复的四个方法

打开软件跟游戏提示msvcr120.dll丢失&#xff0c;无法执行此代码怎么办&#xff1f;刚刚遇到这个问题&#xff0c;我都无从下手。家人们&#xff0c;你是不是也被这个问题也困扰过。msvcr120.dll是什么文件呢&#xff1f;经过我一个下午的时间研究&#xff0c;终于搞清楚了&…

在 Mac 上的“终端”中执行.out文件

在 Mac 上的“终端”中执行.out文件 安装C及设置C语言环境怎么运行 安装C及设置C语言环境 最近在自学C语言&#xff0c;因为用的是mac电脑&#xff08;MacBook Air M1)&#xff0c;自带了C语言环境&#xff0c;如果用的是windows系统&#xff0c;可能这篇文章对您没有一点帮助…

10年软件测试人劝你千万别上当,测试岗位就是个巨坑......

每次都有人问我软件测试的前景是什么样的&#xff0c;每年也会有人很多人纷纷涌入测试的岗位上&#xff0c;希望自己能够进入阿里、华为等大厂。 但是测试岗位真的那么吃香吗&#xff1f;今天我结合从零基础小白到测试开发的成长经历&#xff0c;来说下这个行业的发展前景&…

基于改进MRAS算法的永磁同步电机参数辨识

基于改进MRAS算法的永磁同步电机参数辨识 摘 要永磁同步点电机参数辨识算法介绍永磁同步电机数学模型改进MRAS参数辨识算法递推最小二乘法辨识原理递推最小二乘法结合MRAS算法原理仿真结果分析总结 摘 要 在永磁同步电机运行时&#xff0c;电机的电气参数会受到温度以及磁链饱…

KDZD400Q便携式三氯乙烯浓度检测仪

一、产品概述 检测仪用于快速检测多种气体浓度、温湿度测量并超标报警的场合。采用2.31寸高清彩屏实时显示&#xff0c;选用进口品牌的气体传感器&#xff0c;主要检测原理有&#xff1a;电化学、红外、催化燃烧、热导、PID 光离子等。 可以检测管道中或受限空间、大气环境中的…