顺序表

顺序表的基本操作

做~自己de王妃 提交于 2020-01-20 22:18:00
顺序表的基本操作 实现功能:顺序表的初始化,取值,查找,插入,删除的操作 # include <iostream> using namespace std ; # define MAXSIZE 500 typedef int ElemType ; typedef struct { ElemType * elem ; int length ; } SqList ; InitList ( SqList & L ) { //算法2.1顺序表的初始化 //构建一个空的顺序表L L . elem = new ElemType [ MAXSIZE ] ; L . length = 0 ; } int GetElem ( SqList L , int i ) { //算法2.2 顺序表的取值 ElemType e ; if ( i < 1 || i > L . length ) cout << "error" ; //判断i值是否合理,若不合理,返回ERROR e = L . elem [ i - 1 ] ; //elem[i-1]单元存储第i个数据元素 return e ; } int LocateElem_Sq ( SqList L , ElemType e ) { //算法2.3 顺序表的查找 //顺序表的查找 for ( int i = 0 ; i < L . length ; i ++

线性表建立学生信息表

一笑奈何 提交于 2020-01-20 05:00:15
用线性表建立学生信息 这是继上一次实验(顺序表)的后续,即用线性表的链式表示和实现,这个实验的要求相关事项这里就不再赘述,可以到我的上一篇文章去看,顺序表的内容也在上一篇文章,这里仅对单链表的操作进行表示和实现。 初始化部分:即构造一个空链表。 【算法描述】 Status InitList ( LinkList & L ) { L = new LNode ; //新结点作为头结点 L -> next = NULL ; //指针域置空 return OK ; } 取值:链表的取值只能从链表的首元结点出发,顺着链域next逐个结点向下访问。 【算法描述】 Status GetElem ( LinkList L , ElenType e ) { P = L -> next ; j = 1 ; //初始化,p指向首元结点 while ( p && j < i ) //直到p为空或者p指向第i个元素 { p = p -> next ; //p指向下一个结点 ++ j ; } if ( ! p || j > i ) return ERROR ; //i的值不合法i>n or i<=0 e = p -> data ; //取第i个结点的数据域 return OK ; } 查找:查找过程跟顺序表类似,从链表的首元结点出发,依次将结点值和给定的值e进行比较,返回查找结果。 LNode *

数据结构与算法

点点圈 提交于 2020-01-20 04:53:34
1. 时间复杂度计算 基本操作,即只有常数项,认为其时间复杂度为O(1) 顺序结构,时间复杂度按加法进行计算 循环结构,时间复杂度按乘法进行计算 分支结构,时间复杂度取最大值 判断一个算法的效率时,只需关注操作数量的最高次项,其他次要项和常数项可以忽略 常见时间复杂度大小判断 O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)< O(n!) < O(n^n) 2.顺序表 定义 :将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。 2.1顺序表的两种基本实现方式 max :元素存储区的容量 num :元素存储区的当前已有元素个数 2.2元素存储区替换 一体式结构需要整体搬迁,而分离式结构只需将表信息区中的数据链接地址更新,而该顺序表对象不变。 2.3增加元素、删除元素 3.链表 链表 :是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。 3.1 单向链表 是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。 3.2 双向链表 每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值

承上(顺序表,链表)启下(泛型)

