代码贴--链表--数据机构

本博客将记录链表代码(单链表),后续其他链表和其他数据结构内容请看我的其他博客

头文件(SList.h)

#pragma once
#include<iostream>
#include<bits/stdc++.h>
using namespace std;

typedef int SLTDataType;

struct SListNode
{
	int data;
	struct SListNode* next;
};

typedef struct SListNode SLTNode;

void SListPrint(SLTNode* phead);
SLTNode* BuySListNode(SLTDataType x);
void SListPushBack(SLTNode*& pphead, SLTDataType x);
void SListPushFront(SLTNode*& phead, SLTDataType x);
void SListPopBack(SLTNode*& phead);
void SListPopFront(SLTNode*& phead);
SLTNode* SListFind(SLTNode*& phead, SLTDataType x);

void SListInsert(SLTNode*& phead, SLTNode* pos, SLTDataType x);
void SListErase(SLTNode*& phead, SLTNode* pos);

源文件(SList.cpp)

#include"SList.h"

void SListPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		cout << cur->data << "->";
		cur = cur->next;
	}
	cout << "NULL" << endl;
}

SLTNode* BuySListNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

void SListPushBack(SLTNode*& phead, SLTDataType x)//注意是引用或者指针的指针!!!
{
	SLTNode* newnode = BuySListNode(x);

	if (phead == NULL)
	{
		phead = newnode;
	}
	else
	{
		//找尾节点的指针
		SLTNode* tail = phead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}

		//尾节点,链接新节点
		tail->next = newnode;
	}
}
void SListPushFront(SLTNode*& phead, SLTDataType x)
{
	SLTNode* newnode = BuySListNode(x);
	newnode->next = phead;
	phead = newnode;


}
void SListPopFront(SLTNode*& phead)
{
	SLTNode* next = phead->next;
	free(phead);
	phead = next;
}
void SListPopBack(SLTNode*& phead)
{
	if (phead == NULL)//空
	{
		return;
	}
	else if (phead->next == NULL)//一个节点
	{
		free(phead);
		phead = NULL;
	}
	else//一个以上的节点
	{
		SLTNode* prev = NULL;
		SLTNode* tail = phead;
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		tail->next = NULL;
		free(tail);
		prev->next = NULL;
	}
}

SLTNode* SListFind(SLTNode*& phead, SLTDataType x)
{
	SListNode* cur = phead;
	//while(cur!=NULL)
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
			cur = cur->next;
	}
	return NULL;
}


//在pos的前面插入x
void SListInsert(SLTNode*& phead, SLTNode* pos, SLTDataType x)
{
	if (pos == phead)//判断是否是头插
	{
		SListPushFront(phead, x);
	}
	else
	{
		SLTNode* prev = phead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		SLTNode* newnode=BuySListNode(x);
		prev->next = newnode;
		newnode ->next= pos;
	}
}

//删除pos位置的值
void SListErase(SLTNode*& phead,SLTNode* pos)
{
	if (pos ==phead)//判断是不是头删
	{
		SListPopFront(phead);
	}
	else
	{
		SLTNode* prev = phead;
		while (prev->next!=pos)
		{
			prev = prev ->next;
		}
		prev->next = pos->next;
		free(pos);
	}
}

测试文件(Test.cpp)

#include"SList.h"

void TestSList1()
{
	SLTNode* phead = NULL;
	SListPushBack(phead, 1);
	SListPushBack(phead, 2);
	SListPushBack(phead, 3);
	SListPushBack(phead, 4);
	SListPrint(phead);

	SListPushFront(phead, 0);
	SListPrint(phead);

	SListPushFront(phead, -1);
	SListPopFront(phead);
	SListPopFront(phead);
	SListPrint(phead);

	SListPopBack(phead);
	SListPopBack(phead);
	SListPrint(phead);
	
	//在1前面加一个10
	SLTNode* pos1 = SListFind(phead,1);
	SListInsert(phead, pos1, 10);
	SLTNode* pos2 = SListFind(phead, 2);
	SListInsert(phead, pos2, 20);
	SLTNode* pos3 = SListFind(phead, 3);
	SListInsert(phead, pos3, 30);
	SListPrint(phead);

	SLTNode* pos10 = SListFind(phead, 10);
	SListErase(phead, pos10);
	SLTNode* pos20 = SListFind(phead, 20);
	SListErase(phead, pos20);
	SListPrint(phead);
}

int main()
{
	TestSList1();
	
	return 0;
}

代码演示

如果这个博客对你有帮助,给博主一个免费的点赞就是最大的帮助❤
欢迎各位点赞收藏关注哦❤
如果有疑问或有不同见解,欢迎在评论区留言❤
后续会继续更新大连理工大学相关课程和有关数据结构的内容和代码
点赞加关注,学习不迷路,好,本次的学习就到这里啦!!!

我们下次再见!

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

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

相关文章

每日OJ题_牛客HJ37 统计每个月兔子的总数(IO型OJ)

目录 牛客HJ37 统计每个月兔子的总数 解析代码 牛客HJ37 统计每个月兔子的总数 统计每个月兔子的总数_牛客题霸_牛客网 解析代码 #include <iostream> #include <vector>using namespace std; int main() {int n 0;cin >> n;vector<int> arr(n 1…

VRay渲染动画怎么快一点?提升VRay动画渲染方法

