今天看了数据结构的链式存储,写了一个简单的例子:
package com.test;
public class ImitateLinkedList<T> {
private Node head ;
private Node last;
//定义一个内部的节点类
private class Node{
private T element;
private Node next;
public Node(T element,Node next){
this.element = element;
this.next = next;
}
}
//元素的个数
private int size;
public ImitateLinkedList(){
head = last = null;
}
public void addElement(T element){
Node node = new Node(element,null);
if(size == 0){
head = last = node;
}else {
last.next = node;
last = node;
}
size++;
}
/**
* 输出链式列表的元素
*/
public void show(){
Node current = head;
while(current != null){
System.out.println(current.element);
current = current.next;
}
}
/**
* 在指定的位置加入元素
* @param index 索引位置
* @param element
*/
public void addElement(int index,T element){
//
if(index < 0){
index = 0;
}
Node node = new Node(element,null);
if(index == 0){
node.next = head;
head = node;
if(size == 0)
last = node;
}else if(index >= size -1){
last.next = node;
last = node;
}else {
Node previous = getNode(index -1);
Node next = getNode(index + 1);
node.next = previous.next;
previous.next = node;
}
size ++;
}
//得到索引位置的节点
private Node getNode(int index){
if(index < 0 || index >= size){
return null;
}
Node current = head;
for(int i = 0 ;i < index ;i++){
current = current.next;
}
return current;
}
/*
* 得到索引位置的元素
*/
public T get(int index){
checkIndex(index);
return getNode(index).element;
}
/**
* 删除索引位置的元素
* @param index
*/
public void removeElement(int index){
if(size == 0){
throw new RuntimeException("没有可删除的元素");
}
checkIndex(index);
if(index == 0){
head = head.next;
if(size == 1){
last = head;
}
}else if(index == size -1){
Node node = getNode(index - 1);
node.next = null;
last = node;
}else {
Node previous = getNode(index - 1);
Node removeNode = getNode(index);
previous.next = removeNode.next;
}
size --;
}
/**
*
* @param index 要删除的元素的索引
*/
private void checkIndex(int index) {
// TODO Auto-generated method stub
if(index < 0 || index >= size){
throw new IllegalArgumentException("invalid argument "+index);
}
}
/**
*
* @return 得到列表中最后一个元素
*/
public T getLast(){
return last == null ? null : last.element;
}
/**
* 得到列表中第一个元素
*
*/
public T getFirst(){
return head == null ? null : head.element;
}
public void removeFirst(){
if(size == 0){
throw new RuntimeException("列表为空,不能删除元素");
}
this.removeElement(0);
}
public void removeLast(){
if(size == 0){
throw new RuntimeException("列表为空,不能删除元素");
}
this.removeElement(size - 1);
}
public int size(){
return size;
}
public boolean isEmpty(){
return size == 0;
}
}
下面是测试代码
package com.test;
import org.junit.Before;
import org.junit.Test;
public class ImitateLinkedListTest {
private ImitateLinkedList<String> linkedList ;
@Before
public void setUp(){
linkedList = new ImitateLinkedList<String>();
}
@Test
public void testAddElement(){
linkedList.addElement("asdf");
linkedList.addElement("bdf");
linkedList.addElement("cfsd");
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
}
@Test
public void testShow(){
linkedList.addElement("asdf");
linkedList.addElement("bdf");
linkedList.addElement("cfsd");
linkedList.show();
}
@Test
public void testAddElementoverride(){
linkedList.addElement(0,"asdf");
linkedList.addElement(0,"bdf");
linkedList.addElement(0,"cfsd");
linkedList.show();
}
@Test
public void testRemoveElement(){
linkedList.addElement(0,"asdf");
linkedList.addElement(1,"bdf");
linkedList.addElement(2,"cfsd");
linkedList.removeElement(0);
linkedList.removeElement(0);
linkedList.removeElement(0);
linkedList.show();
}
@Test
public void testGetFirst(){
linkedList.addElement(0,"asdf");
linkedList.addElement(1,"bdf");
linkedList.addElement(2,"ahi");
linkedList.addElement(1,"ghf");
//linkedList.addElement("hello");
//linkedList.addElement(0,"cfsd");
///linkedList.removeElement(0);
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
linkedList.show();
}
@Test
public void testremoveFirst(){
linkedList.addElement(0,"asdf");
linkedList.addElement(1,"ghf");
linkedList.addElement("ccc");
linkedList.removeFirst();
linkedList.removeLast();
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
linkedList.show();
}
}
分享到:
相关推荐
操作系统课请求分页存储管理模拟模拟程序,程序相对简单,通过这个模拟程序能够帮助学习者会更好的学习os,供有需要的人学习使用。
4. **用户接口**:描述中提到“界面友好”,这意味着模拟程序可能包含一个简单的命令行界面,用户可以输入进程大小请求内存分配,或者释放已分配的内存。这个界面会显示内存的状态,如剩余空间、已分配区域等。 5. ...
本项目旨在模拟实现基本的段式存储管理,通过用户友好的界面展示内存分配与回收的过程,并进行地址映射。下面将详细介绍段式存储管理和该模拟实现的关键知识点。 1. **段式存储管理概念**: 段式存储管理是将一个...
请求调页存储管理是操作系统中虚拟内存管理的重要...总的来说,请求调页存储管理模拟实训是一项有助于提升对操作系统内存管理理解的实践任务,通过实际操作,可以增强对虚拟存储技术、页面置换算法等概念的深入认识。
### 模拟请求段式存储管理 #### 一、知识点概览 本次课程设计的核心是模拟请求段式存储管理,并采用FIFO(First-In First-Out)作为页面置换算法。主要涉及以下知识点: 1. **段式存储管理的基本概念**:包括段的...
通过编写和调试请求页式存储管理的模拟程序以加深对请求页式存储管理方案的理解。 为了简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,判断它是否被改写过,如果被修改过,将它写回到辅存。 ...
真正的模拟操作系统中 内存的分配 (分页存储管理)(操作系统模拟多进程内存分配) 连续的分配方式会形成许多碎片,虽然通过紧凑的方法将血多碎片拼接成可用的大块空间 但须付出很大的开销。如果允许将一个进程...
"简易模拟启动器"是一款专为测试各类存储设备启动功能设计的工具,它允许用户在无需实际重启计算机的情况下,预览并检验启动U盘、软盘、光碟或硬盘的启动效果。这款软件的出现极大地简化了系统启动项的调试过程,...
本实验旨在通过模拟虚拟存储管理,深入理解分页式存储管理和地址转换,以及如何处理缺页中断。 在分页式虚拟存储系统中,逻辑地址分为页号和页内偏移量两部分。当处理器执行指令时,会根据页号查找页表。页表包含了...
QQ Demon 是一个模拟QQ登录界面和好友列表的项目,它为开发者或学习者提供了一个实践社交应用界面设计和实现的平台。通过这个项目,你可以了解并掌握如何构建类似QQ这样的即时通讯软件的基本功能。 首先,我们需要...
本文将深入探讨一个基于Hbase的海量视频存储简单模拟项目,旨在利用Hadoop和Hbase这两个强大的开源工具来解决这个问题。 首先,我们要理解Hadoop和Hbase的角色。Hadoop是分布式计算框架,其核心组件包括HDFS...
Cookie 是一种小型文本文件,用于存储 Web 应用程序的状态信息。当用户访问某个网站时,该网站可能会将 Cookie 信息写入到用户的浏览器中,以便下次用户访问该网站时能够快速识别用户的身份。 为什么需要模拟 ...
本文将深入探讨如何使用File Allocation Table(FAT)文件系统实现一个简单的文件存储系统,以模拟磁盘存储,并结合Java的缓冲输入/输出(Buffered I/O)进行文件读写操作。FAT是一种广泛使用的、易于理解和实现的...
在本实验报告中,我们将深入探讨“存储管理的模拟实现”这一关键的计算机科学主题。存储管理是操作系统的核心部分,负责有效地分配、管理和回收内存资源,以确保系统高效运行。以下是对这一主题的详细阐述: 一、...
本实验报告关注的是虚拟存储中页面调度算法的模拟实现,包括FIFO(先进先出)、LRU(最近最久未使用)以及OPT(最佳置换)这三种常见算法。 1. **最佳置换算法(OPT)**: 最佳置换算法是一种理想化的理论算法,它...
在本次实验中,我们专注于模拟存储管理,特别是固定内存分区的管理。固定内存分区是指将内存划分为若干固定大小的区域,每个区域只能容纳特定大小的作业。这个实验的目标是理解和实现操作系统如何分配、使用和回收...
【C#简单模拟银行管理系统】是一个使用C#编程语言实现的简易版银行管理软件,它提供了基本的银行操作功能,如账户管理、存款、取款、转账等。这个项目主要适用于初学者熟悉C#编程环境和.NET框架,以及了解如何构建一...
在C#源代码中,我们可以构建一个数据结构来模拟页表,用于存储这种映射信息。 在地址映射算法的设计中,我们需要实现从虚拟地址到物理地址的转换。这个过程通常包括以下几个步骤: 1. **页号计算**:虚拟地址通常由...
本程序通过C语言实现了一个简单的动态分区存储管理系统,用于模拟在操作系统环境中如何进行内存分配、回收及合并等操作。该系统包括几个核心功能:内存分配、内存回收、内存显示以及内存区域合并。 #### 主要数据...
在这个项目中,我们关注的是虚拟存储中的页面调度算法,具体包括FIFO(先进先出)、LRU(最近最少使用)以及OPT(最佳页面替换)这三种算法的模拟实现。 1. FIFO(先进先出)算法是最简单的页面替换策略。当内存满...