无人久伴 提交于 2020-01-20 03:11:51
若要在三个函数里完成一项功能: 例如之前的" 复杂链表的复制 ": Main:负责测试:1>测试用例编写 2>测试数据的构造 3>测试数据打印 Solution:解决明确的问题 Node:链表的结点 * * Main . java : * * public class Main { public static void main ( String [ ] args ) { Solution solution = new Solution ( ) ; //创建一个solution对象 testComplexListCopy ( solution ) ; //复杂链表的复制 } private static void testComplexListCopy ( Solution solution ) { //复杂链表的复制,这只是测试, //并不是具体的方法,所以不用要返回值 // 1. 构建测试数据 CNode head = createComplexList1 ( ) ; // 2. 进行测试 CNode resultHead = solution . copy ( head ) ; // 3. 对测试结果进行打印 printCList ( resultHead ) ; } // CNode 必须有一个构造方法,形参是 int val // 并且,初始化后,next 和

顺序表的创建—数据结构算法

房东的猫 提交于 2020-01-19 19:28:17
代码功能截图: 部分源码: #include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType a[MAXSIZE]; int length; }SqList; SqList a,b,c; void creat_list(SqList *l); void out_list(SqList l); void insert_sq(SqList *l,int i,ElemType e); ElemType delete_sq(SqList *l,int i); int locat_sq(SqList l,ElemType e); int main() {int i,k,loc;ElemType e,x;char ch; do{ printf("\n"); printf("\n 1.建立顺序表"); printf("\n 2.插入元素"); printf("\n 3.删除元素"); printf("\n 4.查找元素"); printf("\n 0.结束程序运行"); printf("\n============================"); printf("\n 请输入您的选择(1,2,3,4,0) \n"); scanf("%d",&k);

线性表之顺序表

拜拜、爱过 提交于 2020-01-19 10:12:12
线性表的定义 由n(n>=0)个数据特性相同的元素构成的有限序列称为 线性表 。 线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为 空表 。 对于 非空的 线性表或线性结构,其特点是: 1.存在唯一的一个被称作“第一个”的数据元素; 2.存在唯一的一个被称作“最后一个"的数据元素; 3.除第一个之外,结构中的每个数据元素均只有一个前驱; 4.除最后一个之外,结构中的每个元素均只有一个后驱。 线性表的顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为 顺序表 。(特点:逻辑上相邻的数据元素,其物理次序也是相邻的) 假设线性表的每个元素需占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。则线性表中的第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系: LOC(ai+1)=LOC(ai)+l 一般来说,线性表的第i个数据元素ai的存储位置为: LOC(ai)=LOC(ai)+(i-)*l 线性表的顺序存储结构示意图如下 由此可知,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机选取,所以线性表的顺序存储结构是一种 随机存取 的存储结构。 由于线性表的长度可变

考研之数据结构(第二章总结)

笑着哭i 提交于 2020-01-18 09:55:00
1.线性表:具有相同特性数据元素的一个有限序列,该序列中所含元素的个数叫做线性表的长度。 2.逻辑特性:线性表只有一个表头元素,只有一个表尾元素,表头元素没有前驱,表尾元素没有后继。 3.线性结构包括:线性表、栈、队列、串。 4.线性表的存储结构分为:顺序存储结构和链式存储结构。 5.顺序存储:把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。 特性:1.随机访问特性 2.占有连续的存储空间 3.做插入操作时要移动多个元素 6.链表:一种物理储存单元上非连续,非顺序的存储结构。 特性:1.不支持随机访问 2.结点的存储空间利用率较低 3.支持存储空间的动态分布 4.做插入操作时不需要移动元素 7.顺序表与链表各自的特点: 基于空间的比较:①.存储分配方式: 顺序表的存储空间是静态分配的(一次分配) 链表的存储空间是动态分布的(多次分配) ②.存储密度(存储密度=结点值域所占的存储量/结点结构所占的存储总量) 顺序表的存储密度=1 链表的存储密度<1(因为结点中有指针域) 基于时间的比较:①.存取方式:顺序表可以随机存取,链表只能顺序存取 ②.插入/删除时移动元素的个数:顺序表平均需移动近一半的元素,链表不需要移动元素,只需要修改指针。 8.插入一个元素时所需移动元素次数的期望值(平均次数):E=1/(n+1) ∑_(i=1)^(n+1)▒(n-i+1) =n/2

Java 数据结构第七课:顺序表_链表(链表)

邮差的信 提交于 2020-01-18 04:24:27
关于表的概念: 1. 线性表: (linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表/链表/栈/队列/字符串··· 2. 顺序表: 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下,采用数组存储。在数组上完成数据的增删查改。 静态顺序表:使用定长数组存储 动态顺序表:使用动态开辟的数组存储 3. 链表: 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链表依次实现的。 4. 顺序表和链表的优缺点: ①顺序表:优点:空间连续,支持随机访问 缺点:中间或前面部分的插入删除时间复杂度O(N);增容的代价比较大 ②链表:优点:在任意位置插入删除时间复杂度为O(1);没有增容问题,插入一个开辟一个空间 缺点:以结点为单位存储,不支持随机访问 学习链表前先了解一下这张图↓ 链表: 逻辑上有前后关系,物理上不保证前后关系 链表的头插: 前提:链表中一定有至少一个结点 ①若要插入的数据没有结点,先给它装入一个结点 Node node=new Node(); node.value=0;//value是结点名,0是要插入的数据 ②让原来的第一个结点,成为新结点的下一个结点 node.next=head;//head是原来的第一个结点 ③更新最新的第一个结点为新结点

萌新七叶的数据结构初学笔记——线性表

与世无争的帅哥 提交于 2020-01-17 01:02:32
目录 一 线性表 二 顺序表 1.静态分配 2.动态分配 1.使用typedef有什么用处 2.使用typeof有什么好处 3.为什么使用ElemType作为数据类型 3.顺序表的基本操作 1.初始化 2.创建 3.取值 4.查找 5.插入 6.删除 三 单链表 1.单链表的存储方式 2.单链表的基本操作 1.初始化 2.创建 3.取值 4.查找 5.插入 6.删除 四 双向链表 五 循环链表 六 线性表的应用 一 线性表 线性表是由n(n>=0)个相同类型的数据元素组成的有限序列,它是最基本、最常用的一种线性结构。顾名思义,线性表就像一条线,不会分叉。线性表有唯一的开始和结束,除了第一个元素外,每个元素都有唯一的直接前驱:除了最后一个元素外,每个元素都有唯一的直接后继。 线性表有两种存储方式:顺序存储和链式存储。采用顺序存储的线性表称为顺序表,采用链式存储的线性表称为链表。链表又分为单链表、双向链表和循环链表。 二 顺序表 顺序表采用顺序存储方式,即逻辑上相邻的数据在计算机内的存储位置也是相邻的。顺序存储方式,元素存储是连续的,中间不允许有空,可以快速定位第几个元素,但是插入和删除时需要移动大量元素。根据分配空间方法不同,顺序表可以静态分配和动态分配两种方法。 1.静态分配 顺序表最简单的方法是使用一个定长数组data[ ]存储数据,最大空间为Maxsize

循环队列的基本操作和简单实现

时光毁灭记忆、已成空白 提交于 2020-01-14 17:45:56
文章目录 一、引入 二、循环队列基本操作 三、循环队列简单实现 一、引入 队列的顺序表示和实现 队列的顺序表示-用一维数组base[MAXQSIZE] # define MAXQSIZE 100 //最大队列长 typedef struct { Qelem * base ; //初始化的动态分配存储空间 int front ; //头指针,不是指针变量,若队列不空,只想队头元素 int rear ; //尾指针,不是指针变量,若队列不空,指向队尾元素的下一个位置 } SqQueue ; 初始: front = rear = 0 ; //队空 入队: base [ Q . rear ] = e ; // rear ++ ; //指向下一空间 出队: e = base [ Q . front ] ; //出队 front ++ ; front = rear ; //队空标志 当rear==MAXQSIZE时,发生溢出 若front=0,rear=MAXQSIZE时,再入队——真溢出; 若front!=0,rear=MAXQSZIE时,再入队—— 假溢出 如何解决假溢出问题? 将队中元素向对头移动,缺点是浪费时间,队中元素都要移动 将队空间设想成一个循环的表,即分配给队列的m个存储单元可以循环使用,当 rear = =MAXQSIZE 时,若向量的开始端空着,又可从头使用空着的空间。当