【数据结构和算法】链表的简单实现

目录

  • c++版本
  • c语言版

🐱‍🚀个人博客https://blog.csdn.net/qq_51000584/
🐱‍👤收录专栏:数据结构和算法
🐱‍👓专栏目标:分享一些学习的代码
🐱‍💻作者:敲代码的猫(Codemon)


c++版本

//单向链表
//节点
typedef int DATA;
struct Node {Node() {this->pNext = nullptr;}Node(DATA t_data) {this->_data = t_data;this->pNext = nullptr;}~Node() {}Node* pNext;DATA _data;
};class List {
public:List() {this->length = 0;this->pHead = nullptr;this->pTail = nullptr;}~List() {this->clear();}public://尾添加void push_back(DATA t_data) {Node* pTemp = new Node(t_data);if (pHead == nullptr) {pHead = pTemp;pTail = pTemp;}else {pTail->pNext = pTemp;pTail = pTemp;}length++;}//头添加void push_font(DATA t_data) {Node* pTemp = new Node(t_data);if (pHead == nullptr) {pHead = pTemp;pTail = pTemp;}else {pTemp->pNext = pHead;pHead = pTemp;}length++;}//返回头指针Node* _head() {return this->pHead;}//返回尾指针Node* _tail() {return this->pTail->pNext;}//清空 链表void clear() {Node* pNode = pHead;while (pNode != nullptr) {Node* pTemp = pNode;pNode = pNode->pNext;delete pTemp;pTemp = nullptr;}this->length = 0;pHead = nullptr;pTail = nullptr;}//返回链表长度int size() {return this->length;}//遍历链表void TravelList() {Node* pNode = pHead;while (pNode != nullptr) {std::cout << pNode->_data << endl;pNode = pNode->pNext;}}private:int length;//链表长度Node* pHead;Node* pTail;
};

c语言版

#include<stdio.h>
#include<stdlib.h>typedef struct ListNode {int val;struct ListNode* next;
}ListNode;typedef struct ListHead {struct ListNode* head;struct ListNode* end;int length;
}ListHead;ListHead* CreateList() {ListHead* list = (ListHead*)malloc(sizeof(ListHead));list->end = NULL;list->head = NULL;return list;
}ListNode* CreateNode(int n) {ListNode* pNode = (ListNode*)malloc(sizeof(ListNode));pNode->val = n;pNode->next = NULL;return pNode;
}void pushback(ListHead* list,int n) {ListNode* pTemp = CreateNode(n);if (list->head == NULL) {list->head = pTemp;list->end = pTemp;return;}ListNode* pNode = list->head;while (pNode->next != NULL) {pNode = pNode->next;}pNode->next = pTemp;list->end = pTemp;return;
}void pushfont(ListHead* list, int n) {ListNode* pTemp = CreateNode(n);if (list->head == NULL) {list->head = pTemp;list->end = pTemp;return;}ListNode* pNode = list->head;list->head = pTemp;pTemp->next = pNode;return;
}void DeleteList(ListHead* list) {if (list->head == NULL) {return;}ListNode* pNode = list->head;ListNode* pTemp;while (pNode != NULL) {pTemp = pNode->next;free(pNode);pNode = pTemp;}list->head = NULL;list->end = NULL;
}void PrintList(ListHead* list) {ListNode* pNode = list->head;if (pNode == NULL) {printf("empty.\n");return;}while (pNode != NULL) {printf("%d\n", pNode->val);pNode = pNode->next;}return;
}int Delete_Key(ListHead* list,int index) {ListNode* pNode = list->head;if (pNode == NULL) {return 0;}if (index == 1) {list->head = pNode->next;free(pNode);return 1;}int counter = 1;while (pNode->next && counter < index-1) {pNode = pNode->next;counter++;}if (pNode->next == NULL || counter > index - 1) {return 0;}ListNode* pTemp = pNode->next;pNode->next = pNode->next->next;free(pTemp);return 1;
}int Delete_Num(ListHead* list,int n) {ListNode* pNode = list->head;if (pNode == NULL) {return 0;}if (pNode->val == n) {list->head = pNode->next;free(pNode);return 1;}while (pNode->next) {ListNode* pTemp = pNode->next;if (pTemp->val == n) {pNode->next = pNode->next->next;free(pTemp);}else {pNode = pNode->next;}}return 1;
}int Insert_Before(ListHead* list,int index,int n) {ListNode* pNode = list->head;if (pNode == NULL) {return 0;}if (index == 1) {ListNode* pTemp = CreateNode(n);pTemp->next = list->head;list->head = pTemp;return 1;}int counter = 1;while (pNode->next && counter < index - 1) {pNode = pNode->next;counter++;}if (pNode->next == NULL || counter > index - 1) {return 0;}ListNode* pTemp = CreateNode(n);pTemp->next = pNode->next;pNode->next = pTemp;return 1;
}int Insert_Behind(ListHead* list,int index,int n) {ListNode* pNode = list->head;if (pNode == NULL) {return 0;}int counter = 1;while (pNode && counter < index) {pNode = pNode->next;counter++;}if (pNode == NULL || counter > index) {return 0;}ListNode* pTemp = CreateNode(n);pTemp->next = pNode->next;pNode->next = pTemp;return 1;
}void ReverseList(ListHead* list){if (list->head == NULL || list->head->next == NULL) {return;}ListNode* pPro = NULL;ListNode* pCur = list->head;ListNode* pNext = list->head->next;while (pCur) {pCur->next = pPro;pPro = pCur;pCur = pNext;if (pNext) {pNext = pNext->next;}}list->head = pPro;
}int main() {ListHead* list = CreateList();PrintList(list);pushfont(list, 5);pushfont(list, 4);PrintList(list);printf("----------\n");ReverseList(list);//DeleteList(list);PrintList(list);return 0;
}

