顺序表

线性表的简单应用

独自空忆成欢 提交于 2020-01-26 20:10:05
线性表 •线性表是我们最先接触,也是最简单的一种数据结构的表现方式。 •线性表分为顺序表和链表,也就是顺序存储结构和链式存储结构的两种表现形式。 1.顺序表   •顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。 1.定义顺序表结构体: #define MAXN 100100typedef struct list { int data[MAXN]; //存储空间 int last; //当前最后一个元素的下标(last+1表示当前表的长度) int maxsize; //最大元素个数(表的最大长度) }squenlist; 2.初始化结构体 void init(squenlist *L,int maxsize) { L->last = -1; //将last赋值为-1为了方便访问数组下标 L->maxsize = maxsize; //获取表的最大长度 } 3.建表 定义了结构体并且初始化了之后,就要开始建表了,建立顺序表的过程可以简化为一个给数组赋值的过程 int

排序算法——插入排序

自作多情 提交于 2020-01-26 06:09:12
插入排序 拥有一个无序的数组,我们只需先拿一个数(一般拿第一个),把它先当作一个有序的数组。然后把这个无序数组中其它数分别插入到已经有序的数组中即可。 代码构造思路 :首先得考虑要用什么数据结构,是链表还是顺序表。在下面的代码中,我使用的是顺序表,其实就是普通的数组。然后因为我拿第一个数做为已经有序的数组,剩下只需要把其它在无序数组中的数,插入到有序数组中即可,所以外循环其实只需要循环 n-1 次。而每次循环的 nums[i] 其实就是代rug表当前要插入的数,然后构造内循环,内循环所循环的其实就是已经有序的数组,从尾到头进行遍历,至于为什么是从尾到头,当然是因为在顺序表中执行插入操作,不管插入到哪里,插入位置后面的数组自然都需要往后移一个位置,而在插入排序中,从尾到头的遍历的时候,在比较的同时,也在移动数组中数的位置。就是需要插入的数需要排在当前遍历到的有序数组的数的前面,自然需要把这个数后移,而因为是从尾到头的遍历,所以每一次的比较的位置不是正确的位置,都会把当前有序数组的数往后一位,直到找到合适的位置,进行插入。而这个合适的位置就是 nums[j + 1] = insertNum 。 时间复杂度 : 平均情况 最好情况 最坏情况 O ( N 2 ) O(N^2) O ( N 2 ) O ( N ) O(N) O ( N ) O ( N 2 ) O(N^2) O ( N 2 )

顺序表增、删、改、插代码实现和时间复杂度

