/*本程序是程序的入口,打印菜单并调用相应的功能*/
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class TestLinkedList{
public static void main(String args[]){
int select=0;
int value=-1,temp=0;
MyLinkedList linkedList=new MyLinkedList(10);
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
bh:while(true){
System.out.println("===========车厢的操作===========");
System.out.println(" 1.插入车厢");
System.out.println(" 2.删除车厢");
System.out.println(" 3.修改车厢号");
System.out.println(" 4.查询车厢");
System.out.println(" 5.打印车厢");
System.out.println(" 6.退出程序");
System.out.println("===============================");
System.out.print("请选择车厢的操作:");
try{
select=Integer.parseInt(in.readLine());
}catch(Exception e){
System.out.println("输入错误!程序回到主菜单!");
continue;
}
switch (select){
case 1: //1.插入
System.out.println("请输入要插入的数据:");
try{
value=Integer.parseInt(in.readLine());
}catch(Exception e){
System.out.println("输入错误!程序回到主菜单!");
continue;
}
linkedList.insert(value);
break;
case 2: //2.删除
System.out.println("请输入要删除的车厢:");
try{
value=Integer.parseInt(in.readLine());
}catch(Exception e){
System.out.println("输入错误!程序回到主菜单!");
continue;
}
linkedList.delete(value);
break;
case 3: //3.修改
System.out.println("请输入要替换的车厢:");
try{
value=Integer.parseInt(in.readLine());
}catch(Exception e){
System.out.println("输入错误!程序回到主菜单!");
continue;
}
System.out.println("请输入新的车厢:");
try{
temp=Integer.parseInt(in.readLine());
}catch(Exception e){
System.out.println("输入错误!程序回到主菜单!");
continue;
}
linkedList.update(value,temp);
break;
case 4: //4.查询
System.out.println("请输要查询的车厢:");
try{
value=Integer.parseInt(in.readLine());
}catch(Exception e){
System.out.println("输入错误!程序回到主菜单!");
continue;
}
linkedList.select(value);
break;
case 5: //5.打印
linkedList.print();
break;
case 6: //6.退出
System.out.println("程序退出");
break bh;
default:
System.out.println("选择的功能不存在!程序回到主菜单!");
} //switch
}//while
}
}
/*
类MyLinkeList 是单向链表类,封装了单向链表的各种操作
*/
class MyLinkedList{
private int maxSize; //数组长度
private int data[]; //数据域
private int next[]; //指针域
private int head=-1; //链表的头指针
public MyLinkedList(int maxSize){
this.maxSize=maxSize;
data=new int[maxSize];
next=new int[maxSize];
for(int i=0;i<maxSize;i++) next[i]=-2;
}
private int getFreePos(){
for(int i=0;i<maxSize;i++){
if (next[i]==-2) return i;
}
return -1;
}
public void insert(int value){
int freePos=getFreePos(); //得到空闲的(即可用的)数组下标
if (freePos==-1){ //判断数组空间是否用完
System.out.println("存储空间已满,不能插入!");
return;
}
data[freePos]=value; //创建新节点
next[freePos]=-1;
if(head==-1){ //如果链表为空,则将新节点放在第一个位置
head=freePos; //头指针指向第一个节点
return;
}
if(value<data[head]){ //新节点插入头位置
next[freePos]=head; //新节点指向原来的头节点
head=freePos; //这时,新节点变成头节点,所以头指针指向新的头节点
return;
}
int p=head;
while(next[p]!=-1){ //新节点插入中间位置,即p位置之后
if(data[p]<=value &&data[next[p]]>value){
next[freePos]=next[p]; //新节点指向p的下一个节点
next[p]=freePos; //p指向的节点的指针指向新节点
return;
}
p=next[p];//p指针向下移,指向下一个节点
}
next[p]=freePos;//新节点插入尾位置
}
public void delete(int value){
if(head==-1){//如果是空链表,这不能删除
System.out.println("车厢为空,不能删除!");
return;
}
int p=head;
if(data[p]==value){//删除头节点
p=head; //p指向原来的头节点
head=next[head];//head指向新的节点,即第二个节点
data[p]=0; //释放p所指向的节点
next[p]=-2; //释放p所指向的节点
return;
}
p=head;
int q=p;
while (p!=-1){ // 删除非头节点
if(data[p]==value){//查找删除值的节点位置
next[q]=next[p]; //p的上一个节点指向p的下一个节点,即删除p的节点
data[p]=0; //释放p所指向的节点
next[p]=-2;//释放p所指向的节点
return;
}
q=p; //q指向当前节点,p指向下一个节点,这样q就指向p的前一个节点
p=next[p];
}
}
public void update(int oldValue,int newValue){
if(head==-1){ //如果是空链表,则不能修改
System.out.println("车厢为空,不能修改!");
return;
}
int p=head;
int q=p;
while (p!=-1){ //遍历数组
if(data[p]==oldValue){ //查找修改的节点位置
data[p]=newValue; //查找修改值的位置,找到后赋新值
next[q]=next[p]; //p的上一个节点指向p的下一个节点,相当于删除p指向的节点
insert(data[p]); //将修改的节点重新插入,以使其保持有序
return;
}
q=p; //q指向当前节点,p指向下一个节点,这样q就指向p的前一个节点
p=next[p];
}
}
public void select(int value){
if(head==-1){ //如果是空链表,则不能修改
System.out.println("车厢为空,不能查询!");
return;
}
int p=head;
while (p!=-1){ //遍历链表,进行查询
if(data[p]==value){
System.out.println("要找的节点在"+p+"的位置上!");
return;
}
p=next[p];
}
System.out.println("火车没有要查的车厢!");
}
public void print(){
if(head==-1){ //链表为空,不能打印
System.out.println("车厢空!");
return;
}
System.out.print("车厢的值为:");
int p=head;
while (p!=-1){
System.out.print("车厢"+data[p]+"-->");
p=next[p];
}
System.out.println("结束");
}
} //MyLinkeList
- 大小: 19.3 KB
分享到:
相关推荐
数据结构单链表插入、删除和修改实验报告 一、实验目的 1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。 2.掌握单链表中结点结构的JAVA描述。 3.熟练掌握单链表的插入、删除和查询算法的设计与JAVA实现...
单链表的插入,删除,排序!集合的并、交和差运算 编制一个能演示执行集合的并、交和差...vc mfc编的 集合运算 交并补差 包含...采用有序单链表表示集合
在本资源"单链表插入删除动态演示源代码"中,你可以找到实现这些操作的C++或Java等编程语言的源代码。动态演示部分可能使用图形用户界面(GUI)库,如Qt或Swing,来直观地展示链表操作的过程,这对于理解和学习数据...
本文以“我的Java单链表练习”为主题,通过博主baby69yy2000在iteye上的博客分享,深入探讨了Java中实现单链表的相关知识。 首先,我们要理解单链表的概念。单链表是一种线性数据结构,由一系列节点(也称为元素或...
本实验报告详细介绍了如何在单链表中进行插入和删除操作,这对于理解和掌握数据结构的动态管理至关重要。 ### 单链表的插入操作 #### 插入操作的原理 在单链表中插入一个新节点通常涉及以下步骤: 1. **定位插入...
本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...
在Java中,我们可以使用对象和引用的概念来实现单链表。 首先,我们需要创建一个表示链表节点的类Node,它通常有两个属性:data(用于存储数据)和next(用于存储指向下一个节点的引用)。例如: ```java public ...
这个数据结构在处理动态数据集合时非常有用,因为它允许快速插入和删除操作。下面我们将详细探讨如何在Java中实现单链表的增、删、改、查功能,以及如何进行选择排序、冒泡排序和反转排序。 1. **单链表的定义**: ...
在这个主题中,我们将深入探讨如何使用Java来实现单链表,特别是关注如何插入元素以及如何构建链表。 单链表由一系列节点组成,每个节点包含两部分:数据元素和指向下一个节点的引用。在Java中,我们可以通过创建一...
本教程将深入探讨如何使用Java语言来实现单链表及其相关操作。 首先,我们来理解单链表的基本概念。单链表由一系列节点组成,每个节点包含两部分:数据域(用于存储数据)和指针域(指向下一个节点)。链表的最后一...
这个“java单链表—修订版”主题涵盖了一些基本的链表操作,包括创建链表、删除最后一个元素、删除指定元素、清空链表以及判断链表是否为空。以下是对这些操作的详细解释: 1. **建立单链表**:创建链表通常从头...
本资料主要涵盖了Java单链表的基本操作,包括链表的定义、创建、插入、删除、遍历等核心概念。 单链表由一系列节点组成,每个节点包含两部分:数据元素(data)和指向下一个节点的引用(next)。链表的头部是第一个...
【Java泛型单链表】是一种使用Java编程语言实现的数据结构,主要涉及到链表的创建、插入、删除等基本操作。在Java中,泛型允许我们编写可重用的代码,适用于多种数据类型,而无需进行重复的类型转换。在这个实现中,...
在这个"Java算法实例-单链表操作"中,我们将探讨如何在Java中实现单链表,包括其基本操作如插入、删除、遍历等。这些操作对于理解和解决各种算法问题至关重要,尤其对于学习和准备编程考试的学员来说,是非常实用的...
总结来说,Java中的单链表是一种灵活的数据结构,适合处理动态变化的数据集合,尤其在插入和删除操作频繁的情况下。然而,由于其线性查找特性,对于需要快速访问特定位置的场景,其他数据结构如数组或哈希表可能更为...
在这个"java单链表的基本操作 单链表练习题.zip"压缩包中,我们可以预见到包含了一个名为"linked-list-master"的项目,它很可能是为了帮助学习者通过实践来理解和掌握单链表的各种操作。下面,我们将深入探讨单链表...
通过这个实验,学生不仅能够学习到单链表插入操作的理论,还能在实践中遇到和解决可能出现的问题,如内存管理、空指针异常等。同时,这也为后续学习更复杂的数据结构,如双链表、循环链表和树等打下坚实基础。 实验...
在Java编程中,学生单链表是一种常见的数据结构,用于存储和操作一系列按特定顺序排列的学生数据。这个压缩包中的`studentlinklist.java`文件很可能包含了实现学生单链表的类,以及相关的操作方法。下面将详细介绍...
链表的JAVA实现 链表的建立、插入、删除操作