复杂的链式存储结构 循环链表 定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环) 优点:从表中任一节点出发均可找到表中其他结点 注意:涉及遍历操作时,终止条件是判断 p->next == L? 双向链表 定义:在单链表的每个结点离再增加一个指向直接前驱的指针域 prior,这样链表中就形成了有 两个方向不用的链,故称为双向链表 双向循环链表 定义: 和单链的循环表类似,双向链表也可以有循环表 ·让头节点的前驱指针指向链表的最后一个结点 ·让最后一个结点的后继指…
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高进先出 (largest-in,first-out)的行为特征. 例如下图:任务的优先权及执行顺序的关系                  优先队列是0个或多个元素的集合,每个元素都有一个优先权或值 时间复杂度         Push时进行排序                 有序链表(即顺序…
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift语言是面向对象语言,所以在相关示例实现的时候与之前在大学学数据结构时C语言的实现有些出入,不过数据结构还是要注重思想,至于实现语言是面向对象的还是面向过程的影响不大. 接触过数据结构的小伙伴应该都知道程序 = 数据结构 + 算法.数据结构乃组织组织数据的结构,算法就是对这些结构中的数据进行操作,可见…
前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char name[30];//姓名 char sex; //性别 int class;//班级 int age;//年龄 } student={"01",“zhangsan”,"m","201","20"}: 链式存储:初始化 //建立一个空链…
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在插入.删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理.但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空间开销较大. 下图就是最简单最一般的单向链表:…
//线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { DataType List [MaxSize]; int Size;}Slist;//初始化顺序表void ListInit(Slist * S){S->Size=0; }//插入数据int ListInsert(Slist *S ,int i,DataType x){        int j;     …
一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }List; 0.完整代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 50 #define TRUE 1 #define FALSE 0 typedef int ElemType ; struct List { ElemTyp…
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). 条件处理 循环队列中,由于入队时尾指针向前追赶头指针:出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等.因此,无法通过条件front==rear来判别队列是"空"还是"满".     解决这个问题的方法至少有三种:                 ① 另设一…
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这种数据结构中,最先插入的元素将是最先被删除的元素:反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表. 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限…
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈是只能在某一端插入和删除的特殊线性表.用桶堆积物品,先堆进来的压在底下,随后一件一件往堆.取走时,只能从上面一件一件取.堆和取都在顶部进行,底部一般是不动的.栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底.插入一般称为进栈,删除则称为退栈. 栈也称为后进先出表. 基本概…
有了单向链表的基础,双向链表的实现就容易多了. 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现: package com.liuhao.algorithm;      public class DuLinkList<T> {          /**       * 内部类:链表中的一个节点       *        * @author liuhao data 节点中的数据 prev 指向前一个节点的引用 next 指向下一个节点的引用       */       …
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指针成员变量指列表中的下一个结点: 列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客. 本节笔记到这里就结束…
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储结构的弱点,在做插入或删除操作时,需移动大量元素. 而链式存储结构,由于它不需要逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点,但同时也失去了顺序表可随机存取的优点. 线性链表 wiki中的定义: 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不…
线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio.h> #define LIST_INIT_SIZE 100 #define ERROR 0 #define OK 1 typedef struct{ // 线性表的顺序存储结构 int numbers[LIST_INIT_SIZE]; int length; }Sqlist; int ListInser…
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制. 链式存储结构中,结点由存放数据元素的数据域和存放后继结点地址的指针域组成. 具体代码如下: #include<iostream> #define OK 1 #define ERROR 0 #define TRUE 1 #define ERROR 0 t…
C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素都有一个明确的指针指向线性表的下一个元素的位置(即地址). 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.在顺序结构中,每个数据元素只需要存数据元素信息就行了,而在链式结构中,除了存储数据元素信息外,还要存储它的后继元素的存储地址.…
本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所示.   1.栈的顺序存储结构 用数组存放数据,top变量来指示栈顶元素在数组中的位置(栈顶指针).一个长度为5的栈的示意图如下: 实现程序: /** * 栈的顺序储存结构 * * 问题:构造器中,泛型数组创建是否有更好的方法? * @author Yongh * */ public class SqStac…
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #define OK 1 #define ERROR 0 typedef int QElemType; typedef int Status; class QNode{ public: QNode():data(0),next(NULL) {} QElemType data; QNode *next; }; class…
顺序存储结构 主要优点 节省存储空间,随机存取表中元素 缺    点 插入和删除操作需要移动元素 在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现.由此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言(例如c/c++)的数组来描述的. 顺序存储结构的主要优点是节省存储空间,因为分配给数据的存…
如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #include<iostream> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int SElemType; typedef int Status; class StackNode{ public: Stac…
链表(链式存储结构)及创建 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的. 例如,使用链表存储 {1,2,3},数据的物理存储状态如下图所示: 我们看到,上图 根本无法体现出各数据之间的逻辑关系.对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素.如下图所示: 像上图这样,数据元素随机存储,并通过指针表示数据之间逻辑关系的存…
顺序表示和链式表示的比较: 1.读写方式:顺序表可以顺序存取,也可以随机存取:链表只能从表头顺序存取元素: 2.逻辑结构与物理结构:顺序存储时,逻辑上相邻的元素其对应的物理存储位置也相邻:链式存储时,逻辑上相邻的元素,其物理存储位置则不一定相邻: 3.查找.插入和删除操作: 按值查找,当线性表在无序的情况下,两者的时间复杂度均为o(n):而当顺序表有序时,可采用折半查找,此时时间复杂度为o(log n): 按位查找,顺序表支持随机访问,时间复杂度为o(1):而链表的平均时间复杂度为o(n). 顺…
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k-1个节点(k>=1). 3.对任何一棵二叉树T,如果其终结点数为n0,度为2的节点数为n2,则n0=n2+1. 4.具有n个节点的完全二叉树的深度为log2n+1. 5.对于一棵有n个节点的完全二叉树的节点按层序编号,若完全二叉树中的某节点编号为i,则若有左孩子编号为2i,若有右孩子编号为2i+1,母亲…
结点: 包括一个数据元素及若干个指向其它子树的分支:例如,A,B,C,D等. 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点. 在C语言中,链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据:二为下一个结点的地址,即指针域和数据域. 数据结构中的每一个数据结点对应于一个储存单元,这种储存单元称为储存结点,也可简称结点 树结点(树节点): 树节点相关术语: 节点的度:一个节点含有的子树的个数称为该节点的度…
存档----------- #include <iostream.h> typedef char ElemType; #include "LinkList.h" void main() { LinkList h; ElemType e; ; ; cout<<"(1)初始化单链表h\n"; InitList(h); cout<<"(2)单链表为"<<(ListEmpty(h)?"空"…
package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList<Integer> singlyLinkList; /** * 默认构造函数.用于初始化栈 */ public LinkListStack(){ singlyLinkList=new SinglyLinkList<Integer>(); } /* * 压栈操作 */ public void…
这里用的是冒泡排序 #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct Book{ double no; char name[MAX]; double price; struct Book * next; }Book,*BList; void CreatList(BList &B) { B = (BList)malloc(sizeof(Book)); B->next = NULL; B…
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct Book{ double no; char name[MAX]; double price; struct Book * next; }Book,*BList; //创建列表 void CreatList(BList &B) { //头插法创建单链表 B = (BList)malloc(sizeof(Book)); B->next =…
这道题可以用头插法创建列表,然后正常输出: #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct Book{ double no; char name[MAX]; double price; struct Book * next; }Book,*BList; //头插法创建链表 void CreatList(BList &B) { B = (BList)malloc(sizeof(Book))…