企业级开发链表思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述项目结构
在这里插入图片描述头文件代码

在这里插入图片描述头文件代码LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
// 链表小节点
typedef struct LINKBODE {struct LINKBODE* next;}LinkNode;
// 遍历的函数指针
typedef void(*PRINTNODE)(LinkNode*);
// 比较的函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);// 链表节点
typedef struct LINKLIST {LinkNode head;int size;
}LinkList;// 初始化链表
LinkList* Init_LinkList();
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data);
// 删除
void Remove_LinkList(LinkList* list, int pos);
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare);
// reback
int Size_LinkList(LinkList* list);
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print);
// 释放链表
void FreeSpace_LinkList(LinkList* list);#endif

cpp代码截图
在这里插入图片描述cpp文件详细代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "LinkList.h"typedef struct PERSON {// 链表的节点,属于是进行链接的挂钩LinkNode node;char name[64];int age;}Person;// 回调函数
void MyPrint(LinkNode* data) {Person* p = (Person*)data;printf("Name = %s Age = %d\n", p->name, p->age);
}// 回调函数
int MyCompare(LinkNode* node1, LinkNode* node2) {// 强制类型转换Person* p1 = (Person*)node1;Person* p2 = (Person*)node2;// 判断if (strcmp(p1->name, p2->name) == 0 && p1->age == p2 -> age) {return 0;}return -1;
}// 初始化链表
LinkList* Init_LinkList() {// 使用这种方式初始化的链表不需要分配头结点LinkList* list = (LinkList*)malloc(sizeof(LinkList));list->head.next = NULL;list->size = 0;return list;
};
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data) {// 对链表的参数进行判断if (list == NULL) {return;}if (data == NULL) {return;}if (pos < 0 || pos > list->size) {pos = list->size;}// 插入节点,查找插入位置(辅助指针变量)LinkNode* pCurrent = &(list->head);for (int i = 0; i < pos; i++) {pCurrent = pCurrent->next;}// 插入新的节点data->next = pCurrent->next;pCurrent->next = data;list->size++;};
// 删除
void Remove_LinkList(LinkList* list, int pos) {// 判断if (list == NULL) {return;}if (pos < 0 || pos >= list->size) {return;}// 辅助指针变量LinkNode* pCurrent = &(list->head);for (int i = 0; i < pos; i++) {pCurrent = pCurrent->next;}// 删除节点pCurrent->next = pCurrent->next->next;list->size--;};
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) {if (list == NULL) {return -1;}if (data == NULL) {return -1;}// 辅助指针变量进行遍历,获取到第一个数据LinkNode* pCurrent = list->head.next;int index = 0;int flag = -1;// 使用while循环进行遍历while (pCurrent != NULL) {// 判断,如果相等的话就返回0如果不相等的话就返回-1if (compare(pCurrent, data) == 0) {flag = index;break;}pCurrent = pCurrent->next;index++;}return flag;};
// reback
int Size_LinkList(LinkList* list) {return 0;};
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print) {if (list == NULL) {return;}// 使用辅助指针变量进行遍历LinkNode* pCurrent = list->head.next;// 使用while循环while (pCurrent != NULL) {print(pCurrent);pCurrent = pCurrent->next;}};
// 释放链表
void FreeSpace_LinkList(LinkList* list) {// 释放内存空间,根据初始化的内容进行释放if (list == NULL) {return;}free(list);};int main(void)
{// 创建一个链表LinkList* list = Init_LinkList();// 创建数据Person p1, p2, p3, p4, p5;// 拷贝赋值strcpy(p1.name, "aaa");strcpy(p2.name, "nnn");strcpy(p3.name, "hhh");strcpy(p4.name, "qqq");strcpy(p5.name, "www");p1.age = 10;p2.age = 20;p3.age = 30;p4.age = 40;p5.age = 50;// 将节点插入到链表:企业级链表相当于是将指针串联起来,同时带上数据,实际上并没有上传数据Insert_LinkList(list, 0, (LinkNode*)&p1);Insert_LinkList(list, 0, (LinkNode*)&p2);Insert_LinkList(list, 0, (LinkNode*)&p3);Insert_LinkList(list, 0, (LinkNode*)&p4);Insert_LinkList(list, 0, (LinkNode*)&p5);// 打印Print_LinkList(list, MyPrint);// 删除节点Remove_LinkList(list, 2);// 打印printf("--------------------\n");Print_LinkList(list, MyPrint);// 查找Person findP ;strcpy(findP.name, "aaa");findP.age = 10;int pos = Find_LinkList(list,(LinkNode*)&findP, MyCompare);printf("位置 = %d\n", pos);// 释放链表内存FreeSpace_LinkList(list);system("pause");return 0;}

程序运行结果展示
在这里插入图片描述

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

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

相关文章

人工智能|机器学习——感知器算法原理与python实现

感知器算法是一种可以直接得到线性判别函数的线性分类方法&#xff0c;它是基于样本线性可分的要求下使用的。 一、线性可分与线性不可分 为了方便讨论&#xff0c;我们蒋样本增加了以为常数&#xff0c;得到增广样向量 y&#xff08;1;;;...;&#xff09;,则n个样本的集合为&a…

基于ChatGPT等大模型快速爬虫提取网页内容

本文将介绍一种基于ChatGPT等大模型快速爬虫提取网页内容的方法。传统的爬虫方法需要花费较大精力分析页面的html元素&#xff0c;而这种方法只需要两步就可以完成。下面将从使用步骤、方法扩展和示例程序三部分进行介绍。RdFast智能创作机器人小程序预计本周2023-11-30之前集成…

机器学习之决策树及随机森林

决策树 概念 决策树(Decision Tree)是一种常见的机器学习算法,用于分类和回归任务。它是一种树状结构,其中每个内部节点表示一个特征或属性,每个分支代表一个决策规则,而每个叶节点表示一个输出标签或值。 构建决策树过程 构建决策树的过程通常涉及以下步骤: 数据准…

PTA存档简单题之《函数中return的可以是式子》

本题要求实现一个计算非负整数阶乘的简单函数&#xff0c;并利用该函数求 1!2!3!...n! 的值。 函数接口定义&#xff1a; double fact( int n ); double factsum( int n ); 函数fact应返回n的阶乘&#xff0c;建议用递归实现。函数factsum应返回 1!2!...n! 的值。题目保证输…

零信任安全:远程浏览器隔离(RBI)的重要性

引言 在当今数字化时代&#xff0c;网络安全已成为个人和企业关注的焦点。随着网络攻击和恶意软件的不断增加&#xff0c;远程浏览器隔离(RBI)SAAS系统变得至关重要。本文将深入探讨远程浏览器隔离系统的重要性&#xff0c;以及它如何帮助用户保护其网络免受恶意软件和网络攻击…

Python与GPU编程快速入门(二)

Python与GPU编程快速入门 文章目录 Python与GPU编程快速入门2、将GPU与CuPy结合使用2.1 CuPy介绍2.2 Python中的卷积2.3 使用SciPy在CPU上进行卷积2.4 使用CuPy在GPU上进行卷积2.5 测量性能2.6 验证2.7 在 GPU 上执行 NumPy 例程本文将详细介绍如何在Python中使用CUDA,从而使用…

nginx配置文件中最后一个 include servers/*;作用是什么?

在 Nginx 配置文件中&#xff0c;include servers/*; 这行代码的作用是包含&#xff08;或者说引入&#xff09;servers 目录下的所有文件到当前配置中。这是一种组织和管理 Nginx 配置的常见方式&#xff0c;允许将配置分散到不同的文件中&#xff0c;从而提高可管理性。 具体…

蓝桥杯day02——Fizz Buzz

1、题目 给你一个整数 n &#xff0c;找出从 1 到 n 各个整数的 Fizz Buzz 表示&#xff0c;并用字符串数组 answer&#xff08;下标从 1 开始&#xff09;返回结果&#xff0c;其中&#xff1a; answer[i] "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。answer[i] &…

计算机杂谈系列精讲100篇-【计算机应用】PyTorch部署及分布式训练

目录 C平台PyTorch模型部署流程 1.模型转换 1. 不支持的操作 2. 指定数据类型 2.保存序列化模型 3.C load训练好的模型 4. 执行Script Module PyTorch分布式训练 分布式并行训练概述 Pytorch分布式数据并行 手把手渐进式实战 A. 单机单卡 B. 单机多卡DP C. 多机多卡DDP D. L…

springboot使用定时任务

在 Spring Boot 中&#xff0c;可以使用 Spring 自带的定时任务框架 Scheduled 来创建定时任务。使用 Scheduled 注解可以简单、方便地实现定时任务的调度&#xff0c;无需使用其他的定时任务框架。 下面是一个简单的示例&#xff0c;展示如何在 Spring Boot 中创建定时任务&a…

docker nginx imclude

1 http 块配置 Nginx 的配置分为多个块&#xff0c;其中 http 块是其中的主要部分&#xff0c;包含了 http 的相关配置。 http 块主要可以设置以下参数&#xff1a; include&#xff1a;可以引入其他配置文件。例如&#xff0c;include /etc/nginx/mime.types; 表示引入了 /…

【C++11新特性】范围for循环

C11引入了范围for循环&#xff0c;它是一种更简洁和易用的循环语法&#xff0c;用于遍历数组、容器类&#xff08;例如 std::vector、std::list 等&#xff09;或支持迭代器的类型。 范围for循环遍历数组的示例 int arr[] {1, 2, 3, 4, 5};for (int num : arr) {std::cout &…

Blender动画导入Three.js

你是否在把 Blender 动画导入你的 ThreeJS 游戏(或项目)中工作时遇到问题? 您的 .glb (glTF) 文件是否正在加载,但没有显示任何内容? 你的骨骼没有正确克隆吗? 如果是这样,请阅读我如何使用 SkeletonUtils.js 解决此问题 1、前提条件 你正在使用 Blender 3.1+(此版本…

QT配合CSS隐藏按钮

第一种方法 在Qt的CSS样式表中&#xff0c;使用 visibility 属性来隐藏按钮。设置 visibility 为 hidden 不可见&#xff0c;而设置为 visible 则可见。 隐藏所有 QPushButton QPushButton {visibility: hidden; }隐藏特定的按钮&#xff0c;用按钮的名称或样式类进行定位就…

mysql 性能排查

mysql 下常见遇到的问题有&#xff0c;mysql连接池耗尽&#xff0c;死锁、慢查、未提交的事务。等等我们可能需要看&#xff1b;我们想要查看的可能有 1.当前连接池连接了哪些客户端&#xff0c;进行了哪些操作 2.当前造成死锁的语句有哪些&#xff0c;是哪个客户端上的&#x…

JS常用数据类型转换(数字型和字符串型之间转换)

提供了5中基本数据类型&#xff1a;数字 number 字符串 string 布尔 boolean 空值 null 未定义的 undefined 常用的是数字型和字符串型之间的转换&#xff0c;常用的转换方法如下&#xff1a; 1 数字型转换成字符串型 a) 使用String&#xff08;&#xff09;方法…

开题答辩稿

各位老师好&#xff0c;我是开题答辩人&#xff0c;我做的开题报告的题目是《》&#xff0c;我的论文指导老师是老师。 -------------------------------------------------------------------------------------- 我将从一下几个方面对我的开题进行介绍 ------------------…

算法通关第十三关-青铜挑战数学基础问题

数组元素积的符号 描述 : 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。如果 x 是负数&#xff0c;返回 -1 。如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的…

vue3+ts 全局函数和变量的使用

<template><div>{{ $env }}<br />{{ $filters.format("的飞机") }}</div> </template><script setup lang"ts"> import { getCurrentInstance } from "vue"; const app getCurrentInstance(); console.log…

07-学成在线修改/查询课程的基本信息和营销信息

修改/查询单个课程信息 界面原型 第一步: 用户进入课程列表查询页面,点击编辑按钮编辑课程的相关信息 第二步: 进入编辑界面显示出当前编辑课程的信息,其中课程营销信息不是必填项,修改成功后会自动进入课程计划编辑页面 查询课程信息 请求/响应数据模型 使用Http Client测…