顺序表

【Python数据结构与算法笔记day17】3.1. 单向链表

左心房为你撑大大i 提交于 2020-02-02 04:56:00
文章目录 3.1. 单向链表 单向链表 节点实现 单链表的操作 单链表的实现 链表与顺序表的对比 3.1. 单向链表 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。 表元素域elem用来存放具体的数据。 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。 节点实现 class SingleNode(object): """单链表的结点""" def __init__(self,item): # _item存放数据元素 self.item = item # _next是下一个节点的标识 self.next = None 单链表的操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 insert(pos, item) 指定位置添加元素 remove(item) 删除节点 search(item) 查找节点是否存在 单链表的实现 class SingleLinkList(object): """单链表""" def __init__(self

线性表可用顺序表或链表存储的优缺点

﹥>﹥吖頭↗ 提交于 2020-02-02 04:22:46
顺序存储 表示是将数据元素存放于一个连续的存储空间中,实现顺序存取或(按下标)直接存取。它的 存储效率高,存取速度快 。但它的空间大小一经定义,在程序整个运行期间不会发生改变,因此, 不易扩充 。同时,由于 在插入或删除时, 为保持原有次序( 没有规定元素进栈顺序 ), 平均需要移动一半(或近一半)元素 , 修改效率不高 。 链接存储 表示的存储空间一般在程序的运行过程中动态分配和释放,且只要存储器中还有空间,就不会产生存储溢出的问题。同时在插入和删除时 不需要保持数据元素原来的 物理顺序 ,只需要保持原来的 逻辑顺序 ,因此不必移动数据,只需修改它们的链接指针, 修改效率较高 。但存取表中的数据元素时,只能循链顺序访问,因此 存取效率不高。   1 顺序表和链表的 时间性能 比较 所谓时间性能是指实现基于这种存储结构的基本运算(即算法)的时间复杂度。 像取出线性表中第 i 个元素这样的 按位置随机访问的操作 ,使用顺序表更快一些;取前趋和后继结点的操作在顺序表中可以很容易调整当前的位置向前或向后,因此这两种操作的时间为 O (1) ;相比之下,单链表不能直接访问上述的元素,按位置访问只能从表头开始,直到找到那个特定的位置,所需要的平均时间为 O ( n ) 。 给出指向链表中某个合适位置的指针后, 插入和删除操作 所需的时间仅为 O ( 1 )

线性表应用

旧街凉风 提交于 2020-01-30 09:32:44
合并有序顺序表 将两个有序(非递减)顺序表La和Lb合并为一个新的有序(非递减)顺序表。 void MergeSqlist(SqList La, SqList Lb, SqList &Lc){ int i,j,k; i=j=k=0; Lc.length=La.length+Lb.length; Lc.elem=new int[Lc.length]; while(i<La.length&&j<Lb.length){ if(La.elem[i]>Lb.elem[j]){ Lc.elem[k++]=Lb.elem[j++]; }else{ Lc.elem[k++]=La.elem[i++]; } } while(i<La.length)Lc.elem[k++]=La.elem[i++]; while(j<Lb.length)Lc.elem[k++]=Lb.elem[j++]; } 合并有序链表 将两个有序(非递减)单链表La和Lb合并为一个新的有序(非递减)单链表。 解题思路: 链表合并不需要再创建空间,只需要“穿针引线”,把两个单链表中的节点按非递减的顺序串联起来即可。 注意:单链表的头指针不可以移动,一旦头指针丢失,就找不到该单链表了,因此需要辅助指针。 1)初始化。设置3个辅助指针p,q,r,其中p,q分别指向La和Lb链表的当前比较位置,新链表头指针Lc指向La

线性表及其操作

我是研究僧i 提交于 2020-01-30 02:30:29
1. 线性表的定义 线性表是具有 相同数据类型 的n(n≥0)个数据元素的 有限序列 。其中n为表长,当n=0时,该表为空表。 逻辑结构:L = (a1,a2,…,ai,…,an) 2. 线性表的顺序表示 线性表的顺序存储又称顺序表。它是用一组 地址连续 的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。 3. 顺序表上的基本操作的实现 (1) 插入操作(前插) 在顺序表L的第i(1≤i≤L.length+1)个位置插入新的元素e。 代码: # include <stdio.h> # define MaxSize 50 // 定义线性表的最大长度 typedef struct { int data [ MaxSize ] ; // 顺序表的元素 int length = 0 ; // 顺序表的当前长度 } SqList ; // 函数声明 bool ListInsert ( SqList & L , int i , int e ) ; void PrintList ( SqList L ) ; int main ( void ) { SqList L ; int i ; for ( i = 1 ; i <= 10 ; i ++ ) { if ( ! ListInsert ( L , i , i ) ) { // 注意这里传的是L,不是&L

6-2 顺序表操作集