若如初见. 提交于 2020-01-26 02:23:48
顺序表基本操作的时间复杂度: 1. 新增元素: O(N) (尾插是O(1),不考虑扩容的情况) 2. 查找元素: O(N) 3. 根据下标获取/修改元素:O(1) 4. 删除元素:O(N) 5. 清除所有元素:O(1) 顺序表最主要的特点支持随机访问能力(可以高效的按照下标来操作) 尾插的时候效率也比较高(但可能会触发扩容,如果扩容了,开销就比较大了) 顺序表增删改查的代码 public class SeqList { private int [ ] datas = new int [ 100 ] ; private int size = 0 ; public int getSize ( ) { // size 这个成员只能提供 get 方法, 不能提供 set // size 是通过后面是增删方法来进行维护的. return size ; } public void display ( ) { // 依次打印出每个元素 // 形如: [1, 2, 3, 4] String result = "[" ; for ( int i = 0 ; i < size ; i ++ ) { result += datas [ i ] ; if ( i < size - 1 ) { result += "," ; } } result += "]" ; System . out .

Python中的顺序表

故事扮演 提交于 2020-01-25 19:39:07
Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质。 tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。 list的基本实现技术 Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征: 基于下标(位置)的高效元素访问和更新,时间复杂度应该是O(1); 为满足该特征,应该采用顺序表技术,表中元素保存在一块连续的存储区中。 允许任意加入元素,而且在不断加入元素的过程中,表对象的标识(函数id得到的值)不变。 为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术。 在Python的官方实现中,list就是一种采用分离式技术实现的动态顺序表。这就是为什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。 在Python的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大

顺序表

空扰寡人 提交于 2020-01-25 16:28:03
顺序表是用一段 物理地址连续 的存储单元一次存储数据元素的线性结构,一般情况下采用数组存储 顺序表分为: 静态顺序表(使用地工厂数组存储) 动态顺序表(使用动态开辟的数组存储) 下面实现的是动态顺序表: C语言中没有这种结构,所以把它们封装成一个结构体,里面有不同类型的元素(数组、有效元素个数、数组总容量),便于管理 typedef int DataType ; //给类型取别名 数组元素类型就很好变 typedef struct SeqList { DataType * _array ; //有效元素(动态开辟的数组) int _size ; //有效元素个数 int _capacity ; //数组的总容量(空间总大小) } SeqList , * PSeqList ; //定义了结构体变量(把struct SeqList重命名为SeqList) 对结构体初始化 数组的大小先设置一个初始值,不够了再扩容 void SeqListInit ( PSeqList ps ) { assert ( ps ) ; //先设置一个容量(假设可以存放3个元素),在这个基础上再动态开辟 ps - > _array = ( DataType * ) malloc ( sizeof ( DataType ) * 3 ) ; if ( NULL == ps - > _array ) { return

顺序存储结构与链式存储结构

醉酒当歌 提交于 2020-01-25 04:53:14
上一篇博客简单讲述了一下两种结构的概念这一篇博客主要想讲述一下他们之间的区别 顺序存储结构与链式存储结构的优缺点 1、###顺序存储结构 概念官方一点来说可以使用 百度百科 的介绍:顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。 当然不得不说一般这种官方的解释都是不太适合我的,所以用小甲鱼的方式来说这个概念的话,简单来说就是,用一段连续的地址存放数据元素,数据间的逻辑关系和物理关系相同。 优点1:存储密度大,空间利用度高,比链式存储节约空间 优点2:存储操作上方便操作,顺序支持随机存取,查找会比较容易 缺点1:插入或者删除元素时不方便,花费的时间更多 往顺序线性表中插入数据 见下图往B与C之间插入一个M,在插入之前我们需要将CD整体往后移一个位置,为M空出一个位置,再见M放入。 往顺序线性表中删除元素 与上面所说的插入其实挺像的,前者在插入位置后的元素都往后移,二一处则是向左移覆盖掉要删除的元素,需要注意的是,要将最后一个元素进行移除,可以参考下图 2、链式存储结构 概念:链式存储结构,又叫链接存储结构。在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点

顺序表的创建与功能实现

送分小仙女□ 提交于 2020-01-24 19:48:53
1 #include<iostream> 2 #include<stdio.h> 3 4 #define MAXSIZE 100 5 #define OVERFLOW -2 6 #define ERROR 0 7 #define OK 1 8 9 using namespace std; 10 11 typedef struct squList 12 { 13 int *elem; 14 int length; 15 }SqList; 16 17 //初始化 18 int Init(SqList *L) 19 { 20 L->elem=new int[MAXSIZE]; 21 if(! L->elem) 22 { 23 exit(OVERFLOW); //存储分配失败 exit(0)---结束程序 24 } 25 int n,i=0; 26 cout<<"请输入顺序表元素个数"<<endl; 27 cin>>n; 28 while(i<n) 29 { 30 cin>>L->elem[i++]; 31 } 32 return (L->length=i+1); 33 cout<<"输出顺序表为:"<<endl; 34 } 35 36 //判断是否为空 37 void IsEmpty(SqList *L) 38 { 39 if(L->length) 40 cout<<"序列不为空"<

顺序表(顺序存储结构)及初始化过程详解

偶尔善良 提交于 2020-01-24 19:38:41
自定义顺序表,C 语言实现代码如下: typedef struct Table{ int * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组” int length;//记录当前顺序表的长度 int size;//记录顺序表分配的存储容量 }table; 注意,head 是我们声明的一个未初始化的动态数组,不要只把它看做是普通的指针。 接下来开始学习顺序表的初始化,也就是初步建立一个顺序表。建立顺序表需要做如下工作: 给 head 动态数据申请足够大小的物理空间; 给 size 和 length 赋初值; 因此,C 语言实现代码如下: #define Size 5 //对Size进行宏定义,表示顺序表申请空间的大小 table initTable(){ table t; t.head=(int*)malloc(Size*sizeof(int));//构造一个空的顺序表,动态申请存储空间 if (!t.head) //如果申请失败,作出提示并直接退出程序 { printf("初始化失败"); exit(0);//强制退出 } t.length=0;//空表的长度初始化为0 t.size=Size;//空表的初始存储空间为Size return t; } 扩展:malloc和free 解释: https://www.cnblogs.com/CheeseIce/p

数据结构实验报告之链表顺序表的操作

扶醉桌前 提交于 2020-01-24 19:36:10
1、编写程序实现顺序表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。在此基础上设计一个主程序完成如下功能: ( 1)初始化顺序表L; ( 2)依次在表尾插入a,b,c,d,e五个元素; ( 3)输出顺序表L; ( 4)输出顺序表L的长度; ( 5)判断顺序表L是否为空; ( 6)输出顺序表L的第4个元素; ( 7)输出元素c的位置; ( 8)在第3个位置上插入元素f,之后输出顺序表L; ( 9)删除L的第2个元素,之后输出顺序表L; ( 10)销毁顺序表L。 2、编写程序实现单链表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。在此基础上设计一个主程序完成如下功能: ( 1)初始化单链表L; ( 2)依次在表尾插入a,b,c,d,e五个元素; ( 3)输出单链表L; ( 4)输出单链表L的长度; ( 5)判断单链表L是否为空; ( 6)输出单链表L的第4个元素; ( 7)输出元素c的位置; ( 8)在第3个位置上插入元素f,之后输出单链表L; ( 9)删除L的第2个元素,之后输出单链表L; ( 10)销毁单链表L。 1 顺序表 2 #include<stdio.h> 3 #include<malloc.h> 4 #include<stdlib.h> 5 6 #define TRUE 1 7

数据结构-顺序表

故事扮演 提交于 2020-01-24 19:29:17
判断题 1.(neuDS)所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。 T F 2.(neuDS)在顺序表上进行插入、删除操作时需要移动元素的个数与待插入或待删除元素的位置无关。 T F 3.顺序存储方式只能用于存储线性结构。 T F 4.在顺序表中取出第i个元素所花费的时间与i成正比。 T F 5.对于顺序存储的长度为 N 的线性表,删除第一个元素和插入最后一个元素的时间复杂度分别对应为 O (1)和 O ( N )。 T F 6.(neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。 T F 7.顺序存储的线性表可以随机存取。 T F 8.顺序存储结构的主要缺点是不利于插入或删除操作。 T F 选择题 1.用数组表示线性表的优点是()。 A.便于插入和删除操作 B.便于随机存取 C.可以动态地分配存储空间 D.不需要占用一片相邻的存储空间 2.阅读下列程序,其功能是()。 typedef struct { ElemType *list; int size; intMaxSize; }SeqList; void fun1(SeqList&L) { inti, j; ElemType temp; for (i=0, j= L.sise-1; i<j; i++, j--) { temp=L.list[i]; L.list[i]=L