`

数据结构之线性表泛型实现

阅读更多

概述

线性表主要有两种存储方式,分别是顺序存储以及链式存储.顺序存储一般使用数组来实现,链式存储用引用,相当于C语言中的指针.在Java的集合类中,ArrayList可以用来代表顺序表,LinkedList可以代表链表.

本来简单描述自定义的顺序表以及连接,并且引入Java泛型

 

IList接口

首先,我们定义一个IList接口:

 

package com.james.list;

public interface IList<T> {
	public void clear();
	public boolean isEmpty();
	public int length();
	public T get(int i) throws Exception;
	public void insert(int index, T x) throws Exception;
	public void remove(int index) throws Exception;
	public int indexOf(T x);
	public void display();
}

 

 

自定义ArrayList实现以及测试

 

package com.james.list;

import java.util.Arrays;

public class MyArrayList<T> implements IList<T> {
	private T[] elem;
	private int currLen;

	public MyArrayList(int maxSize) {
		currLen=0;
		elem = (T[])new Object[maxSize];
	}

	public void clear() {
		currLen=0;	
	}

	public boolean isEmpty() {
		return (currLen == 0);
	}

	public int length() {
		return currLen;
	}

	public T get(int i) throws Exception {
		if (i<0 || i> currLen -1)
			throw new Exception("The element is not existed for index: " + i);
		return elem[i];
	}

	public void insert(int index, T x) throws Exception {
		if (currLen == elem.length)
			throw new Exception("The list is full");
		if(index<0 ||index>currLen)
			throw new Exception("Wrong insert location");
		for (int j= currLen; j>index; j--)
			elem[j] = elem[j-1];
		elem[index] = x;
		currLen++;
	}

	public void remove(int index) throws Exception {
		if (index<0 || index>currLen -1)
			throw new Exception("Wrong deletion order");
		for (int j=index; j<currLen ;j++)
			elem[j] = elem[j+1];
		
		currLen--;
		
	}

	public int indexOf(T x) {
		int index = 0;
		while (index<currLen && !elem[index].equals(x)){
			index++;
		}
		if (index<currLen)
			return index;
		else
			return -1;
	}

	public void display() {
		for (int index =0; index<currLen; index++) 
			System.out.print(elem[index] + " ");
		System.out.println();
		
	}
	
	public static void main(String[] arg) throws Exception{
		IList arrList = new MyArrayList<String>(10);
		arrList.insert(0, "hellow");
		arrList.insert(1, "world");
		arrList.insert(2, "james");
		arrList.insert(3, "hank");
		
		arrList.display();
		System.out.println("The index of james is: " + arrList.indexOf("james"));
		
		arrList.remove(0);
		arrList.display();
		
		arrList.insert(2, "second");
		arrList.display();
		
		
	}
}

 

 

自定义的Node类

package com.james.list;

public class Node<T> {
	private T data;
	private Node next;
	
	public Node(){
		this(null, null);
	}
	
	public Node(T data){
		this(data, null);
	}
	public Node(T data, Node next) {
		this.data = data;
		this.next = next;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}	

}

 

简单的LinkedList实现:

package com.james.list;

public class MyLinkedList<T> implements IList<T> {
	private Node head;	

	public MyLinkedList() {
		head = new Node();
	}


	public void clear() {
		head.setData(null);
		head.setNext(null);
		
	}


	public boolean isEmpty() {
		return head.getNext() == null;
	}


	public int length() {
		Node first = head.getNext();;
		int length = 0;
		while (first != null) {
			++length;
		}
		return length;
	}

	public T get(int index) throws Exception {
		Node curr = head.getNext();
		int i =0;
		while(curr.getNext()!=null && i<index){
			curr = curr.getNext();
			++i;
		}
		if(i>index || curr==null){
			throw new Exception("Get Wrong location from List");
		}
		
		return (T)curr.getData();
		
	}

	public void insert(int index, T x) throws Exception {
		Node curr = head;
		int j = -1;
		while(curr!=null && j<index-1){
			curr=curr.getNext();
			++j;
		}
		if(j>index-1 || curr == null){
			throw new Exception(" Wrong insert location");
		}
		Node s = new Node(x);
		s.setNext(curr.getNext());
		curr.setNext(s);
		
	}

	public void remove(int index) throws Exception {
		Node currNode = head;
		int i = -1;
		while(currNode.getNext()!=null && i < index-1){
			currNode=currNode.getNext();
			++i;
		}
		if(i> index-1 || currNode.getNext() == null){
			throw new Exception("Illegal deletion location");
		}
		currNode.setNext(currNode.getNext().getNext());
		
		
	}

	public int indexOf(T x) {
		Node currNode = head.getNext();
		int index = 0;
		while(currNode != null && !currNode.getData().equals(x)) {			
			currNode = currNode.getNext();
			++index;
		}
		if (currNode!=null)
			return index;
		else
			return -1;
	}

	public void display() {
		Node currNode = head.getNext();
		while(currNode!=null){
			System.out.println(currNode.getData()+ " ");
			currNode = currNode.getNext();
		}
		
	}
	public static void main(String[] arg) throws Exception{
		MyLinkedList ml = new MyLinkedList<String>();
		ml.insert(0, "jingshou1");
		ml.insert(1, "jingshou2");
		ml.insert(2, "jingshou3");
		ml.insert(3, "jingshou4");		
		ml.display();
		
		ml.remove(1);
		ml.display();
		
		System.out.println(ml.indexOf("jingshou4"));		
		
	}

}

 

两种线性表的比较:

  1. 顺序表查找快,但是插入效率低,需要移动元素
  2. 链接插入效率高,但是查找较慢
  3. 链表没有空间限制,顺序表有限制.可以实现自动扩容的顺序表,但是扩容后需要重新移动数据

 

分享到:
评论

相关推荐

    数据结构之线性表基础与实现c++

    在深入讨论标题“数据结构之线性表基础与实现c++”和描述“数据结构的线性表读书笔记,分别用代码实现了基于数组、malloc、链表、模板类的线性表”中涉及的知识点之前,需要先理解线性表在数据结构中的基本概念。...

    数据结构-加入泛型的线性表、栈、队列

    在编程领域,数据结构是构建高效算法的基础,而线性表、栈和队列是最基本且重要的数据结构。本文将详细探讨如何在Java或C#等支持泛型的语言中,为JWList和JWArray类加入泛型支持,以实现更加灵活和强大的功能。 ...

    数据结构与算法C#实现 线性表 BinaryTree

    例如,泛型允许我们创建适用于任何类型的数据结构,而委托和事件则可以用于实现数据结构中的回调和事件驱动编程。此外,C#的异步编程模型(async/await)在处理大规模数据结构时可提高程序的响应性和性能。 总结来...

    数据结构中线性表的应用,约瑟夫环算法 便于数据结构的学习.zip

    线性表作为最基础的数据结构之一,广泛应用于各种软件系统中。在本压缩包中,我们主要探讨的是线性表的应用以及一个有趣的算法——约瑟夫环算法。 线性表是由n(n≥0)个相同类型元素构成的有限序列,可以顺序存储...

    数据结构——线性表类模板

    线性表是计算机科学中一种基础且重要的数据结构,它是由n(n≥0)个相同类型元素构成的有限序列。在C++编程语言中,类模板被广泛用于实现抽象数据类型,它允许我们创建通用的数据结构,适用于多种数据类型。本主题将...

    数据结构线性表部分C++实现-包括一些习题代码

    总的来说,这个压缩包提供了一个学习和实践数据结构线性表的好机会。通过阅读和运行这些代码,你可以深入了解线性表的内部工作原理,以及如何在C++中有效地实现和操作它们。同时,解决习题将有助于提升你的编程技能...

    数据结构 栈的模板类线性表实现

    在这个主题中,“数据结构 栈的模板类线性表实现”指的是使用C++编程语言设计一个泛型模板类,用于实现栈的功能,基于线性表的概念。线性表是数据结构中最基础的一种,它是由n(n&gt;=0)个相同类型元素构成的有限序列...

    数据结构 C#实现 各种算法 线性表,树,单链表

    在.NET框架中,字符串和数组是非常基础且重要的数据类型,通过C#语言的高级特性(如泛型)可以更灵活地处理这些数据结构。 - **树型结构**:涵盖二叉树、平衡树等多种树型结构。重点介绍二叉搜索树的实现方法及其在...

    数据结构实验报告 线性表.doc

    实验的目的在于通过实际操作来掌握数据结构的研究方法,特别是线性表的实现和特性,以及算法设计和分析。同时,实验也要求学生熟悉如MyEclipse这样的集成开发环境中的程序运行和调试技巧。 实验的第一部分要求比较...

    数据结构殷人昆,线性表实验

    在这个“数据结构殷人昆,线性表实验”中,我们将探讨线性表的概念、特性,以及如何使用C++通过模板类来实现它。 线性表的特点在于它的顺序性,即每个元素都有一个前驱元素和后继元素,除了首元素没有前驱,尾元素...

    C# 线性表使用实例

    线性表是许多复杂数据结构(如栈、队列、图等)的基础,掌握它的实现和操作将有助于我们更好地理解和应用其他数据结构。在实际项目中,根据具体需求选择合适的数据结构和算法,能显著提高程序的性能和效率。因此,...

    线性表的合并(终结版)

    线性表是数据结构中的基本概念,它是由n(n≥0)个相同类型元素构成的有限序列。在这个“线性表的合并(终结版)”中,我们讨论的是如何合并两个或多个已排序的线性表。这个程序是用Microsoft Foundation Classes ...

    数据结构实验指导书(C++)- 线性表的操作.docx

    线性表是计算机科学中最基础的数据结构之一,它可以是顺序存储或链式存储。 实验的核心目标是通过实现不同的线性表操作来验证理论知识。实验分为六个部分,涵盖了顺序表、单链表、不带头结点的单链表、循环单链表、...

    基于c++语言模板实现的线性表

    这个基于C++模板实现的线性表实例对于初学者来说是一个很好的学习资源,它涵盖了C++的模板、链表和基本数据结构的操作,有助于理解和掌握这些概念。通过实践这个项目,你可以深入理解如何在实际编程中应用这些知识,...

    2.线性表.ppt

    线性表是一种基础且重要的数据结构,它是由n(n&gt;=0)个相同类型元素构成的有限序列。在计算机科学中,线性表是数据结构的一种抽象表示,它具有线性结构的特性,即表中的数据元素之间存在一对一的线性关系。这意味着...

    C++数据结构 清华大学版 清华大学版

    抽象数据类型(Abstract Data Type, ADT)是数据结构的核心概念之一,它是对数据类型的逻辑特性的描述,不涉及具体的实现细节。ADT允许我们将数据结构和操作封装起来,提高代码的模块化和可读性。面向对象编程...

    线性表子系统(C++版本以及C语言版本均有).rar

    在这个压缩包中,你可以学习到如何在实际编程中实现线性表,对比C++和C两种语言的不同实现方式,这有助于加深对这两种语言特性的理解,同时也有助于提升你在数据结构和算法方面的技能。无论是C++的面向对象特性还是...

    实验2内容要求-线性表的设计与实现1

    实验2的主要目标是深入理解和实践线性表这一重要的数据结构,同时强化对Visual Studio项目管理和C#编程技能的运用。在这个过程中,学生将通过创建和管理项目,实现不同类型的线性表,以及进行性能比较,来巩固理论...

    数据结构Demo.zip

    线性表是最基本的数据结构之一,由有限个相同类型元素构成的有序序列。在C#中,可以使用ArrayList或List类来实现线性表。ArrayList是非泛型的,而List是泛型的,更安全且效率更高。线性表支持添加、删除、查找等...

Global site tag (gtag.js) - Google Analytics