大话数据结构(六)——链式存储

线性表链式存储结构定义

线性表的链式存储结构的特点:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。

为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身信息以外,还需要存储一个指示其直接后继的信息。

我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或者链。这两部分信息组成数据元素ai的存储映像,称为结点(node)。

n个结点(ai的存储映像),称为结点(Node)。

n个结点(ai的存储映像)链结成一个链表,即线性表(a1,a2,a3,……an)的链式存储结构,因为此链表的每个结点只包含一个指针域,所以叫单链表。

链表中第一个结点的存储位置叫做头指针。

头指针与头结点的异同

头指针

头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。

头指针具有标识作用,所以常用头指针冠以链表的名字。

无论链表是否为空,头指针均不为空,头指针是链表的必要元素。

头结点

头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义。

有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的统一了。

头结点不一定是链表必须要素。

用java语言描述链式存储结构

class Node {//用对象描述存储结构

    Object data; //数据域
     Node next;//指针域

    public Node(Object data2) {
        this.data = data2;
    }
}

单链表的读取

算法思路:

1、声明一个指针p指向链表的第一个结点,初始化j从1开始

2、当j<i时,就遍历链表,让p指针向后移动一位,不断地指向下一个结点,j++;

3、若到链表末尾p为空,则说明第i个结点不存在

4、否则查找成功,返回结点p的数据

 public Node index(int index){
	  if(index==0){
		  //头一个结点下标为0
		  current=head;

		  return current;
		  //删除后链表为空
	  }else{
		  current=head;
		  for(int i=0;i<index-1;i++){
			  current=current.next;
			  //因为current.next赋值给了current,所以要设置为index-1
		  }

	  }
	  return current;
  }

  单链表的插入

算法思路:

1、声明一个指针p指向链表的第一个结点,初始化j从1开始

2、当j<i时,就遍历链表,让p指针向后移动一位,不断地指向下一个结点,j++;

3、若到链表末尾p为空,则说明第i个结点不存在

4、否则查找成功,在系统中生成一个空节点s

5、将数据元素e赋值给s->data

6、单链表的插入标准语句,s->next = p->next,p->next=s;

7、返回成功

//方法:向链表中添加数据
    public void add(Object data) {
        //判断链表为空的时候
        if (head == null) {//如果头结点为空,说明这个链表还没有创建,那就把新的结点赋给头结点
            head = new Node(data);
            current = head;
            number++;
        } else {
            //创建新的结点,放在当前节点的后面(把新的结点和链表进行关联)
            current.next = new Node(data);
            //把链表的当前索引向后移动一位
            current = current.next;
            //此步操作完成之后,current结点指向新添加的那个结点
        number++;
        }
    }

单链表的删除

算法思路:

1、声明一个指针p指向链表的第一个结点,初始化j从1开始

2、当j<i时,就遍历链表,让p指针向后移动一位,不断地指向下一个结点,j++;

3、若到链表末尾p为空,则说明第i个结点不存在

4、否则,查找成功,将欲删除的结点p->next赋给q

5、单链表的删除标准语句p->next=q->next

6、将q结点中的数据赋给e,作为返回

7、释放q结点

8、返回成功

public void delete(int data){
	  index(data);
	  if(data==0){
		 head=current.next;
	  }else{
		  current.next=current.next.next;
		  number--;
		  }

  }
  //需要一个定位的方法 用于删除方法 当输入索引后先找到索引结点的前一个结点,把前一个结点的next指向后一个的后一个
  //也可以用双指针,时间复杂度降低
  public Node index(int index){
	  if(index==0){
		  //头一个结点下标为0
		  current=head;

		  return current;
		  //删除后链表为空
	  }else{
		  current=head;
		  for(int i=0;i<index-1;i++){
			  current=current.next;
			  //因为current.next赋值给了current,所以要设置为index-1
		  }

	  }
	  return current;
  }

  

时间: 2024-12-29 03:18:15

大话数据结构(六)——链式存储的相关文章

【数据结构】链式存储单链表

数据结构之单链表的链式存储实现 //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename: List.c // description: a demo to display SeqList // // created by SCOTT at 01/28/2015

数据结构第六篇——顺序存储结构与链式存储结构的特点

?注:未经博主同意,不得转载. 两者特点: 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 它的优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开销. (3)顺序表具有按元素序号随机访问的特点. 缺点: (1)在顺序表中做插入.删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低. (2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢

数据结构之线性表-链式存储之静态链表(二)

本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述>.<大话数据结构> 1.1 静态链表简介 用数组描述的链表叫静态链表.官方是这么给的定义.另一种描述方法叫游标实现法.先不管这些无聊的定义.先按我个人理解描述,再来个Java版的实现比较符合我的风格.另有一些树上说早期存在其他的高级语言没有对象,引用或者指针这样的东西,但是需要对于快插快删等批量操作的这种链式存储,这时候静态链表就起了

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链

数据结构:二叉树的链式存储

数据结构:二叉树的链式存储(C语言版) 1.写在前面 二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点. 二叉树的性质: 1.二叉树的第i层上至多有2i-1个节点 2.深度为K的二叉树至多有2k-1个节点 3.任何一个二叉树中度数为2的节点的个数必度数为0的节点数目少1. 说明:度数为0,为叶子节点. 4.具有n个节点的完全二叉树的深度为|_Log2N_|+1 5.若完全二叉树中的某节点编号为i,则若有左孩子编号为2i

3-7-队列的链式存储-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 队列的链式存储 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h        相关测试数据下载  链接? 无数据    

2-5-归并链式存储的单链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第2章  线性表 - 归并单链表(链式存储) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SinglyLinkedList.c        相关测试数据下载

数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现,编译模板类问题解决

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现 C++ 顺序存储模板类的实现[面试重要] C++ 链式存储模板类的实现[面试重要] C++ 链式存储模板类,载入指针 c++ 栈的链式存储实现(模板类嵌套模板类),编译问题教训[重要] C++ 顺序存储模板类的实现[面试重要] 项目文件: [email protected]://990487026.blog.51cto.com~/c++$ tree .

数据结构之线性表-链式存储之单链表(一)

本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述 1.1 单链表简介 线性表的最大的缺点就是插入和删除操作需要移动大量的元素,这是它在内存中的连续存储结构造成的.为了弥补这2个缺点,就出现了链表,即线性表的链式存储. 链表是由一系列的几点组成,这些节点不必在内存中相连.这就意味着元素可以存在内存未被占用的任意位置.如图 这个存储可以想象成元素在内存中成三维空间存储,他们之间可没有像数组那样的下标标