数据结构--Chapter2(线性表)

海思Hi3516CV610开发实战:在Ubuntu 22.04上从零构建嵌入式Linux开发环境 本文详细介绍了在Ubuntu 22.04上为海思Hi3516CV610开发板搭建嵌入式Linux开发环境的完整流程。从虚拟机配置、系统安装到基础环境设置,提供了实用技巧和常见问题解决方案,帮助开发者高效构建适用于智能视觉处理的开发环境。 阅读详情

2 线性表

    线性表是由n(n>=0)个具有相同数据类型的数据元素所构成的有限序列。当n=0时,此线性表是空表。

    线型表是一种线性结构,线性结构的特征:

    1)第一个数据元素没有前驱,这个数据元素也称为开始节点。

    2)最后一个数据元素没有后继,这个数据元素也称为终端节点。

    3)出第一个和最后一个数据元素之外,其他的数据元素有且仅有一个前驱和后继。

2.1 线性表的抽象数据类型描述

    线性表的抽象数据Java接口描述如下:

package adt;

/**
 * 线性表的抽象数据类型描述
 * 
 * @author Oner.wv
 *
 */
public interface IList {
	/**
	 * 将一个已经存在的表置为空表。
	 */
	public void clear();

	/**
	 * 判断线性表是否为空。
	 */
	public boolean isEmpty();

	/**
	 * 返回线性表中的数据元素个数。
	 */
	public int length();

	/**
	 * 读取并返回线性表中的第i个数据元素的值。0≤ i ≤length()-1。
	 * 
	 * @throws Exception
	 */
	public Object get(int i) throws Exception;

	/**
	 * 返回线性表中首次出现指定数据元素的为序号,若线性表中不包含此数据元素,则返回-1
	 */
	public int indexOf(Object x);

	/**
	 * 在线性表中第i个数据元素之前插入一个值为x的数据元素。0≤ i ≤length()。
	 * i=0时,在表头插入x;i=length()时,在表尾插入x。
	 * 
	 * @throws Exception
	 */

	public void insert(int i, Object x) throws Exception;

	/**
	 * 删除线性表中第i个数据元素。0≤ i ≤length()-1。
	 * 
	 * @throws Exception
	 */
	public void remove(int i) throws Exception;

	/**
	 * 输出线性表中各个数据元素。
	 */
	public void display();
}


2.2 线性表的顺序存储及其实现

2.2.1 线性表的顺序存储

    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。线性表的顺序存储示意图:


    采用顺序存储结构的线性表简称为“ 顺序表”。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:

    Loc(ai)=Loc(a0)+i*c   0<=i<=n-1。

    Loc(a0)代表a0的存储地址,c代表每个数据元素所占的存储单元。

2.2.2 顺序表类的实现

package sequenceList;

import adt.IList;

/**
 * 顺序表类的描述
 * 
 * @author Oner.wv
 *
 */
public class SqList implements IList {

	private Object[] listElem;
	private int curLen;

	public SqList(int maxSize) {
		curLen = 0;// 设置顺序表的当前长度为0
		listElem = new Object[maxSize];// 为顺序表分配maxSize个存储单元
	}

	@Override
	public void clear() {
		curLen = 0;
	}

	@Override
	public boolean isEmpty() {
		return curLen == 0;
	}

	@Override
	public int length() {
		return curLen;
	}

	@Override
	public Object get(int i) throws Exception {
		if (i < 0 || i > curLen - 1) {// 判断i是否合法
			throw new Exception("第" + i + "个元素不存在");
		}
		return listElem[i];// 返回顺序表中第i个数据元素
	}

	@Override
	public int indexOf(Object x) {
		int j = 0;// j指示顺序表中待比较的数据元素,其初始值指示顺序表中第0个数据元素
		while (j < curLen && !listElem[j].equals(x)) {// 依次比较
			j++;
		}
		if (j < curLen) {// 判断j的位置是否位于顺序表中的位置
			return j;
		} else {
			return -1;// 值为x的数据元素在顺序表中不存在
		}

	}

