`
wojiaolongyinong
  • 浏览: 74737 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

自定义链表的实现

    博客分类:
  • Java
 
阅读更多

       一说得到链表,我们就会在脑中自然而然的弹出ADT这个概念,既就是所有的数据结构书上说的那样,抽象数据类型(Abstract Data Type),听起来好像很高深,其实只不过就是那些在我们前面的人根据那些东西的用法给那个起了个抽象的名字。现在我们就看看这个称为链表的东东。

        链表这种数据结构呢,就像是用绳子穿起一串珠子,这个珠子就是链表中的称为“节点”的东东,而那个绳子呢,就是把这些珠子穿起来的东西,在链表中就是指向下一个节点的引用。就这样,第一个的节点里面存第二个节点的引用,第二个节点里面存第三个的,。。。。。就这样下去了,很形象的说就是这个样子。但是说简单也简单,说不简单也不简单,因为这里面不是穿珠子,我们还要会“玩珠子”,我们可以把在里面取一个珠子,用暴力的方法,把绳子拽断,取一个珠子,然后再把绳子接起来。。。。。等等还有其他操作。但是大神们请记住,我这里的珠子就是链表中的节点。。。。。。

        然后呢,下面就是本菜鸟的大作了,先是使用接口规范链表中要实现的方法,包括上面说的“拽珠子”,以及还有别的方法的玩这些“珠子”。。。。。。。我还是给大家代码示例吧,说多了就成语文是体育老师教的了。。。

 

一:

用来规范的接口

/**
 * 编写泛类型接口,来规范实现链表中方法
 * @author LONG
 *
 */
public interface ADT<T> {
	
	/**
	 * Task:在链表中添加新的元素,默认在链表的末尾添加
	 * @param newEntry 用来添加的新元素
	 * @return 如果成功则返回true,否则返回false
	 */
	public boolean add(T newEntry);
	
	/**
	 * Task:在链表中的指定位置添加新的元素
	 * @param newEntry 用来添加的新的元素
	 * @param position	指定添加的位置,在链表中的第position个
	 * @return	返回是否成功,如果成功,则返回true,否则返回false
	 */
	public boolean add(T newEntry,int position);
	
	/**
	 * Task:删除指定位置的元素,并且返回该元素
	 * @param position	传入的指定位置
	 * @return	返回删除的元素
	 */
	public T remove(int position);
	
	/**
	 * Task:在链表中查找给定的数据,并给用户说明给数据在链表中存储的位置,如果没有找到也告诉用户
	 * @param data	需要查找的元素
	 * @return	返回查找信息
	 */
	public String select(T data);
	
	
	
	/**
	 * Task:将链表中对象的数据全部显示出来
	 */
	public void display();
	
	/**
	 * Task:将链表清空
	 */
	public void clear();
	
}

 

 

二:

用来实现接口的类

 

/**
 * 用来实现链表的接口,同样定义为泛型
 * @author LONG
 *
 * @param <T> 用来声明该类为泛型类,由用户来定义该类存储对象类型
 */
public class TrueLink<T> implements ADT<T>{

	private Node<T> head = null;									//定义头节点,用来记录该链表的头部
	private Node<T> end = null;										//用来指向链表的尾部
	private int length = 0;											//用来记录链表的长度
	
	/**
	 * 实现的第一个add方法,只传入节点数据
	 */
	public boolean add(T newEntry) {
		boolean isSuccessful = true;								//将初始返回值设为true
		Node<T> current = new Node<T>(newEntry);					//创建新的节点保存数据
		if(head != null){											//用来判断头结点是否为空,如果为空创建头结点
			end.setAdd(current);
			end = end.getNode();
		}else{
			head = current;
			end = head;
		}
		length++;													//链表长度自增1
		return isSuccessful;
	}

	/**
	 * 实现的第二个add方法,同时传入数据和要添加的位置position
	 */
	public boolean add(T newEntry, int position) {	
		boolean isSuccessful = true;
		
		if(length >= position){										//用来判断链表长度与指定位置的关系,使得指定位置必须满足在链表长度之内
			Node<T> temp = head;									//定义临时Node类型变量,作为中间变量
			for(int i = 1; i < position - 1; i++){					//循环得到要添加位置的前一个节点
				temp = temp.getNode();
			}
			Node<T> newNode = new Node<T>(newEntry,temp.getNode());	//创建节点,将数据newEntry传进去,同时也把下一个节点的地址传进去
			temp.setAdd(newNode);									//将前一个的元素的地址变量指向新的元素
			length++;												//链表长度自增1
		}else{	
			isSuccessful = false;
		}
		return isSuccessful;
	}

	
	public T remove(int position) {									//移除指定位置的元素
		if(position <= length){										//首先判断指定位置是否符合链表的现有长度
			Node<T> temp = head;									//定义临时Node类型变量,作为中间变量
			for(int i = 1; i < position - 1; i++){					//使用循环找到要删除位置的前一个元素
				temp = temp.getNode();
			}
			Node<T> current = temp.getNode().getNode();				//将要删除处后面元素的地址保存起来
			T values = (T) temp.getNode().getData();				//将要删除处的元素的数据保存起来,用来返回
			temp.setAdd(current);									//将要删除处的前一个元素的地址变量直接指向刚才保存起来的地址
			length--;												//链表长度减少一个
			return values;											//返回要删除处的元素的数据
		}else{
			return null;
		}
	}

	
	public void display() {
		if(head != null){ 											//判断链表非空
			Node<T> temp = head;								    //定义临时Node类型的变量,作为中间变量
			for(int i = 0; i < length; i++){						//使用循环将链表遍历,将元素的值打印出来
				System.out.println("链表中的数据如下"+temp.getData());
				temp = temp.getNode();
			}
		}else{
			System.out.println("链表并未创建");
		}
		
	}

	/**
	 * 实现查找功能
	 */
	public String select(T data) {
		Node<T> temp = head;									    //声明了一个临时的Node类型的变量,作为中间变量
		String message = null;										//定义要返回的字符串
		for(int i = 0; i < length - 1; i++){						//通过循环遍历整个链表,一旦找到则会退出循环
			if(data.equals(temp.getData())){						//判断元素的值是否相同
				message = "找到了查找数据"+data+",该数据位于链表中的第"+(i + 1)+"位";
				break;
			}
			temp = temp.getNode();
		}
		return message;
	}

	/**
	 * 用来将链表清空
	 */
	public void clear() {
		length = 0;
		head = null;
		end = null;
	}

}

 

 

三:

定义的节点类,。。。。传说中的“珠子”

 

	/**
	 * Task:用来返回该节点中封装的地址
	 * @return	返回下一个节点的地址
	 */
	public Node<T> getNode(){
		return address;
	}
	
	/**
	 * Task:用来改变节点的数据
	 * @param data	传进去的数据
	 * @return	返回成功true
	 */
	public boolean setData(T data){
		this.data = data;
		return true;
	}
	
	/**
	 * Task:用来设置节点的指向地址
	 * @param address	传入新的地址
	 * @return	返回成功true
	 */
	public boolean setAdd(Node<T> address){
		this.address = address;
		return true;
	}
}

 

至此,链表中基本会用到的,老衲已经阐述得差不多了。。。。。。各位施主大牛求评论呀!!!!!

吾不能默默无闻呀。。。。。。哈哈

分享到:
评论

相关推荐

    delphi自定义链表实例.rar

    总结来说,Delphi中的自定义链表实现涉及定义节点类型、链表类及其方法,以及处理插入、删除、查找和遍历等操作。通过理解这些概念,开发者可以更好地掌握数据结构和算法,从而编写出更高效、更灵活的代码。在实践中...

    delphi自定义链表实例

    在编程领域,自定义链表是一种常见的数据结构,它允许程序员根据特定需求设计和实现自己的链式存储结构。本文将详细讲解如何在Delphi环境中创建一个自定义链表实例,以及其背后的原理和操作。 首先,理解链表的基本...

    Java实现的自定义链表

    在 Java 中,实现一个自定义的链表(如单链表或双链表)是一个非常好的练习。下面是一个单链表的完 整实现,包括基本的操作如插入、删除、查找和遍历。

    学生信息管理系统 完成学生信息管理系统的设计与实现,数据存储使用自定义链表,实现赠、删、查、改的功能

    完成学生信息管理系统的设计与实现,数据存储使用自定义链表,实现赠、删、查、改的功能。执行界面如下: 系统界面: *********************学生基本信息管理系统********************* ****1、添加 2、查询 ****...

    链表

    本篇将深入探讨单向动态链表的建立、修改及其核心操作,旨在帮助读者理解和掌握链表的基本原理和实现方法。 ### 单向链表的建立 单向链表,也称为单链表,其特点是每个节点只包含一个指向下一个节点的指针。在代码...

    链表常用模版

    其中 `link` 类用于表示链表中的单个节点,而 `LList` 类则是基于 `std::list` 的自定义链表实现。 ##### 2.1 `link` 类分析 `link` 类定义了链表的基本单元——节点。每个节点包含一个数据成员 `element` 和一个...

    用MFC做的链表程序

    同时,为了将链表与界面紧密结合,可能还需要自定义控件,如列表视图控件,动态更新显示链表中的内容。这需要覆盖控件的重绘方法,或者利用MFC的消息映射机制来更新视图。 通过上述步骤,我们已经构建了一个基本的...

    用数据结构-链表实现通讯录管理系统

    本项目以"用数据结构-链表实现通讯录管理系统"为主题,通过C语言实现了这一功能,旨在帮助用户管理他们的联系人信息。下面我们将深入探讨这个系统所涉及的主要知识点。 首先,我们来了解**链表**这一数据结构。链表...

    大整数的运算

    3. **自定义链表实现**:这里特别提到不使用STL的`list`,这表明实现者选择手动创建一个链表类以控制每个细节。这样做的好处是可以针对大整数运算的特性进行优化,比如快速比较、插入和删除等操作。同时,自定义链表...

    C#泛型实现单向链表实现

    在实际项目中,使用这样的自定义链表结构可以更好地控制内存分配和数据访问,特别是在处理大量数据时,相比数组和List等线性数据结构,链表在插入和删除操作上的性能更优。不过,链表的缺点是随机访问效率较低,因为...

    QTreeView+自定义Model实现示例

    自定义`QAbstractItemModel`主要是为了实现数据的高效存储和检索,以及定制化的数据操作。以下是一些关键步骤和知识点: 1. **继承自定义Model**:首先,你需要创建一个类继承自`QAbstractItemModel`。这个类将实现...

    Go-LinkedList一个简单的双链表实现

    本文将深入探讨Go语言中的双链表实现,以标题"Go-LinkedList一个简单的双链表实现"为例,我们将分析双链表的设计、操作以及其在实际应用中的价值。 双链表是一种线性数据结构,每个节点包含两个指针,分别指向前后...

    list-and-struct.rar_list stru

    通过以上介绍,我们可以理解如何在C++中使用结构体和自定义链表实现各种操作。实际编程中,这些基础知识对于理解和构建复杂数据结构至关重要。在`list and struct`这个项目中,你将有机会亲手实践这些概念,加深对...

    java基础知识代码实现,包括冒泡算法,快速算法,九九乘法表,创建多线程的方式,自定义链表,递归使用方式,创建单例等。javaBasicGrammar.zip

    自定义链表(Custom LinkedList)则是对数据结构的学习,链表不同于数组,它在内存中不是连续存储的。Java提供了LinkedList类,但编写自己的链表可以帮助你更好地理解链表的工作原理,包括节点的添加、删除和遍历。 ...

    Java用链表实现的计算器程序.rar_JAVA计算器链表_计算器链表

    然而,为了构建一个计算器,我们可能需要自定义链表结构,以便更好地适应计算逻辑。 这个"Java用链表实现的计算器程序"很可能是设计为一个解析表达式并进行计算的系统。链表在这里的角色可能是用来表示数学表达式的...

    C++链表类代码(自己写的)

    本文将详细解析一个自编的C++链表类代码,该类利用模板实现,提供了添加、删除、修改和查找等基本操作。 首先,我们来看“MyList.h”这个头文件,它很可能包含了链表类的定义。在C++中,链表通常通过节点(Node)...

    数据结构 栈 链表实现 c++ 模板

    总结来说,这个项目涵盖了数据结构中的栈,通过链表实现并使用C++模板技术,提供了代码的通用性和高效性。同时,驱动程序`StackDrive.cpp`提供了对栈操作的测试,确保了实现的正确性。对于学习和理解C++模板以及数据...

    C++实现链表,节点类的自定义实现。

    本主题聚焦于如何自定义实现链表及其节点类,这对于深化理解和掌握C++的面向对象编程至关重要。在描述中提到,该资源是在Linux环境下运行,并提供了Makefile文件,方便用户进行编译。 链表的基本组成部分是节点,每...

    用双向链表做的n的阶乘

    由于是用链表实现,我们可以在每个节点中存储一个乘积,从1开始,每次迭代都将当前值乘以n并减少n,直到n减到1为止。每个新的乘积会成为链表中的新节点。这样,链表的长度就等于阶乘的阶数,最后一个节点的值就是n的...

    链表实现的查询功能

    让我们深入探讨链表的概念,以及如何通过链表实现查询、插入和删除操作。 首先,链表与数组不同,它不是一块连续的内存空间。每个元素(节点)包含两部分:数据和指向下一个元素的引用(或称为指针)。这种结构允许...

Global site tag (gtag.js) - Google Analytics