顺序表

python笔记-算法及数据结构2

陌路散爱 提交于 2019-11-28 16:01:16
1 变量类型不同,占的存储空间大小是不同的 2 顺序表 顺序存放,形式像表,称为顺序表 3 顺序表的形式 3.1 基本形式 数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素存储的物理地址可以通过存储区的起始地址加上逻辑地址与存储单元大小的乘积计算而得,即: Loc(e j )=Loc(e 0 )+c*j 3.2 数据外置形式 如果元素大小不统一,则需采用元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息。 4 顺序表的结构 顺序表由两部分组成,表头信息和数据信息,其中表头信息描述了表的容量以及已经使用的量。 4.1 一体式顺序表 存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。 特点:整体性强,易于管理 缺点:顺序表创建后,元素存储区就固定 4.2 分离式顺序表 表对象里只保存于整个表有关的信息(容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过链接于基本表对象关联。 4.3 元素存储区替换 一体式结构更换数据只能整体搬迁,整个顺序表对象都改变。 分离式结构更换数据区,只需将表信息区中的数据区链接地址更新即可,顺序表对象不变。 4.4 动态顺序表 采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,可以在不改变表对象的前提下对其数据存储区进行扩充

顺序表和链表的区别及其优缺点

拥有回忆 提交于 2019-11-28 15:30:00
1.顺序表存储(典型的数组)   原理:顺序表存储是将数据元素放到一块连续的内存存储空间,相邻数据元素的存放地址也相邻(逻辑与物理统一)。   优点:     (1)空间利用率高。(局部性原理,连续存放,命中率高)     (2)存取速度高效,通过下标来直接存储。 缺点:    (1)插入和删除比较慢,比如:插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序。 (2)不可以增长长度,有空间限制,当需要存取的元素个数可能多于顺序表的元素个数时,会出现"溢出"问题.当元素个数远少于预先分配的空间时,空间浪费巨大。 时间性能 :查找 O(1) ,插入和删除O(n)。 2.链表存储 原理:链表存储是在程序运行过程中动态的分配空间,只要存储器还有空间,就不会发生存储溢出问题,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点关系间的指针。 优点:      (1)存取某个元素速度慢。 (2)插入和删除速度快,保留原有的物理顺序,比如:插入或者删除一个元素时,只需要改变指针指向即可。 (3)没有空间限制,存储元素的个数无上限,基本只与内存空间大小有关. 缺点:     (1)占用额外的空间以存储指针(浪费空间,不连续存放,malloc开辟,空间碎片多) (2)查找速度慢,因为查找时,需要循环链表访问,需要从开始节点一个一个节点去查找元素访问。

数据结构-线性表

前提是你 提交于 2019-11-28 12:14:02
将线性表分为几个模块来学习: 1.单链表头插法建表 2.单链表尾插法建表 3.归并 4.划分 5.逆置 6.顺序表建表 7.顺序表删除 8.顺序表添加 9.最值问题 10.真题演练 ----------------------------------------------------------------------------------------------- 1.单链表头插法建表: 1 /单链表头插法建表 2 3 /* 4 #inlclude<iostream> 5 using namespace std ; 6 7 void createLinkListH (Node *&head) 8 { 9 head = (*LNode)malloc(sizeof(LNode)); 10 head->next = NULL ; 11 Node *p = NULL; 12 int n ; 13 cin >> n ; 14 for(int i = 0 ; i < N ; i++ ) 15 { 16 p = (*LNode)malloc(sizeof(LNode)); 17 p->next = NULL ; 18 cin >> p->data ; 19 p->next = head->next; 20 head->next = p ; 21 return 1 ; 22 } 23 }

6-2 顺序表操作集 (20 分)

僤鯓⒐⒋嵵緔 提交于 2019-11-28 10:06:42
本题要求实现顺序表的操作集。 函数接口定义: 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( List L, Position P ):将位置P的元素删除并返回true

字符串的顺序表

前提是你 提交于 2019-11-28 05:15:23
#include<iostream> using namespace std; typedef struct{ char data[100]; int length; } SqString; //串赋值 void assign(SqString &s,char a[]){ int i=0; while(a[i]!='\0'){ s.data[i]=a[i]; i++; } s.length=i; } //串复制 void strcpy(SqString &s,SqString t){ for(int i=0;i<t.length;i++){ s.data[i]=t.data[i]; } s.length=t.length; } //求串长 int getLength(SqString s){ return s.length; } //判断串相等 int isEquel(SqString s,SqString t){ if(s.length!=t.length){ return 0; }else{ for(int i=0;i<s.length;i++){ if(s.data[i]!=t.data[i]){ return 0; } } return 1; } } //串连接 SqString concat(SqString s,SqString t){ SqString rst;

ArrayList与LinkedList常用操作

我怕爱的太早我们不能终老 提交于 2019-11-28 01:16:54
本文主要内容: 1.ArrayList的常用操作 2.随机数的简单介绍 3.Java自定义相等性的比较 4.迭代器简单介绍 5.Iterable与foreach的关系 6.LinkedList的常用操作 7.instanceOf简单说明 8.ArrayList练习(洗牌) 9.LinkedList常用操作练习 1.ArrayList常用操作: (1)构造方法 ArrayList(); 构造空的顺序表,容量为默认容量 ArrayList(int capacity); 构造空的顺序表,容量为capacity ArrayList(Collection c); 构造一个顺序表,把c中所有的元素放到顺序表中 List<Integer> origin = Arrays.asList(1,2,3,4,5); ArrayList<Integer> list = new Arraylist<>(origin); (2)常用方法: add(E element): 尾插数据 add(int index,E element) :把元素插到index位置 remove(Object o): 删除顺序表中第一个o remove(int index): 删除顺序表中下标为index的位置 contains(E e): 判断e是否在顺序表中 indexOf(E e): 返回出现e的第一次下标

python-day20

流过昼夜 提交于 2019-11-27 21:53:04
一、算法 1、概念 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。 算法是独立存在的一种解决问题的方法和思想。 2、算法的五大特性 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性:算法中的每一步都有确定的含义,不会出现二义性 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 3、算法的复杂度:   1、衡量标准:     算法在计算机执行中所消耗的时间     算法在执行中所占用的资源的大小,如:内存空间的占用大小     算法的易理解性,易实现性   2、算法在计算机执行中消耗的时间     跟时间有关的因素:     数据输入的时间     算法编译成可执行程序的时间     计算机执行每条指令的时间     算法语句重复执行的次数 4、时间复杂度的几条基本计算规则 基本操作,即只有常数项,认为其时间复杂度为O(1) 顺序结构,时间复杂度按加法进行计算 循环结构,时间复杂度按乘法进行计算 分支结构,时间复杂度取最大值 判断一个算法的效率时,往往只需要关注操作数量的最高次项

数据结构之顺序表(一)

為{幸葍}努か 提交于 2019-11-27 20:47:49
  顺序表和数组的操作特别相近,我在学习数据结构的时候采用的是郝斌老师推荐的书籍《数据结构算法实现与分析》,这本书是由西安交大高义凡教授 编写的,是一本特别好的教材,该教材实现了严蔚敏版的《数据结构》中的所有伪代码。我在随笔中用的大部分是高义凡老师的代码,因为我经常忘记一些 知识点,所以想把这些优秀的代码,添加进随笔里面,方便我日后进行学习。现在国家在版权方面控制的特别严,希望高老师看见后,理解一下,我也会注 名这些程序的引用。   顺序表头文件: 1 #pragma once 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<iostream> 5 #include<string> 6 #include<malloc.h> 7 #include<io.h> 8 #include<math.h> 9 10 #define TRUE 1 11 #define FALSE 0 12 #define OK 1 13 #define ERROR 0 14 15 typedef int ElemType; 16 typedef int Boolean; 17 typedef int Status; 18 19 using namespace std; 20 21 #define LIST_INIT_SIZE 10 //

【SDUT】3324顺序表应用4元素位置互换之逆置算法

浪子不回头ぞ 提交于 2019-11-27 18:37:34
不得不说我今天心情特别差劲。为啥呢? 同样的思想,用java和python写,母校OJ一直报TLE,我还以为是我算法有问题,研究了半天研究的我脖子疼,还浪费了很多时间。最后发现TMD同样的算法改成C++就能过。妈的我想骂人!!! 问题描述: 一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),设计一个时间复杂度为O(N)、空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段。 注意:先将顺序表元素调整为符合要求的内容后,再做输出,输出过程只能用一个循环语句实现,不能分成两个部分。 输入: 第一行输入整数n,代表下面有n行输入; 之后输入n行,每行先输入整数len与整数m(分别代表本表的元素总数与前半表的元素个数),之后输入len个整数,代表对应顺序表的每个元素。 输出: 输出有n行,为每个顺序表前m个元素与后(len-m)个元素交换后的结果 示例输入: 2 10 3 1 2 3 4 5 6 7 8 9 10 5 3 10 30 20 50 80 示例输出: 4 5 6 7 8 9 10 1 2 3 50 80 10 30 20 思想特别简单。将前m个元素翻转,将其余元素翻转,将所有元素翻转即可。 AC代码:

数据结构之单链表

狂风中的少年 提交于 2019-11-27 15:56:16
前言 在前面我们了解了线性表中的顺序表优点,顺序表可以将数放到一片连续的内存里且存储效率高,但是增加和删除效率很低,不可以增加长度,而今天的链表刚好解决了这些问题,链表在增加和删除中有着很高的效率,而且不像顺序表那样每删一个要顺序的移动 定义 链表是数据储存单元中非连续数据结构,数据的储存结构是通过指针链接依次实现的,链表由一系列结点组成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 单链表的数据结构 typedef int datatyda; //类型名字的转换 typedef sturuct lian_ //类型名字的转换 { datatyda data; //定义指针的储存数据 struct lian_ *next; //储存下一个地址的指针域 }w; 单链表头节点的创建 w link_creat () { w *l = (w*)malloc(sizeof (w)); //堆区内存的申请 if (l = NULL ) return NULL; // 指针为空的话返回 l -> data =0 //节点初始化 l ->next = NULL; return l; // 返回地址 } 节点的添加之尾插法 int list_add_taill (w *l,datatyda a) { w *n = malloc (sizeof (w); //