	@Override
	public void insert(int i, Object x) throws Exception {
		if (curLen == listElem.length) {// 判断顺序表是否已满
			throw new Exception("顺序表已满");
		}
		if (i < 0 || i > curLen) {// 判断i是否合法
			throw new Exception("插入位置不合法");
		}

		for (int j = curLen; j > i; j--) {
			listElem[j] = listElem[j - 1];// 插入位置及其之后的所有数据元素后移一位。
		}

		listElem[i] = x;// 插入x
		curLen++;// 表长加1
	}

	@Override
	public void remove(int i) throws Exception {
		if (i < 0 || i > curLen - 1) {// 判断i是否合法
			throw new Exception("删除位置不合法");
		}
		for (int j = i; j < curLen - 1; j++) {
			listElem[j] = listElem[j + 1];// 被删除元素之后的所有元素左移一个存储空间
		}
		curLen--;// 表长减1
	}

	@Override
	public void display() {
		for (int j = 0; j < curLen; j++) {
			System.out.print(listElem[j] + " ");
		}
		System.out.println();// 换行
	}

}

 

2.3 线性表的链式存储及其实现

2.3.1单链表的表示

    采用链式存储方式存储的线性表成为链表,链表中每一个节点包含存放数据元素值的数据域和存放逻辑上相邻结点的指针域。  若一个节点中只包含一个指针域,则称此链表为单链表(Single Linked List)。链表的节点结构如下:


线性表的单链表类的存储示意图:



2.3.2 节点类的实现

package linkedList;

/**
 * 节点类的描述
 * 
 * @author Oner.wv
 *
 */
public class Node {
	public Object data;// 存放节点值
	public Node next;// 后继结点的引用

	public Node() {
		this(null, null);
	}

	public Node(Object data) {
		this(data, null);
	}

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


2.3.3 单链表类的实现

1. 插入操作

    单链表上的插入操作的基本要求是在带头结点的单链表上的第i个节点之前插入一个数值域为x的新节点,其中i的限制条件是:0<=i<=n。要想实现插入操作,必须先确定第i个节点的前驱结点,即第i-1个节点的位置。假设p指针指向第i-1个节点,s指针指向新节点,则可画出一个插入操作的示意图:

实现思路:

1)查找到带插入位置的前驱结点

2)创建数据域值为x的新节点

3)修改相关节点的指针域从而使新节点插入到单链表中给定的位置上

实现代码:

	public void insert(int i, Object x) throws Exception {
		Node p = head.next;// 将p指向首节点
		int j = 0;
		while (p != null && j < i - 1) {// 寻找第i个节点的前驱,即第i-1个节点
			p = p.next;
			j++;
		}
		if (i < 0 || p == null) {
			throw new Exception("插入的位置不合法");
		}
		Node s = new Node(x);// 生成新节点
		s.next = p.next;// 将第i个节点的地址赋值给新生成节点的指针域
		p.next = s;// 将新节点的地址赋值给第i-1个节点的指针域
	}

2.删除操作

    单链表上删除操作的基本要求是删除带头结点的单链表上的第i个节点,i的限制条件是:0<=i<=n-1。所以,与插入操作相同,从单链表中删除一个节点也需要先查找到被删除节点的前驱节点,然后通过修改它的前驱结点的后继指针值来实现线性表中逻辑关系的改变。示例图如下:


实现思路:

1)查找到待删除节点的前驱结点

2)修改链指针,使待删除节点从单链表中脱离出来

实现代码:

	public void remove(int i) throws Exception {
		Node p = head.next;
		int j = 0;
		/**
		 * p.next!=null限定了p最多只能指向尾节点,即第n-1个节点 。j<i-1限定了p最多只能指向第i-1个节点,即第i个节点的前驱
		 */
		while (p.next != null && j < i - 1) {
			p = p.next;
			j++;
		}
		if (i < 0 || p.next == null) {
			throw new Exception("第" + i + "个元素不存在");
		}
		p.next = p.next.next;// 修改链指针,使待删除节点从单链表中脱离出来。
	}


全部代码实现:

package linkedList;

import java.util.Scanner;

import adt.IList;

/**
 * 单链表类的描述
 * 
 * @author Oner.wv
 *
 */
public class LinkList implements IList {

	private Node head;// 单链表的头指针

