`

大话数据结构二:线性表的链式存储结构(单链表)

 
阅读更多

1. 线性表的链式存储结构:指的是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着这些数据元素可以存在内存未被占用的任意位置。


2. 结点:结点由存放数据元素的数据域和存放后继结点地址的指针域组成。

1.)顺序存储结构中,每个数据元素只需要存数据元素的信息就可以了。

2.)链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址。

3.)链表中第一个结点叫头结点,它的存储位置叫做头指针,它的数据域可以不存储任何信息,链表的最后一个结点指针为空。


3. Java实现单链表:

// 单向链表
public class SingleLinkedList<E> {
	private Node<E> head; // 头结点
	private int size; // 链表长度

	// 建立一个空链表
	public SingleLinkedList() {
		head = null;
		size = 0;
	}
	
	// 在链表尾部插入
	public boolean add(E data){
		Node<E> newNode = new Node<E>(data);
		if(isEmpty()){
			head = newNode;
		}else{
			Node<E> tail = get(size);
			tail.setNext(newNode);
		}
		size++;
		return true;
	}

	// 插入指定位置的结点
	public boolean insert(int position, E data) {
		if(position >= 1 && (position <= size + 1)){
			Node<E> newNode = new Node<E>(data);
			if(isEmpty() || position == 1){ // 链表为空或在头结点前插入
				newNode.setNext(head);
				head = newNode;
			}else{ // 在中间位置插入
				Node<E> preNode = get(position - 1); // 获取position的前一结点
				Node<E> originalNode = preNode.getNext(); // 获取未插入结点时position位置对应结点 
				preNode.setNext(newNode);
				newNode.setNext(originalNode);
			}
			size++;
			return true;
		}
		return false;
	}

	// 删除指定位置的结点
	public E delete(int position) { 
		E result = null;
		if(position >= 1 && position <= size){
			if(position == 1){ // 删除头结点
				result = head.getData();
				Node<E> afterHead = head.getNext();
				head = afterHead;
			}else{ // 删除其他结点
				Node<E> preNode = get(position - 1); // 获取待删除结点的前一结点
				Node<E> curNode = preNode.getNext(); // 获取待删除结点
				result = curNode.getData();
				preNode.setNext(curNode.getNext()); // 将待删除结点前一结点指向待删除结点下一结点
			}
			size--;
		}
		return result;
	}
	
	// 获取某个位置的结点
	public Node<E> get(int position){
		Node<E> targetNode = null;
		if(!isEmpty() && position >= 1 && position <= size){ 
			targetNode = head;
			for(int i = 1; i < position ; i++){
				targetNode = targetNode.getNext(); // 循环获取对应位置的结点
			}
		}
		return targetNode;
	}
	
	// 获取链表的长度
	public int getSize(){
		return size;
	}
	
	// 判断链表是否为空
	public boolean isEmpty(){
		return size == 0;
	}
	
	// 打印链表数据
	public void display(){
		Node<E> node = head;
		System.out.print("单链表: ");
		for(int i = 0; i < size; i++){
			System.out.print(" " + node.getData());
			node = node.getNext();
		}
		System.out.println("");
	}
}
// 结点类,包含结点的数据和指向下一个节点的引用
public class Node<E> {
	private E data;  // 数据域
	private Node<E> next;  // 指针域保存着下一节点的引用

	public Node() {
	}

	public Node(E data) {
		this.data = data;
	}
	
	public Node(E data,Node<E> next) {
		this.data = data;
		this.next = next;
	}

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

	public Node<E> getNext() {
		return next;
	}

	public E getData() {
		return data;
	}

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

	@Override
	public String toString() {
		return "" + data;
	}
}
// 测试类
public class Main {
	public static void main(String[] args) {
		SingleLinkedList<Integer> circular = new SingleLinkedList<Integer>();
		circular.add(1);
		circular.add(2);
		circular.add(3);
		circular.insert(4,4);
		circular.insert(5,5);
		circular.insert(6,6);
		circular.delete(3);
		circular.delete(5);
		circular.display();
		System.out.println("链表的长度为:  " + circular.getSize());
	}
}
4. 单链表结构和顺序存储结构优缺点:

1.)若线性表需要频繁查找,很少进行插入和删除操作,宜采用顺序存储结构,若需要频繁插入和删除时,宜采用单链表结构。

2.)当线性表的元素个数变化较大或者根本就不知道多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。单链表所占大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成。

分享到:
评论

相关推荐

    数据结构实验报告2线性表的链式存储结构.pdf

    数据结构实验报告2线性表的链式存储结构 本实验报告的主要内容是介绍线性表的链式存储结构,并通过编程实验来掌握线性表的逻辑结构和链式存储结构,以及单链表的基本算法。 一、线性表的概念 线性表是最基本的...

    数据结构与算法:线性表的题库

    数据结构与算法:线性表的题库 线性表是一种基本的数据结构,它是由零个或多个数据元素组成的有序集合。线性表的存储结构可以分为顺序存储结构和链式存储结构两种。顺序存储结构是将所有元素存储在一块连续的存储...

    实验一:线性表的存储结构定义及基本操作.doc

    本实验的目的是让学生掌握线性表的顺序存储结构和链式存储结构的定义及基本操作,熟练掌握顺序表和链表的基本运算,理解循环链表和双链表的特点和基本运算,加深对顺序存储数据结构和链式存储数据结构的理解,并逐步...

    哈工大数据结构实验一_一元多项式计算器

    实验项目:线性表的链式存储结构与应用 实验题目:一元多项式计算器 实验内容: 设计线性表的动态或者静态链式存储结构,并实现一个一元多项式的计算器。 实验要求: 以动态或者静态链表存储一元多项式,在此基础上...

    数据结构:线性表顺序存储

    线性表是计算机科学中一种基础且重要的数据结构,它由有限个相同类型的数据元素构成一个有序序列。在描述线性表时,我们通常强调以下四个特性:存在唯一的第一个元素和最后一个元素,以及除了两端元素外,每个元素都...

    数据结构中线性表的链式存储

    ### 数据结构中线性表的链式存储及合并排序实现 #### 一、线性表的概念与链式存储介绍 线性表是数据结构中最基本的一种逻辑结构,它由n(n≥0)个数据元素组成的一个有限序列。线性表中的每个数据元素,除了第一个...

    关于线性表的顺序存储和链式存储结构的实验报告

    线性表是数据结构中的一个基本概念,它是一种在计算机内存中能够按照线性方式存储数据元素的结构。线性表的元素之间存在一对一的线性关系。在数据结构实验报告中,线性表的存储结构被分为两大类:顺序存储结构和链式...

    数据结构实验报告2线性表的链式存储结构.doc

    在实际应用中,链式存储结构常用于实现各种复杂数据结构,如图和树。在处理不确定数据量或频繁进行插入、删除操作的场景下,链式存储通常比顺序存储更优。实验报告的编写有助于巩固理论知识,提高实践能力,同时培养...

    数据结构:线性表(链接存储).ppt

    数据结构:线性表(链接存储) 一、线性表的链接存储 线性表的链接存储是一种存储方式,它可以克服顺序存储的缺点。顺序存储需要一块连续的存储空间,但是当顺序表很大时,系统可能无法分配这么大的一块连续存储...

    数据结构_线性表的链式存储

    线性表是计算机科学中一种基础的数据结构,它是由相同类型元素构成的有限序列。在本实验中,我们将深入理解并实践线性表的链式存储结构,这是一种非顺序存储方式,与数组不同,它通过指针链接元素,使得元素在内存中...

    数据结构: 线性表讲解实例

    数据结构: 线性表讲解实例。针对线性表的深入讲解。

    《数据结构C++版》实验一:线性表的顺序存储结构实验报告

    《数据结构C++版》实验一的目的是让学生深入理解线性表的顺序存储结构,并熟练掌握C++程序设计的基本技巧。在这个实验中,学生需要通过类的定义来实现线性表,数据对象的类型可以自定义。以下是实验涉及的主要知识点...

    数据结构教学课件:线性表链表.ppt

    数据结构教学课件:线性表链表.ppt

    数据结构实验一线性表的基本操作.docx

    数据结构实验一线性表的基本操作 一、线性表的概念和类型 线性表是一种基本的数据结构,它是一种由零个或多个元素组成的有限序列,每个元素都是数据类型的实例。线性表可以分为两种类型:顺序存储结构和链式存储...

    数据结构:线性表(顺序存储).ppt

    数据结构:线性表(顺序存储) 线性表是具有相同属性的数据元素的一个有限序列。线性表中的各元素都具有同种数据类型,表的长度可用 n(n&gt;=0)表示,表中所含元素个数即为线性表的长度。特殊情况 n=0,且线性表的...

    数据结构:线性表、链表、队列、栈、串

    本主题将深入探讨线性表、链表、队列、栈这四种基本的数据结构,并以C++语言为例,通过相关源代码(stringData.cpp、seqList.cpp、node.cpp、seqQueue.cpp、linkQueue.cpp、linkStack.cpp、seqStack.cpp)来解析其...

    数据结构之线性表的链式存储结构

    数据结构线性表的链式存储结构,使用c语言完成。线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。

    数据结构作业:第2章-线性表作业题目.docx

    "数据结构作业:第2章-线性表作业题目.docx" 在这份作业中,我们可以总结出以下几个重要的知识点: 1. 线性表的存储方式:线性表可以采用顺序存储和链式存储两种方式。顺序存储方式是指将所有元素存储在一片连续的...

    验证2:线性表子系统实验报告.doc

    链表是一种动态分配存储的数据结构,每个元素是一个独立的对象,并且每个对象都包含一个指向下一个元素的指针。 2. 线性表的特点 线性表有以下特点: * 顺序存储:线性表的元素可以顺序存储在连续的存储单元中。 ...

    数据结构教学课件:线性表顺序表.ppt

    数据结构教学课件:线性表顺序表.ppt

Global site tag (gtag.js) - Google Analytics