链表的创建

article/2025/9/30 13:31:42

目录

 一:链表的定义 

 二:链表的改进


链表的实现可以为后面JAVA的类集框架服务。

链表是一种最简单的数据结构,其主要目的是依靠引用关系实现多个数据的保存。

一:链表的定义 

 

 定义一个Node类,保存的数据是String型,同时存储下一个数据的引用。

Node类只负责保存节点关系,但是具体的保存由其他类负责

class Node{/*链表的属性*/private String data;//数据private Node next;//下一个节点/*链表的构造*/public Node(String data) {//构造函数,定义数据this.data=data;}public void setNode(Node next) {//存储下一个节点信息this.next=next;}/*功能函数:取出数据或下一节点*/public String getData() {return this.data;}public Node getNode() {return this.next;}
}

 取数据:主程序法

 public static void main(String[] args) {/*第一步:创建链表*/Node root=new Node("火车头");Node n1=new Node("车厢A");Node n2=new Node("车厢B");root.setNode(n1);n1.setNode(n2);n2.setNode(null);/*第二步:取出所有数据*/	   Node curNode=root;while(curNode!=null) {System.out.println(curNode.getData());curNode=curNode.getNode();}}
 public static void print(Node cur) {if(cur==null) return;System.out.println(cur.getData());print(cur.getNode());//递归调用print()}

最后程序:

class Node{/*链表的属性*/private String data;//数据private Node next;//下一个节点/*链表的构造*/public Node(String data) {//构造函数,定义数据this.data=data;}public void setNode(Node next) {//存储下一个节点信息this.next=next;}/*功能函数:取出数据或下一节点*/public String getData() {return this.data;}public Node getNode() {return this.next;}
}
public class transfer {public static void main(String[] args) {/*第一步:创建链表*/Node root=new Node("火车头");Node n1=new Node("车厢A");Node n2=new Node("车厢B");root.setNode(n1);n1.setNode(n2);n2.setNode(null);print(root);//调用函数}public static void print(Node cur) {if(cur==null) return;System.out.println(cur.getData());print(cur.getNode());//递归调用print()}
}

由于取数据无法知道长度,一般只能用while,但是由于定义函数递归调用会比while更直观更易读。
核心:封装Node类的数据,然后利用Node的引用传递去排序数据。

 二:链表的改进

上述定义存在的问题:
1:用户在操作链表功能时没必要知道Node类的存在。
2:节点的引用关系不应该由用户处理,需要一个专门工具类
总之:客户端应该向用户隐藏链表的具体细节,用户只需要知道怎么存数据和取数据

这里选用尾插法,目的是为了在已有节点的最后插入新节点,根节点root不存数据 

class Node{//作为隐藏类,用户无需清楚/*节点的添加:目的找到已有数据的最后一个节点*/public void addNode(Node newNode) {//第一次调用:Link.rootif(this.next==null) {//根节点后为空,直接连this.next=newNode;}else {//根节点后有数据,递归this.next.addNode(newNode);}}public void printNode() {System.out.println(this.data);if(this.next!=null) {this.next.printNode();}}
}

 在Node类新加入两个函数:addNode()和printNode(),目的在于为用户操作的LinkNode类提供打印和添加节点操作。

class Link{//负责数据的设置和输出private Node root;//起始标志/*增加数据*/public void add(String data) {Node newNode=new Node(data);if(this.root==null)  this.root=newNode;//没有根节点时执行,且执行一次else   this.root.addNode(newNode);//根节点已经存在了,采取尾插法}/*取出数据*/public void print() {if(this.root!=null) {this.root.printNode();}}
}

创建链表的逻辑:
首先利用new关键字,在内存中开辟出空间(Node newNode=new Node(data);
然后判断有无根节点,这是链表创建的初始化,如果有了根节点,接下来的操作也就是节点next的指向通过调用Node类的:addNode()
下面进行尾插法:(找到最后一个节点)
1:根节点后无新节点,直接:(this.next=newNode;
2:根节点有新节点,递归调用addprint()去寻找,找到后执行(this.next=newNode;

主程序
     
   Link link=new Link();//创建了根节点
         link.add("火车头");
         link.add("车厢A");
         link.add("车厢B");
         link.add("车厢C");

总结:
Link类:控制Node类对象的产生和根节点
Node类:主要负责数据的保存和引用关系的分配

最后代码:

class Node{//作为隐藏类,用户无需清楚/*链表的属性*/private String data;private Node next;/*链表的构造*/public Node(String data) {this.data=data;}public void setNode(Node next) {this.next=next;}/*功能函数:取出数据或下一节点*/public String getData() {return this.data;}public Node getNode() {return this.next;}/*节点的添加:目的找到已有数据的最后一个节点*/public void addNode(Node newNode) {//第一次调用:Link.rootif(this.next==null) {//根节点后为空,直接连this.next=newNode;}else {//根节点后有数据,递归this.next.addNode(newNode);}}public void printNode() {System.out.println(this.data);if(this.next!=null) {this.next.printNode();}}
}
class Link{//负责数据的设置和输出private Node root;//起始标志,不保存数据,指向下一个节点/*增加数据*/public void add(String data) {Node newNode=new Node(data);if(this.root==null)  this.root=newNode;//没有根节点时执行,且执行一次else   this.root.addNode(newNode);//根节点已经存在了,采取尾插法}/*取出数据*/public void print() {if(this.root!=null) {this.root.printNode();}}
}
public class transfer {public static void main(String[] args) {Link link=new Link();link.add("火车头");link.add("车厢A");link.add("车厢B");link.add("车厢C");link.print();}
}

 


http://chatgpt.dhexx.cn/article/3OhqTskH.shtml

相关文章

C语言之创建链表

自己琢磨着思考了一下书上的单链表的创建案例&#xff0c;记录一下自己的理解 代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>struct Student{char cName[20];int age;struct Student* pNext; }; /*节点数量*/ int iCount0;/*创建链表的函数 返回头…

如何创建链表?

链表&#xff1a; 链表的组成其实很简单&#xff0c;就是由很多结点组成的。 一个结点包含数据域和指针域&#xff0c;数据域用来存放数据&#xff0c;指针域负责指向其他结点&#xff0c;起到链接的作用。创建链表&#xff1a; 其实创建一个链表也很简单&#xff0c;在我看来…

用CodeBlocks写SFML程序

vs2019 写sfml程序简直杀鸡用牛刀&#xff0c;vs2019占用资源太大了。 所以我想到了用Dev-C&#xff0c;然而我不会配置&#xff0c;卑鄙的CSDN相关资料查阅需要VIP&#xff0c;然而VIP太贵了。 SFML官方教程是用Code::Blocks&#xff0c;于是去下一个。 setup安装........ …

[笔记]使用SFML来生成分形图片

前言 最近在上《优秀科普纪录片》时&#xff0c;看了一部有关 分形 的纪录片&#xff0c;在观看的过程中&#xff0c;想着自己也来生成一些分形图片&#xff0c;正好偶然了解到了SFML这个简单的图形库&#xff0c;所以天时地利人和&#xff0c;正好查一些资料来学习一下。 以…

SFML环境配置

材料&#xff1a; 1.visual studio 2017 2.SFML-2.5.1-windows-vc15-32-bit 准备阶段 1.进入SFML官网下载sfml-vs2017-32bit版本 2.将该压缩包解压在一个文件夹中 步骤&#xff1a; 1.进入vs&#xff0c;在上述文件夹中新建Empty Project&#xff0c;右键资源文件->添加-…

[SFML] 多个OpenGL上下文

代码 #include <iostream> #include <gl/glew.h> #include <SFML/Graphics.hpp> #include <windows.h>int main() {auto getInstance [](){return (HINSTANCE)GetModuleHandle(nullptr);};auto debug [](GLenum source, GLenum type, GLuint id, GL…

SFML配置问题

先去下载安装包&#xff0c;这里我就不多说了&#xff0c;我想说的是其中的报错问题&#xff0c;按照我所说的对照下去&#xff0c;一般不会出现报错现象。 ** 第一步&#xff1a; **找到项目属性&#xff0c;这里我选择所有配置和所有平台&#xff0c;你们也可以选择其他的。…

SFML+vs2019安装

SFMLvs2019安装 1.创建一个c空项目 2.打开属性管理器 3.添加新项目属性表 在64下单击鼠标右键 添加成功后回到属性表64找到刚刚添加的属性表单击鼠标右键–>属性单击 找到SFML安装目录的include&#xff0c;复制路径粘贴到C/C->常规–>附加包含目录 找到SFM…

SFML初学-俄罗斯方块实现

偶然看到大神使用 SFML 制作游戏&#xff0c;简单学习了一下这个库的使用并且仿照YouTube上大神的思路做了一个俄罗斯方块&#xff0c;目前只实现了出现方块、消除方块的功能&#xff0c;随着慢慢学习一点点继续修改吧&#xff1b; 资源&#xff1a; 源码&#xff1a; /*******…

使用c++SFML制作月圆之夜总集篇

写在开头 重新以时间线的形式整理一下去年使用c的SFML库制作月圆之夜&#xff08;游戏程序设计大作业&#xff09;的开发过程&#xff0c;括号里面是新的补充以及对一年前自己的吐槽 因为是在大二转专业后做首次接触游戏开发后才做的&#xff0c;当时c学习得并不好&#xff0…

SFML loadFromFile()出错:failed to load image

解决方法&#xff1a;确保你的依赖项和你的运行库一致。 如果你的附加依赖项&#xff08;即动态链接库的.lib文件&#xff09;是debug版本&#xff0c;即以-d结尾。那么你的运行库也必须为debug版&#xff0c;即MDd。&#xff08;如下&#xff09; 附加依赖项的位置&#xff1…

用c++和SFML实现简易的界面版贪吃蛇

运行截图 等待开始界面 运行过程 失败界面截图 SFML配置 csdn上面已经有很多SFML配置的blog&#xff0c;随便就能搜到。正常配置好SFML后&#xff0c;还需要将字体ttf文件放在源代码同一目录和exe同一目录中&#xff0c;不然无法显示字符 代码部分 下面贴上各个部分的代码 …

VS2017、VS2019配置SFML

一、sfml官网下载32位的版本 一样的设置&#xff0c;64位的版本我没有成功&#xff0c;用不了。 https://www.sfml-dev.org/ bin目录下的文件拷贝到System32和SysWOW64里面。 二、 鼠标右击红色处&#xff0c;弹出菜单&#xff0c;点最后那个属性。 如果不是win32&#xff0c;…

VS2019配置SFML

VS2019配置SFML 1.下载安装SFML SDK 网址&#xff1a;https://www.sfml-dev.org/download.php 解压并放在文件夹里&#xff0c;记住这个路径。 在我的电脑中这个路径是F:\CProjects\_library\SFML-2.5.1 2.VS新建一个C控制台项目 我命名为SfmlTest&#xff0c;并放在常用的项…

sfml-tutorials 官方教程 windows篇

系列文章 SFML-windows 篇 SFML-Events explained 篇 SFML-Keyboard, mouse and joystick 篇 SFML-Using OpenGL in a SFML window 篇 SFML-Drawing 2D stuff 篇 SFML-Shapes 篇 SFML-Sprites and textures 篇 文章目录 系列文章打开一个windows执行windows绘制windows控制帧速…

SFML基础

原文地址&#xff1a;https://www.cnblogs.com/karl07/p/10285692.html (1) 窗口和交互 创建一个新窗口&#xff1a; sf::RenderWindow window(sf::VideoMode(500,500),"new window"); 但是光创建一个窗口并不能显示 还要加一个循环 while (window.isOpen()){sf:…

引擎开发四: SFML库及使用

SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 主要由五个模块组成&#xff0c;分别是&#xff1a;系统&#xff0c;窗口&#xff0c;图形&#xff0c;音频和网络。 SFML 是跨平台的&#xff0c;通过 SFML&…

【C++】开源:多媒体SFML库使用入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍SFML库使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

使用SFML框架打造属于自己的俄罗斯方块

目录 一、效果展示 二、游戏说明 三、开发环境 四、代码展示 五、代码详解 1.游戏区域表示 2.方块表示 3.方块旋转 4.消行处理 六、个性化定制 七、结语 一、效果展示 二、游戏说明 相信大家都玩过俄罗斯方块&#xff0c;五种按键就能带来极高的可玩性。如果想要开发…

超详细!SFML库vs2022配置教程

1.官网下载SFML 官方网址&#xff1a;SFML 点击下载 根据自己电脑选择合适的版本下载 我的电脑是64位的 下载完成之后将文件放在一个自己方便找到的地方 2.vs2022配置 选择空项目 添加cpp源文件 附加包含目录 添加你SFML中的include路径 例如&#xff1a; 添加SFML中的li…