	public LinkList() {// 单链表的构造函数
		head = new Node();// 初始化头结点
	}

	public LinkList(int n, boolean order) throws Exception {
		this();// 初始化头结点
		if (order) {
			create1(n);// 用尾插法顺序建立单链表
		} else {
			create2(n);// 用头插法逆位序建立单链表
		}
	}

	public void create2(int n) throws Exception {
		Scanner sc = new Scanner(System.in);
		for (int j = 0; j < n; j++) {
			insert(0, sc.next());
		}
	}

	public void create1(int n) throws Exception {
		Scanner sc = new Scanner(System.in);
		for (int j = 0; j < n; j++) {
			insert(length(), sc.next());
		}
	}

	/**
	 * 将一个已经存在的带头结点单链表置为空表
	 */
	@Override
	public void clear() {
		head.data = null;// 设置头节点的数据域为null
		head.next = null;// 设置头结点的指针域为null
	}

	/**
	 * 判断带头结点的单链表是否为空
	 */
	@Override
	public boolean isEmpty() {
		return head.next == null;// 判断头结点的指针域是否为null
	}

	/**
	 * 求带头结点的单链表的长度
	 */
	@Override
	public int length() {
		Node p = head.next;// 将p指向首节点
		int length = 0;// length为计数器
		/**
		 * 这里来探究下p!=null的作用:假设n为链表的长度,则尾节点为第n-1个节点,用Node(n-1)表示。
		 * 当p==Node(n-1)时,length==n-1,这时根据while循环的条件来确定是否执行下次循环,
		 * 由于此时p!=null,满足while循环的条件,所以继续执行下次循环。 此时p==Node(n-1).next,length==n,
		 * 因为尾节点的指针域的值为null,不满足while循环的条件,所以结束while循环
		 * 所以p!=null限定了p所取的最大值为Node(n-1).next,即尾节点的指针域。
		 */
		while (p != null) {
			p = p.next;
			length++;
		}

		return length;
	}

	@Override
	public Object get(int i) throws Exception {
		Node p = head.next;// 将p指向首节点
		int j = 0;
		/**
		 * p.next!=null限定了p最多只能指向尾节点, j<i限定了p最多只能指向第i个节点
		 */
		while (p.next != null && j < i) {// 寻找第i个节点
			p = p.next;
			j++;
		}
		if (i < 0 || p.next == null) {// i小于0或者大于表长减1时,即i不合法
			throw new Exception("第" + i + "个元素不存在");
		} else {
			return p.data;// 返回p节点的数据域的值
		}
	}

	@Override
	public int indexOf(Object x) {
		Node p = head.next;// 将p指向首节点
		int j = 0;
		/**
		 * p!=null限定了p最多指向尾节点的指针域, !p.data.equals(x)限定了p的数据域的值不等于x
		 */
		while (p != null && !p.data.equals(x)) {// 寻找和x值相等的节点
			p = p.next;
			j++;
		}
		if (p == null) {// 如果p==null,说明值为x的节点不在单链表中,返回-1
			return -1;
		}
		return j;// 否则返回值为x的节点在单链表中的位置
	}

	@Override
	public void insert(int i, Object x) throws Exception {
		Node p = head.next;// 将p指向首节点
		int j = 0;
		while (p != null && j < i - 1) {// 寻找第i个节点的前驱,即第i-1个节点
			p = p.next;
			j++;
		}
		if (i < 0 || p == null) {
			throw new Exception("插入的位置不合法");
		}
		Node s = new Node(x);// 生成新节点
		s.next = p.next;// 将第i个节点的地址赋值给新生成节点的指针域
		p.next = s;// 将新节点的地址赋值给第i-1个节点的指针域
	}

	@Override
	public void remove(int i) throws Exception {
		Node p = head.next;
		int j = 0;
		/**
		 * p.next!=null限定了p最多只能指向尾节点,即第n-1个节点 。j<i-1限定了p最多只能指向第i-1个节点,即第i个节点的前驱
		 */
		while (p.next != null && j < i - 1) {
			p = p.next;
			j++;
		}
		if (i < 0 || p.next == null) {
			throw new Exception("第" + i + "个元素不存在");
		}
		p.next = p.next.next;// 修改链指针,使待删除节点从单链表中脱离出来。
	}