随着动画和视觉效果行业对高品质渲染的需求日益增长&#xff0c;V-Ray作为一款领先的渲染工具&#xff0c;面临着提升渲染效率的挑战。项目规模和复杂度的扩大导致渲染时间延长&#xff0c;对交付期限造成影响。探索加速V-Ray渲染流程的方法变得尤为关键。 一、动画渲染的常见瓶…

docker-compose up -d使用遇到问题no configuration file provided: not found

docker-compose up -d使用遇到问题&#xff0c;因为你文件名称没指定&#xff0c; 又找不到默认的文件名称&#xff1b;如果该目录下有个文件叫docker-compose.yml时&#xff0c;那么可以直接使用docker-compose up -d;否则就要使用docker-compose -f mysql up -d

4、设计模式之建造者模式(Builder)

一、什么是建造者模式 建造者模式是一种创建型设计模式&#xff0c;也叫生成器模式。 定义&#xff1a;封装一个复杂对象构造过程&#xff0c;并允许按步骤构造。 解释&#xff1a;就是将复杂对象的创建过程拆分成多个简单对象的创建过程&#xff0c;并将这些简单对象组合起来…

Vue.js过滤器:让数据展示更灵活

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

认识与理解java中的stream流

系列文章目录 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&#xff1e;实现自定义字符串排序&#xff08;key排序、Val…

【LeetCode: 2864. 最大二进制奇数 + 模拟 + 位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

HarmonyOS NEXT应用开发之深色跑马灯案例

介绍 本示例介绍了文本宽度过宽时&#xff0c;如何实现文本首尾相接循环滚动并显示在可视区&#xff0c;以及每循环滚动一次之后会停滞一段时间后再滚动。 效果图预览 使用说明&#xff1a; 1.进入页面&#xff0c;检票口文本处&#xff0c;实现文本首尾相接循环滚动&#x…

Day15 面向对象进阶——接Day14

Day15 面向对象进阶——接Day14 文章目录 Day15 面向对象进阶——接Day14一、访问修饰符二、Object三、深入String的equals()方法四、final 一、访问修饰符 1、含义&#xff1a;修饰类、方法、属性&#xff0c;定义使用的范围 2、经验&#xff1a; 2.1.属性一般使用private修…

ts--(入门到离职系列)

TS 与 JS 的区别 TypeScript[4] 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集&#xff0c;而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。-- 官方文档 说人话就是 TS 拓展了 JS 的一些功能&#xff0c;解决了 JS 的一些缺点&#…

vite配置

"vite": "^5.1.4" resolve.alias&#xff1a;配置别名 1、执行npm install -D types/node 或者 yarn add types/node -D 2、以下配置代表访问src时可以用“”代替 resolve: {alias: {"": path.resolve(__dirname, "./src"),},}, 使…

关于分布式微服务数据源加密配置以及取巧方案(含自定义加密配置)

文章目录 前言Spring Cloud 第一代1、创建config server项目并加入加解密key2、启动项目&#xff0c;进行数据加密3、实际项目中的测试server Spring Cloud Alibaba低版本架构不支持&#xff0c;取巧实现无加密配置&#xff0c;联调环境问题加密数据源配置原理探究自定义加密解…

牛客:反转链表

牛客&#xff1a;反转链表 题目描述方法一&#xff1a;代码解题思路 方法二&#xff1a;代码解题思路 题目描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链…

OpenHarmony开源项目—工程管理

DevEco Studio的基本使用&#xff0c;请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明&#xff1a; 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍&#xff0c;如您使用DevEco Studio其它版本&#xff0c;可能存在文档与产…

【计算机网络实践】FileZilla Server1.8.1实现局域网ftp文件传输

大二新生随便写写笔记&#xff0c;轻喷&#xff0c;鉴于本人在网络搜索中并未搜索到1.8.1版本的使用方法&#xff0c;因而瞎写一页。 一、准备 下载一个FileZilla Server1.8.1在你想作为服务器的主机上&#xff08;此处直接在官网下载即可&#xff1a;Download FileZilla Serve…

【代码随想录 | 链表 04】删除链表的倒数第N个节点

文章目录 4.删除链表的倒数的第N个节点4.1题目4.2解法&#xff1a;双指针 4.删除链表的倒数的第N个节点 19.删除链表的倒数第N个节点 4.1题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例一&#xff1a; 输入&#xff1a;h…

公众号开篇-安利一款好用的公众号编辑器工具

前言 经过一番思索和考证&#xff0c;最终还是决定把微信公众号也捡起来。 以前没怎么搞过公众号&#xff0c;只是做了个注册并没有做后期维护和运营&#xff0c;所以这次如果要做的话也算是比较干净的从0到1的过程。 万事开头难&#xff0c;还望诸位能够多多支持&#xff0…

如何开发SDK项目,详细带领理解实践

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录 SDK-Starter …

从汇编来角度剖析C语言函数调用过程

目录 1.引言 2.寄存器 3.栈帧 4.函数调用前调用者的动作 5.被调用者在函数调用后的动作 6.被调用者返回前的动作 7.调用者在返回后的动作 8.总结 1.引言 当一个c函数被调用时&#xff0c;一个栈帧(stack frame)是如何被建立&#xff0c;又如何被消除的。这些细节跟操作…

学习c语言:单链表的应用

一、单链表经典算法 1.1 单链表相关经典算法OJ题1&#xff1a;移除链表元素 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.…