顺序表

顺序表

让人想犯罪 __ 提交于 2019-12-05 03:07:31
顺序表可以随机存取表中的任意元素,其存储位置可以用一个简单,直观的公式来表现。这样就有一些缺点。在插入数据和删除数据的时候,要移动大量的元素。同时数组因为有固定的长度,这造成了存储空间的浪费。 //图书管理系统(顺序表版) #include<iostream> using namespace std; #define MAXSIZE 10 typedef struct //图书基本信息 { char no[20]; //图书IBSN char bookName[50]; //图书名字 float price; //图书价格 }Book; typedef struct { Book elem[MAXSIZE]; //存储空间的基本地址 int length; //图书数量(顺序表的长度) }SqList; //初始化(构建一个空的顺序表) void InitList(SqList &L) { if (!L.elem) { printf("存储分配失败!\n"); return; //退出该函数 } L.length = 0; printf("分配空间成功!\n"); } void PrintList(SqList &L) //打印所有图书信息 { if (L.length<1) { cout << "空表"; } for (int i = 0; i < L.length; i++)

【algo&ds】2.线性表

被刻印的时光 ゝ 提交于 2019-12-04 18:31:25
1.线性表 线性表 (英语:Linear List)是由n(n≥0)个 数据 元素( 结点 )a[0],a[1],a[2]…,a[n-1]组成的 有限序列 。 其中: 数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表) 将非空的线性表(n>=1)记作:(a[0],a[1],a[2],…,a[n-1]) 数据元素a[i](0≤i≤n-1)只是个抽象符号,其具体含义在不同情况下可以不同 一个数据元素可以由若干个数据项组成。数据元素称为记录,含有大量记录的线性表又称为文件。这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个直接后继数据元素。 2.线性表的存储结构 顺序表 链表 单链表 动态单链表 静态单链表 双链表 循环链表 单循环链表 双循环链表 静态链表 3.顺序表 利用数组的连续存储空间顺序存放线性表的各元素 3.1结构体定义 如果需要使用自定义的结构体来维护一个顺序表,通常来讲结构体的元素一般是一个固定大小的数组(可用长度足够大),以及当前数组存放的元素个数,也即数组的长度 typedef struct LNode *List; struct LNode { ElementType Data

数据结构1-顺序表

我的梦境 提交于 2019-12-04 11:27:28
1.1 顺序表 1.1.1 定义 ​ 线性表的顺序存储是使用一组连续地址的存储单元(如Java中的数组),依次存储线性表中的数据元素。顺序存储的线表也称为线性表。 ​ 对于线性表而言,顺序表元素在存取操作上,它的时间复杂度为O(1),将带有这种特点的存储结构,称为 随机存取 结构, 顺序存储和随机存取 是线性表的显著优点。 1.1.2 建立顺序表 静态建表 ​ 首先在内存中找到一块连续的存储空间,将元素以次存放即可。在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据将产生溢出,从而导致程序的崩溃。 顺序表需要三个部分 存储空间的起始地址 顺序表最大存储容量 顺序表的当前长度 C语言中对于顺序表的描述 ​ 在Java中,也可也参照C的方式定义一个类,类中定义一个成员变量,类型为数组,同时设置一个变量,用来记录实际存储的有效元素个数。实际上ArrayList底层就是这样来做的,只是它更偏向于动态建表。 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { //创建一个对象数组,用来存储元素,没有显示的指定大小,运行时默认分配10个大小的内存空间 transient Object[]

顺序表

断了今生、忘了曾经 提交于 2019-12-04 11:21:58
顺序表 在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。 对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系。 这样的一组序列元素的组织形式,我们可以将其抽象为 线性表 。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础。 根据线性表的实际存储方式,分为两种实现模型: 顺序表 ,将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。 链表 ,将元素存放在通过链接构造起来的一系列存储块中。 一、顺序表的基本形式 图a表示的是顺序表的基本形式,数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即: Loc(ei) = Loc(e0) + c*i 故,访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。 如果元素的大小不统一

顺序表

[亡魂溺海] 提交于 2019-12-04 07:07:36
选择合适的数据结构 提高算法写的代码的效率 数据 存储和管理 根据数据之间的关系(逻辑结构) 集合 类型相同 但没有关联 线性关系 每个数据唯一的前驱和后继(排队) 树状结构 一对多 树状结构 图 多对多 图 A->B->C-D 数据的存储方式(存储结构) 顺序存储 --->数组 存放元素位置是相邻的 链式存储 数据位置不相邻 可以通过上一个数据找到下一个数据 顺序表 链表/双链表 栈和队列 线性表 顺序表 数据的方式 数组 动态数组 存放若干数据 算法 二分查找 如果有序那么可以有其他的查找方式 无序 只能一个个查找 算法 计算数据 数据结构 存储和管理数据 1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 typedef struct list 5 { 6 int arr[100]; 7 int len;//当前存放的数组个数 8 int size;//数组大小 如果是动态数组 就记得加上size 9 }LIST; 10 void init(LIST*p);//初始化 对顺序表进行操作------->传入地址 结构体指针 11 void insertData(LIST*p,int data);//插入 12 void deleteData(LIST*p,int data);//删除 13 void

线性表——顺序表

懵懂的女人 提交于 2019-12-04 02:10:49
线性表结构体: typedef struct Array{ int len; // 记录数组内有效元素个数 int max; // 记录最大元素个数 int *pBase; }Ar, *pAr; 顺序表基本运算: 初始化一个Array pAr CreatArray(int num) //初始化一个Array { pAr parr = (pAr)malloc(sizeof(Ar)); if (NULL == parr) { printf("动态内存分配失败!程序终止!\n"); exit(-1); } parr->pBase = (int *)malloc(sizeof(int)*num); if (NULL == parr->pBase) { printf("动态内存分配失败!程序终止!\n"); exit(-1); } parr->len = 0; // 置初始化长度为0 parr->max = num; // 置最大长度为num return parr; } 在数组的末尾追加元素 int Append_Val(pAr parr, int val) // 在数组的末尾追加元素 { // 数组满了不能追加 if (Is_Array_Full(parr)) { printf("顺序表已满,追加失败!\n"); return 0; } // 将数据val写入末尾位置,并刷新当前数组长度

顺序表添加与删除元素以及 php实现顺序表实例

狂风中的少年 提交于 2019-12-03 21:57:21
对顺序表的操作,添加与删除元素。 增加元素 如下图所示 对顺序列表 Li [1328,693,2529,254] 添加一个元素 111 ,有三种方式: a)尾部端插入元素,时间复杂度O(1); 保证了原始顺序列表的顺序。 b)非保序的加入元素(不常见),时间复杂度O(1); 打乱了原始顺序列表的顺序。 c)保需的元素插入,时间复杂度O(n); 保证了原始顺序列表的顺序。 删除元素 如下图所示 对顺序列表 Li [1328,693,2529,254] 删除元素 ,有三种方式: a)删除表尾元素,时间复杂度O(1); b)非保序的元素删除,时间复杂度O(1); c)保序的元素删除,时间复杂度O(n); 比如上图删除1号元素。 list存储数据,允许不同类型的数据作为元素:如,Li [ 121, 'hello', 3.14, 1000 ], 因此List采用元素外置的方式来做。 元素外置的方式:可以理解为,列表list中,存储的是各个元素的地址,各个元素是外置到list外部, 每个元素的地址对应外部的元素。如下图: 支持顺序表存储区扩从的,称作 动态顺序表 PHP代码实现动态的顺序表: 1 <?php 2 /** 3 * Class Sequence 4 * desc:顺序表的实现: 5 * 顺序表:在内存中元素是顺序存储的,除了首部元素和尾部元素,其余元素是一一紧凑相连的

理解计算机内存、数据类型本质、连续存储

我怕爱的太早我们不能终老 提交于 2019-12-03 21:31:54
要学习数据结构与算法,与数据的类型密不可分,要知道数据在计算机中是如何存取的,需知道计算机中基本的存储单元是字节,一个字节是八个位。在计算机的内存连续的存储空间是由一些基本的存储单元组成的,一个字节(八个位)作为一个地址标识。存数据的时候需要多个存储单元放在一起表示。 如:0000 0000 这就是一个基本的存储单元。 如下:在计算机的内存中有四个基本存储单元,也就是四个字节。 对于32位机器 基本整型int 占 4个字节 如上图:一个整数类型的数据占4个基本储存单元(4个字节,也就是32个位)。 如:int 1; 在计算机中二进制存储,看到的是0000 0001, 其实实际是 00000000 00000000 00000000 00000001 一共4个字节,32个位来标识。 如:char 'a'; 在计算机中 只占一个存储空间,一个字节。 如果:声明,上图四个存储单元是 整型 int ,计算机会将这四个存储单元 看做整型来对待。 如果:声明,上图四个存储单元是 字符 char , 计算机会将这四个存储单元看做 4个char。 总结应该知道两点: 1.不同的类型占用存储单元个数不同。 2.计算机怎么对待内存中存储的这些二进制数据呢?根据不同的数据类型做对应的处理。 如果是一个 顺序列表 如下存储: Li [7,2100,390] 内存地址 00x1 对应 第一个元素 7

数据结构回炉重造之一关于线性表

瘦欲@ 提交于 2019-12-03 20:40:17
1.从最简单的开始之(线性表->顺序表长度): 输入你想输入的数字个数n,并输入该n个数字,而后输出其长度.... 首步--既然是表,且有顺序结构,便离不开我们之前的学过的结构体,与顺序连接相关 我们能想到的的便只有struct结构体,当然前提是还是要记得结构体的用法,如果记不得的话我们也只能对此作罢。 其次--便是在结构体里面存放元素,怎么存放,存放什么————也就只有数字,还有其关于长度的变量,则struct{int data[1000];int length;} 最后--规划代码并且完成输入输出操作(ps:也许有些小伙伴可能连自定义函数都不知道怎么用了,抑或是struct结构体忘记了的,以及结构体函数都没有搞懂的,务必要在操作这些之前把这几个东西重新看书补齐!) 二.直接代码操作,实行解释: #include<iostream> using namespace std; typedef struct { int shuju[1000]; int changdu; }xxb; void shuchu(xxb L);//定义一个函数关于输出结构体的函数,如果不使用输出函数将长度进行输出,直接在主函数内部操作即可!括号内的L即结构体内的数据类型,相当于一可移动的标志 int main() { int n, i = 0; xxb L;//调用该参数 L.changdu = 0;/

顺序表去重操作 数据结构

时光毁灭记忆、已成空白 提交于 2019-12-03 13:16:29
顺序表去重操作 数据结构 问题描述 问题描述:设计一个算法从顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变。 例如:原顺序表为{4 2 8 4 2 1 2 1 3 5 2},执行该算法后,顺序表为:{4 2 8 1 3 5}。另外,顺序表的初始值通过调用算法initRandomize(int *arr, int n, int min, int max)产生。 /* 产生n个[min, max]的随机数。可能会有重复值。 */ void initRandomize(int *arr, int n, int min, int max) { int i = 0; srand(time(0)); /*设置种子,并生成伪随机序列*/ for (i = 0; i < n; ++i) { arr[i] = rand() % (max - min + 1) + min; /*得到从[min, max]之间的随机数*/ printf("%d ", arr[i]); } printf("\n\n"); } 代码实现 //主要函数代码,去重的 bool unique_link(sqlink &L) { if(L.len==0) return false; int i, j=1, sum=1; while(j<L.len) { for(i=0; i<sum; i++) { if(L.elem[i