	/**
	 * 输出单链表中的所有节点
	 */
	@Override
	public void display() {
		Node p = head.next;
		while (p != null) {
			System.out.print(p.data + " ");// 输出节点的值
			p = p.next;// 取下一个节点
		}
		System.out.println();// 换行
	}
}


2.3.4 其他链表

1.循环链表

    循环链表(Circular List)也称为环形链表,其结构与单链表相似,只是将单链表的首尾相连,即将单链表的最后一个节点的后继指针指向第一个节点,从而构成一个环状链表,如图:


    循环链表的操作算法与单链表的操作算法基本一致,差别斤在于判断单链表中访问的手否是最后一个节点的条件不再是它的后继节点是否为空,而是它的后继节点是否为头结点。

2. 双向链表

    在单链表中的节点仅仅包含其后继节点的指针,所以要查找一个指定节点的后继节点,只要顺着它的后继指针即可一次找到,其时间复杂度为O(1)。但是若要查找一个指定节点的前驱结点,则要从单链表的表头开始顺着链一次进行查找,其时间复杂度为O(n),这是快速进行链表操作的一大障碍。为克服单链表的单向性的缺点,可对单链表进行重新定义,使其节点具有两个指针域,一个指针指向前驱节点,另一个指针指向后继节点。这种类型的链表称为双向链表。如图:


    双向链表节点类的实现:

package linkedList;

public class DulNode {
	public Object data;
	public DulNode prior;
	public DulNode next;

	public DulNode() {
		this(null);
	}

	public DulNode(Object data) {
		this.data = data;
		this.prior = null;
		this.next = null;
	}
}


    双向链表也与单链表一样,只要首尾相连即可构成双向循环链表。如图:


    双向链表中对于操作的实现若只涉及一个方向的指针,则它们的算法描述与单链表相应操作的算法一致,例如,length()、get(i)、和indexOf(x)等。但是对于插入和删除操作的算法要比单链表相应操作的算法更复杂一些,因为它涉及到两个指针域的修改。下图分别显示了在双向链表总插入和删除节点时指针修改的情况。



2.4 顺序表与链表的比较

    链表比较灵活,插入和删除操作的效率较高,但链表的空间利用率较低,适合于实现动态的线性表;顺序表实现比较简单,因为任何高级程序语言中都有数组类型,并且空间利用率较高,可高效地进行随机存取,但顺序表不易扩充,插入和删除操作的效率较低,适合于实现相对稳定的静态线性表。

2.5 练习

练习1 编写一个顺序表的成员函数,实现对顺序表就地逆置的操作。

	public void reverse(SqList s) {
		int start = 0;
		int end = s.curLen - 1;
		while (start < end) {
			Object temp = s.listElem[start];
			s.listElem[start] = s.listElem[end];
			s.listElem[end] = temp;
			start++;
			end--;
		}
	}


练习2 编写一个单链表的成员函数,实现对带头结点的单链表就地逆置的操作。

    思路:如果单链表为空或单链表中只有头结点,那么单链表不需要逆置,如果单链表中只有一个元素,逆置之后它的位置还是不会改变,所以可以不逆置。当单链表中有2个或两个以上的元素时,从第1个元素断开,令它的next为空,依次访问第2个元素到第n个元素,当访问到其中的任意一个元素时,将它插入到头结点之后,也就是把它插入到第1个位置,这样原始的第1个元素就会被后面的n-1个元素插入到它的前面,原始的第2个元素就会被后面的n-2个元素插入到它的前面,...直到原始的第n个元素插入到第1个位置。这样就实现了带头结点的单链表的就地逆置。

	public void reverse(LinkList L) {
		// 单链表为空或只有头节点或只有一个元素,不用进行操作
		if (L.head == null || L.head.next == null || L.head.next.next == null) {
			return;
		}
		Node p = L.head.next.next;// p指向a1节点
		L.head.next.next = null;// 令单链表中的a1节点的指针域为空,即断开a1节点和a2节点之间的链接
		while (p != null) {
			Node q = p.next;// q指向a2节点
			// 将p节点插入到头结点之后
			p.next = L.head.next;
			L.head.next = p;
			p = q;// 继续访问下一个元素
		}
	}