混江龙づ霸主 提交于 2020-01-30 02:02:27
本题要求实现顺序表的操作集。 函数接口定义: List MakeEmpty ( ) ; Position Find ( List L , ElementType X ) ; bool Insert ( List L , ElementType X , Position P ) ; bool Delete ( List L , Position P ) ; 其中List结构定义如下: typedef int Position ; typedef struct LNode * List ; struct LNode { ElementType Data [ MAXSIZE ] ; Position Last ; /* 保存线性表中最后一个元素的位置 */ } ; 各个操作函数的定义为: List MakeEmpty ( ) :创建并返回一个空的线性表; Position Find ( List L , ElementType X ) :返回线性表中X的位置。若找不到则返回ERROR; bool Insert ( List L , ElementType X , Position P ) :将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false; bool Delete (

线性表--顺序表--静态链表(八)

痴心易碎 提交于 2020-01-28 23:53:30
写在前面: 大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书。 很感谢能有这样一个平台让我能够在这里分享所学所感。 我喜欢编程,喜欢代码,喜欢去做一个程序员。 努力学习,争取多年后,给亲人更好的生活。 QQ/WX:2506897252 欢迎交流。 文章目录 1.介绍 2.备用链表 3.图示工作流程 4.代码实现 (1)初始化空闲链表 (2)分配结点 (3)存储数据 (4)遍历数据 (5)收回结点 5.程序演示 6.运行结果 1.介绍 前面的链表都是使用指针类型实现的,并且都是由系统提供的函数malloc和free动态实现,被称之为动态链表,像C,C++,java是拥有“指针”这类数据类型的,不需要使用静态链表,而对于BASIC,FORTRAN之类的高级语言中,并没有提供“指针”这类数据类型,若要继续采用链表作为数据的存储结构,只能采用数组来模拟实现链表,所以下面的知识是针对没有“指针”类型的高级语言而用数组设计的拥有链表存储结构的静态链表。一起往下看。 图1是空闲数组,使用静态链表存储数据时,虽然和顺序表一样,数据都被存储在数组中,但是存储位置是随机的,并使用游标找到找到下一个存储的数据,游标为0代表着链表到头,如图2所示。 2.备用链表 只有一条数据链表是不行的,这样没有考虑对已释放空间的回收,只拿出来用,却不记谁在用,这样在经过多次插入和删除后

第02次作业-线性表

℡╲_俬逩灬. 提交于 2020-01-27 22:17:20
一实验题目 1.题目1:6-3 jmu-ds- 顺序表删除重复元素 设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。 输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。 输出格式:数据之间空格隔开,最后一项尾部不带空格。 输出删除重复元素后的顺序表。 你需要实现的函数有下面三个: 函数接口定义: void CreateSqList(List &L,int a[],int n); //创建顺序表 void DispSqList(List L);//输出顺序表 void DelSameNode(List &L) ;//删除顺序表重复元素 L :顺序表 a :输入数组 n :输入数据个数 2.设计思路 1.在 void CreateSqList(List &L,int a[],int n)中,先建立一个顺序表,再定义一个i表示顺序表元素的下标。   for i=0 to i<n      L->data[i]=a[i];   end for  这样就建立好了一个顺序表。 2.在 void DispSqList(List L)中,定义一个i表示顺序表元素的下标。   先判断L->lenght==0,是的话直接返回。   for i=0 to i<L->length-1     输出L->data[i]   end for 3在 void

线性表

喜夏-厌秋 提交于 2020-01-27 12:09:20
线性表 线性表是由n(n>=0)个相同类型的数据元素组成的有限序列,它是最基本、最常用的一种线性结构。顾名思义,线性表就像是一条线,不会分叉。 线性表有唯一的开始和结束,除了第一个元素外,每个元素都有唯一的直接前驱:除了最后一个元素外,每个元素都有唯一的直接后继 ,如图所示。 ​ 线性表有两种存储方式:顺序存储和链式存储。采用顺序存储的线性表称为顺序表,采用链式存储的线性表称为链表。链表又分为单链表、双向链表和循环链表。 顺序表 顺序表采用顺序存储方式,即 逻辑上相邻的数据在计算机内的存储位置也是相邻的 。 顺序存储方式,元素存储是连续的,中间不允许有空,可以快速定位第几个元素,但是插入和删除时需要移动大量元素。 根据分配空间方法不同,顺序表可以分为静态分配和动态分配两种方法。 静态分配 顺序表最简单的方法是使用一个定长数组data[]存储数据,最大空间为Maxsize,用length记录实际的元素个数,即顺序表的长度。这种 用定长数组存储的方法称为静态分配 。静态顺序表如图所示。 顺序表的静态分配结构体定义,如图所示。采用静态分配方法,定长数组需要预先分配一段固定大小的连续空间,但是在运算的过程中,如合并、插入等操作,容易超过预分配的空间长度,出现溢出。 解决静态分配的溢出问题,可以采用动态分配的方法 。 动态分配 在程序运行过程中,根据需要动态分配一段连续的空间

第02次作业-线性表

笑着哭i 提交于 2020-01-27 05:10:59
第一题:6-3 jmu-ds- 顺序表删除重复元素 1、题目: 设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。 输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。 输出格式:数据之间空格隔开,最后一项尾部不带空格。 输出删除重复元素后的顺序表。 你需要实现的函数有下面三个: 函数接口定义: void CreateSqList(List &L,int a[],int n); //创建顺序表 void DispSqList(List L);//输出顺序表 void DelSameNode(List &L) ;//删除顺序表重复元素 L :顺序表 a :输入数组 n :输入数据个数 2、代码截图: 3、设计思路: 主要功能函数DelSameNode 定义变量 i , j ,k分别在循环是用做记录,来控制循环结束。 for i=0 to L->length-1 i++{ for k=i+1 to L->length k++{ if(L->data[i]==L->data[k])//如果data i 跟data k 相等 for j=k to L->length j++ L->data[j]=L->data[j+1]即为 此项被删除后面的每一位元素都向前移了一位 4、PTA提交列表说明: 第二题: jmu-ds-链表倒数第m个数(20 分

顺序表和链表的优点和缺点

北慕城南 提交于 2020-01-26 22:30:35
顺序表: 优点:空间连续,支持随机访问,查找元素的时间复杂度为O(1) 缺点:1.插入或者删除元素的时间复杂度为O(n) 2.扩容的代价比较大 链表: 优点:1.空间不连续 2.插入或者删除的时间复杂度为O(1) 3.扩容容易 缺点:1.不支持随机访问 2.查找元素的时间复杂度为O(n) 来源: CSDN 作者: 丶独醒 链接: https://blog.csdn.net/m1059247324/article/details/104089400