Codemon2024.02.22

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

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

相关文章

vue项目中vue.config.js文件的介绍

vue.config.js 是一个可选的配置文件&#xff0c;如果项目的根目录中没有这个文件&#xff0c;则 Vue CLI 会使用默认的配置。这个文件的主要目的是为了让开发者能够调整 Vue CLI 生成的项目的默认配置。 vue.config.js 应该导出一个包含了配置选项的对象。这些配置选项包括但…

React PureComponent 和 React.memo()区别

1 注意 ● PureComponent和memo仅作为性能优化的方式存在 ● 不要依赖它来阻止渲染&#xff0c;会产生BUG ● PureComponnet 和memo 都是通过对 props 值的浅比较来决定该组件是否需要更新的。 2 PureComponent 和React.memo() 区别 PureComponent 和React.memo()都是React优化…

Idea安装gideabrowser插件

Idea安装gideabrowser插件 一、安装二、设置教程 一、安装 gideabrowser链接地址 二、设置教程 在人生的舞台上&#xff0c;奋力拼搏&#xff0c;才能演绎出最精彩的人生之歌。面对挑战和困难&#xff0c;不妥协、不气馁&#xff0c;只争朝夕&#xff0c;方显坚韧与智慧。努…

如何使用Docker部署WBO容器并实现固定公网地址访问本地白板界面

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

高防服务器的原理

高防服务器的原理主要是通过各种技术手段来识别和阻止网络攻击&#xff0c;包括但不限于防火墙、入侵检测系统、入侵防御系统、流量过滤和清洗、黑白名单机制、行动分析和机器学习、散布式缓存和CDN、反向代理和负载均衡等。123456789 这些技术可以有效地检测和…

fpmarkets澳福归类总结不同十字星K线的含义

不同的十字星K线代表了不同的含义&#xff0c;各位投资者你们知道这些十字星K线的含义吗&#xff1f;今天fpmarkets澳福就归类总结一下。 首先墓碑十字星和蜻蜓十字星归为一类&#xff0c;重点以墓碑十字星作为参考&#xff1a; 墓碑十字星是一种熊市反转烛台模式&#xff0c;当…

如何将域名解析成IP地址?

相对于繁琐的IP地址&#xff0c;域名以其简便的记忆方式成为人们访问网站的首选。然而&#xff0c;计算机通讯的本质需要使用IP地址&#xff0c;而计算机并不直接理解域名。在这个过程中&#xff0c;域名解析成为了关键一环&#xff0c;而这项任务由DNS&#xff08;域名系统&am…

MySQL:错误ERROR 1045 (28000)详解