练习3 删除带头结点的单链表中的重复的节点

	public void removeRepeatElem(LinkList L) {
		Node p = L.head.next;// p指向首节点
		Node q = null;//
		while (p != null) {
			q = p.next;
			while (p != null) {
				if (p.data.equals(q.data)) {
					p.next = q.next;
				}
				q = q.next;
			}
			p = p.next;
		}
	}



练习4 删除不带头结点的单链表中的数值域等于x的第一个节点,删除成功,返回被删除的节点的位置,否则返回-1

	public int remove(LinkList L, Object x) {

		Node p = L.head;// p指向首节点
		Node q = null;// q记录p的前驱节点
		int j = 0;
		while (p != null && !p.data.equals(x)) {
			q = p;
			p = p.next;
			j++;
		}
		if (p != null) {
			if (q == null) {// 删除的是单链表中的首节点
				L.head = p.next;
			} else {// 删除的是单链表中的非首节点
				p.next = p.next.next;
			}
		} else {
			return -1;// 值为x的节点在单链表中不存在
		}
		return j;
	}


练习5 删除带头结点的单链表中的数据域等于x的所有节点,并返回删除节点的数目

	public int removeAll(LinkList L, Object x) {
		Node p = L.head.next;// p指向首节点
		Node q = L.head;// q用来记录p节点的前驱
		int j = 0;// j用来记录被删除节点的个数
		while (p != null) {
			if (p.data.equals(x)) {
				q.next = p.next;
				j++;
			} else {
				q = p;
			}
			p = p.next;
		}
		return j;
	}


Dify智能体开发:Dify文件上传 相较于聊天文本,文档文件能够承载大量的信息,例如学术报告、法律合同。受限于 LLM 自身仅能够支持文件或图片,难以获取文件内更加丰富的上下文信息,应用的使用者不得不手动复制粘贴大量信息与 LLM 对话,增加了许多不必要的使用成本。 阅读详情

相关推荐

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

【数据结构】线性表3——线性表的链式表示和实现(循环链表和双向链表)

【数据结构】线性表3——线性表的链式表示和实现(循环链表和双向链表)

FishC的博客 414

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1079

数据结构 双向链表及其基本操作

双向链表的一系列操作讲解及代码

Mi-ronin的博客 8061

脑电数据预处理十四:主成分分析(PCA)用于伪迹去除与降维

本文探讨了主成分分析(PCA)在脑电图(EEG)预处理中的双重应用。针对EEG数据的高维特性和伪迹干扰问题,PCA既可有效去除高振幅伪迹(如眼动、心电等),又能实现数据降维。文章详细解析了PCA的核心原理,包括正交基向量投影和方差最大保留机制,并提供了基于MNE-Python的完整实现方案。通过代码示例展示了PCA在伪迹去除和降维中的具体应用效果,包括功率谱密度和时域波形的可视化对比。虽然ICA在复杂伪迹处理上更具优势,但PCA以其算法简单、计算高效的特点,成为EEG分析流程中不可或缺的基础工具。

qq_32516809的博客 1417

Stata:手动安装ivreghdfe包的完整指南与常见问题解决

本文提供了Stata中手动安装ivreghdfe包的完整指南,包括准备工作、详细安装步骤及常见问题解决方案。ivreghdfe作为处理高维固定效应模型的强大工具,依赖ftools、reghdfe和ivreg2三个核心组件,手动安装可避免版本冲突问题。文章还分享了进阶使用技巧,如并行计算加速和保存固定效应估计值,助力用户高效完成工具变量回归分析。

weixin_29251131的博客 927

博客作业2---线性表

