今天看了数据结构的链式存储,写了一个简单的例子:
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,供有需要的人学习使用。
使用FAT实现一个简单的文件存储系统~能使Java 缓冲IO从这个文件系统中读写文件
通过编写和调试请求页式存储管理的模拟程序以加深对请求页式存储管理方案的理解。 为了简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,判断它是否被改写过,如果被修改过,将它写回到辅存。 ...
真正的模拟操作系统中 内存的分配 (分页存储管理)(操作系统模拟多进程内存分配) 连续的分配方式会形成许多碎片,虽然通过紧凑的方法将血多碎片拼接成可用的大块空间 但须付出很大的开销。如果允许将一个进程...
根据进程的要求按照段式存储管理方式模拟内存空间的分配与回收,并能够根据进程的空间分配情况完成地址映射。简单界面显示内存情况!供参考。
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及用先进先出(FIFO)页面调度算法处理缺页中断。 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。(题目四) 包含详细实验报告·
全国交通咨询简易模拟,VC++6.0编译通过,注释详细。 用邻接表来存储全国交通图;用迪杰斯特拉(Dijkstra)算法实现最短路径的查询;只实现了最短路径的查询, 其他条件查询可以通过此程序扩展。
写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平 均时间。 [测试数据] 一天营业开始时银行拥有的款额为10000(元).营业时间为600(分钟)。其他模拟参量 自定。注意测定两种极端的情况...
本文用C语言编写了一个简单的存储管理系统,供大家参考。
C语言模拟实现Linux文件系统 1、在内存中开辟一块空间来模拟文件系统的运行,不读写硬盘。 2、面向单用户、单任务,不考虑并发,不考虑文件属主、组等概念。 3、程序开始后,初始化并接收用户输入。若输入”enter”...
真正的模拟操作系统中 内存的分配 (分页存储管理)(操作系统模拟多进程内存分配) 连续的分配方式会形成许多碎片,虽然通过紧凑的方法将血多碎片拼接成可用的大块空间 但须付出很大的开销。如果允许将一个进程...
C++ os课程设计 连续文件、串联文件、索引文件 有报告 程序很简单
本系统是本人刚做的毕业设计,内容比较简单,但是网上这方面的毕业设计参考文档比较少,于是就将自己的漏作传上来了,只是为了给做此题目的同学一些参考,希望能够帮到大家。 摘要:随着数字经济时代的到来和...
模拟一个简单二级文件管理系统 设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 设计内容:模拟一个简单二级文件管理系统
设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求: (1) 支持多级目录结构,支持文件的绝对读路径; (2) 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式; (3) 采用文件...
1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的...
深入理解操作系统中虚拟存储机制,并掌握虚拟存储中页面调度算法实现方法。设计简单的交互界面,演示所设计的功能。
操作系统 模拟分页储存管理 实验报告 学校课程设计时候弄的
本系统是本人刚做的毕业设计,内容比较简单,但是网上这方面的毕业设计参考文档比较少,于是就将自己的漏作传上来了,只是为了给做此题目的同学一些参考,希望能够帮到大家。 摘要:随着数字经济时代的到来和...
过简单的程序模拟两种存储管理算法,通过输入页面访问序列,查页表等操作判别是否缺页,按照FIFO和LRU两种算法淘汰页面,并调入所访问的页面,打印输入结果,在程序中,0代表为空,*代表缺页。 向管道中写入各自的...