1.问题说明 有时候我们登录Mysql输入密码的时候&#xff0c;会出现这种情况&#xff1a; mysql -u root -p Enter Password > ‘密码’ 错误&#xff1a;ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 或者&#xff1a;错误…

2月26日做题总结(C/C++真题)

今天是2024年2月16日&#xff0c;新学期开学第一天。在大三这个重要阶段&#xff0c;我决定参加24年秋招。在准备项目的同时&#xff0c;也先做一些入门的笔试题吧&#xff0c;慢慢积累。如果你也是处于这个阶段&#xff0c;欢迎来找我交流讨论&#xff01; 今天是做题第一天&a…

备战蓝桥杯Day17 - 链表

链表 基本概念 链表是由一系列节点组成的元素集合。 每个节点包含两部分&#xff1a;数据域 item 、指向下一个节点的指针 next 通过节点之间的相互链接&#xff0c;形成一个链表 1. 链表的初始化 # 手动建立链表 # 链表的初始化 class Node(object):def __init__(self, …

[图论] 树上不重复权值的路径数

解题思路 整体思路&#xff0c;枚举路径上每个点&#xff0c;记录这个点 u 可以向上延伸到多远&#xff0c;如果可延伸到 x 点&#xff0c;则这个点对答案的贡献为 dep[u] - dep[x](下文的maxx) 1 为什么枚举是向上延伸&#xff1f;因为可以记录已走过路径中已有的权值&…

【k8s配置与存储--配置管理】

1、ConfigMap的配置 1.1 ConfigMap介绍 ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 将你的环境配置信息和容器镜像解耦&#xff0c;便于应用配…

STM32 I2C学习

IIC总线协议介绍 IIC&#xff1a;Inter Integrated Circuit&#xff0c;集成电路总线&#xff0c;是一种同步、串行、半双工通信总线。 同步&#xff1a;需要时钟线 串行&#xff1a;数据一位一位地发送 半双工&#xff1a;同一时间只能接受或发送&#xff0c;不能同时发送或…

【java】使用springMVC优雅的响应数据

1.抽象接口 import java.io.Serializable; public interface IResultCode extends Serializable {String getMessage(); int getCode(); } 2. 利用枚举类实现接口创建对象 public enum ResultCode implements IResultCode {SUCCESS(200, "操作成功"),FAILURE(400, &…

input框 自动获取焦点

<el-input style"width:200px" autofocus v-model"leftListname"></el-input> element-ui 的 el-input 组件的 autofocus 属性在某些情况下不能实现自动聚焦,有几个可能的原因: 1. autofocus 在移动设备上不被支持。如果是在移动设备上访问,au…

题目 1311: 数字三角形

题目描述: 示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路 径&#xff0c;使该路径所经过的数字的总和最大。  每一步可沿左斜线向下或右斜线向下走&#xff1b;  1< 三角形行数< 25&#xff1b;  三角形中的数字为整数< 1000&#xff1b; 代码…

Redis 发布订阅详解

Redis 发布订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。 Redis 有两种发布订阅模式 基于频道&#xff08;Channel&#xff09;的发布订阅基于模式&#xff…

ChatGPT学习第三周

&#x1f4d6; 学习目标 ChatGPT在各行各业的应用 探索ChatGPT在不同领域&#xff08;如教育、客户服务等&#xff09;的实际应用案例。 ChatGPT的局限性和挑战 讨论ChatGPT面临的挑战&#xff0c;包括偏见、误解及其限制。 ✍️ 学习活动 学习资料 《人工智能通用大模型(…

openssl3.2 - exp - buf to bio

文章目录 openssl3.2 - exp - buf to bio概述笔记bio_get_length调用端代码函数实现bio_to_buffer END openssl3.2 - exp - buf to bio 概述 不想让程序调用openssl API时, 有文件落地的动作. 如果程序有配置文件要用, 也是自己读文件到buffer, 然后转成BIO给openssl的相关有…

Vue3学习——路由prop配置、replace

写法一 在路由中可直接写prop: true&#xff0c;即可在页面中defineProps使用 相当于&#xff08;<Detail id“1” name“2” />&#xff09;,但只能是params {path: /service,name: 服务,component: () > import(../views/Service/index)&#xff0c;props: true}…