一、PTA实验作业(5分) 本周要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求: 6-3 jmu-ds- 顺序表删除重复元素 void CreateSqList(List &L,int a[],int n){//创建顺序表 L=new SqList; L->length=-1; int i=0; for(i=0;i<n;i...

weixin_34007906的博客 222

RT-DETR改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1153

第二章、线性表

第二章、线性表 2.1、线性表的定义和基本操作 知识总览 线性表的定义:具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n = 0时线 性表是一个空表。 注意: ​ aia_iai​是线性表中的“第i个”元素线性表中的位序,位序从1开始 数组下标从0开始 ​ a1a_1a1​是表头元素;ana_nan​是表尾元素。 ​ 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继 线性表的基本操作: InitList(&L):初始化表。

dq_zhanghaifang的博客 231

高斯过程的数学理解

G澳大利亚的过程是有益的,特别是当我们有少量数据时。当我在制造业担任数据科学家时,我们的团队使用这种算法来揭示我们接下来应该进行哪些实验条件。但是,此算法不如其他算法流行。在这篇博客中,我将通过可视化和 Python 实现来解释高斯过程 [1] 的数学背景。

gongdiwudu的专栏 3606

Vue - 解决 Property or method “__v_isRef“ is not defined on the instance but referenced(浏览器控制台报错,代码没错)

vue,vue2控制台报错,vue报错Propertyormethod"__v_isRef"isnotdefinedontheinstancebutreferenced,vue代码没问题,但是报错Propertyormethod"__v_isRef"isnotdefinedontheinstancebutreferenced,vue2如何解决报错,vue怎么解决报错问题,vue2Propertyormethod"__v_isRef"isnotdefi

🏆 前端领域优质创作者 4501

数据结构之线性表(七)——双向链表

为什么要用双向链表? 因为单链表中的结点有指示后继结点的指针域,找后继结点方便。即,查找某结点后继结点的复杂度为O(1)O(1)O(1)。 但是在单链表中,没有指示前驱结点的指针域,找前驱结点难,要从表头出发查找。即,查找某结点前驱结点的复杂度为O(n)O(n)O(n)。 而双向链表可以克服这种缺点。 双向链表的定义与特点 1.定义 双向链表:在单链表中的每个结点里在增加一个指向其前驱结点的指...

daocaoren_的博客 564

逆强化学习:从专家示范中学习策略

逆强化学习(Inverse Reinforcement Learning,简称IRL)是强化学习(Reinforcement Learning,简称RL)的一个子领域,它的目标是从专家的行为中学习策略。在传统的强化学习中,智能体通过与环境交互,根据奖励信号来学习一个策略。而在逆强化学习中,我们没有直接的奖励信号,而是通过观察专家的行为来推断出奖励函数,从而学习到一个与专家类似的策略。逆强化学习作为强化学习的一个重要子领域,在许多实际应用场景中都取得了显著的成功。

AI天才研究院 1448

数据结构与算法 Chapter 2 线性表

2.1 线性表定义 线性表是由长度为n的一组节点组成的有限序列,其中除了首末结点之外,每个结点都有直接的前驱结点和后继结点。 2.2 线性表的顺序存储结构 顺序存储结构使用一组连续的存储单元来存储线性表。 其特点有:线性表的逻辑顺序与物理顺序一致、数据元素之间的关系采用物理位置的相邻来表示。其可以随机存取,常用一维数组表示: #include <iostream> using...

dianzili1007的博客 367

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【数据结构错题集】Chapter2 线性表

1.单链表删除指针 free(s)和free(p->next)是两个不同的指针,只是指向同一个地方。使用free(p->next)需要注意的是后续的链表是否都释放了,没有就会造成内存泄露,都释放了,也要将p->next置为空。 2.线性表&数组 插入删除 3. 4.线性表插入元素 5.头结点 带头结点带头结点带头结点 6.增加结点问题 题目读顺! (一张网图) 7. 8.存储方式选择(标号一样但是是两道题) 9.双向循环链表插入元素 10.双向循环链表删除元素 11.静态链表 12.

Crumble 1505

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

『 数据结构笔记』chapter2.1 线性表

数据结构——2.1 线性表及其实现1 线性表1.1 什么是线性表?1.2 线性表的抽象数据类型描述2 线性表的顺序存储2.1 线性表的顺序存储的实现2.2 主要操作的实现2.2.1 初始化(建立空的顺序表)2.2.2 查找2.2.3 插入2.2.4 删除3 线性表的链式存储3.1 线性表的链式存储实现3.2 主要操作的实现3.2.1 求表长3.2.2 查找3.2.2.1 按序号查找:FindKth3.2.2.2 按值查找:Find3.2.3 插入(在第i-1(1<=i<=n+1)个结点后插入一

lanruo_csdn的博客 272

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

《数据结构》-Chapter2-线性表

顺序表 插入平均移动结点次数:n/2 删除平均移动结点次数:n-1/2 查找平均移动结点次数:n+1/2 链表: 头插法: LinkList HeadInsertList(LinkList L, int data) //头插法建立链表 { LinkList s = new LinkList(); s.data = data; s.next = L.nex...

AlphaCat的博客 682

《数据结构与算法》Chapter 2 线性表——顺序存储的c语言实现

直接上代码!(没有写main函数,主要是各个基本操作的实现) #include <stdio.h> #include <stdlib.h> #include <math.h> #define OVERFLOW _OVERFLOW #define OK 1 #define True 1 #define False -1 #define LIST_INIT_SIZE 100 //线性表储存空间的初始分配量 #define LISTINCREMENT 10 //线性

siriuszcc的博客 213

【王道数据结构】【chapter2线性表】【P44t14】

设将n(n>1)个整数存放到不带头结点的单链表L中,设计算法将L中保存的序列循环右移k(0

芊樱烛渊的博客 459

【王道数据结构】【chapter2线性表】【P43t13】

设有一头指针为L的带有表头结点的非循环双向链表,其每个结点中除有prior(前驱指针),data(数据)和next(后继指针)域外,还有一个访问频度域freq。每当在链表中进行一次Locate(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度非增(递减)的顺序排列,同时最近访问的结点排在频度相同的结点的最后,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的Locate(L,x)运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型。

芊樱烛渊的博客 473

【王道数据结构】【chapter2线性表】【P44t16】

设有一个长度为n(n为偶数)的不带头结点的单链表且结点值都大于0,设计算法求这个单链表的最大的孪生和。孪生和的定义为一个结点值与其孪生结点值的和,对于第i个结点(从0开始),其孪生结点为第n-i-1个结点。

芊樱烛渊的博客 726

【王道数据结构】【chapter2线性表】【P43t15】

单链表有环,是指单链表的最后一个节点的指针指向了链表中的某个结点(通常单链表的最后一个节点的指针域是空的)。试编写算法判断单链表是否存在环。

芊樱烛渊的博客 499

【王道数据结构】【chapter2线性表】【P19t10~t14】【统考真题】

【代码】【王道数据结构】【chapter2线性表】【P19t10~t14】

芊樱烛渊的博客 740

【王道数据结构】【chapter2线性表】【P44t17~t20】【统考真题】

【代码】【王道数据结构】【chapter2线性表】【P44t17~t20】【统考真题】

芊樱烛渊的博客 795

Chapter 2 线性表

顺序表的优点:操作简单,存储的密度大;。根据内存寻址的原理,可以通过随机存取方式在 O(1)的时间内取值。顺序表的缺点:需要预分配内存,无论是动态分配和静态分配,都有可能出现空间浪费或者溢出的问题。并且插入删除,都需要移动大量的元素。“一般等号左边为指针域,等号右边为节点的地址”。“要先修改没有指针标记的那一端,防止节点丢失”“链表的物理地址不连续,只能顺序存取”“链表的头指针作为链表的唯一标识符一定不能随意移动!!!

benbenxueba的博客 915

【数据结构】—— chapter 02 线性表

文章目录2.1 线性表的定义与基本操作2.1.1 线性表的定义2.1.2 线性表的基本操作2.1.3 小结2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表上基本操作的实现2.3 线性表的链式表示2.3.1 单链表的定义2.3.2 单链表上基本操作的实现2.3.3 双链表2.3.4 循环链表2.3.5 静态链表2.3.6 顺序表和链表的比较 2.1 线性表的定义与基本操作 2.1.1 线性表的定义 线性表是具有相同数据类型的n (n≥0) 个数据元素的有限序列,其中n为表长,当n=0时线性

S_123789的博客 737
上一篇: 数据结构--Chapter1(绪论)
下一篇: 数据结构--Chapte3(栈和队列)
Wang_AI
博客等级 码龄12年 988粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值