第四讲-顺序表的简单应用详解
顺序表的概念
![顺序表的概念](https://img.taocdn.com/s3/m/973bf9d6f9c75fbfc77da26925c52cc58bd69031.png)
顺序表的概念
顺序表是一种基本的数据结构,它是由一组元素构成的线性表,这些元素按照逻辑关系依次排列在一组地址连续的存储单元中。
顺序表的特点有以下几点:
1. 存储结构:顺序表使用数组作为底层存储结构。
数组中的元素根据元素在顺序表中的位置一一对应,可以通过元素在数组中的下标来访问和操作。
2. 存储顺序:顺序表中的元素按照其在逻辑上的先后顺序存储在数组中,物理地址也是按照逻辑上的顺序排列,因此元素在顺序表中的位置与其在数组中的位置是一一对应的。
3. 长度固定:顺序表的长度是固定的,在创建顺序表时需要指定其长度。
由于存储空间是预先分配的,因此无论实际使用多少元素,顺序表的存储空间始终保持不变。
4. 插入和删除操作:由于顺序表的长度是固定的,因此插入和删除操作会涉及到元素的移动。
插入操作需要将插入位置后的元素依次后移,而删除操作需要将删除位置后的元素依次前移。
5. 随机访问效率高:由于顺序表中的元素在数组中是连续存储的,因此可以通过下标直接访问元素,时间复杂度为O(1),
即常数时间。
顺序表的优点是随机访问效率高,操作简单;缺点是插入和删
除操作效率低,且长度固定。
根据实际需求和操作频率,可以选择使用顺序表或其他适合的数据结构。
线性表——顺序表的实现与讲解(C++描述)
![线性表——顺序表的实现与讲解(C++描述)](https://img.taocdn.com/s3/m/d0b848d10d22590102020740be1e650e52eacf9a.png)
线性表——顺序表的实现与讲解(C++描述)引言新生安排体检,为了便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这种组织数据(同学)的方式我们可以称作线性表结构定义线性表:具有零个或多个(具有相同性质,属于同一元素的)数据元素的有限序列若将线性表记为( a0 , a1 ,ai -1 ai ,ai +1 , ... , an - 1 , an )•注意:i 是任意数字,只为了说明相对位置,下标即其在线性表中的位置)•前继和后继:由于前后元素之间存在的是顺序关系,所以除了首尾元素外,每个元素均含有前驱和后继,简单的理解就是前一个元素和后一个元素•空表:如果线性表中元素的个数n 为线性表长度,那么n = 0 的时候,线性表为空•首节点、尾节点:上面表示中的:a0 称作首节点,an 称作尾节点抽象数据类型•数据类型:一组性质相同的值的集合及定义在此集合上的一些操作的总称•抽象数据类型:是指一个数学模型及定义在该模型上的一组操作关于数据类型我们可以举这样一个例子•例如:我们常常用到的整数型浮点型数据这些都是数据的总称,所有符合其性质特征的都可以用其对应数据类型来定义,例如520是一个满足整数特征的数据,所以可以赋值给一个int型的变量int love = 520;像这些一般的数据类型通常在编程语言的内部定义封装,直接提供给用户,供其调用进行运算,而抽象数据类型一般由用户自己根据已有的数据类型进行定义抽象数据类型和高级编程语言中的数据类型实际上是一个概念,但其含义要比普通的数据类型更加广泛、抽象为什么说抽象呢?是因为它是我们用户为了解决实际的问题,与描述显示生活且现实生活中的实体所对应的一种数据类型,我可以定义其存储的结构,也可以定义它所能够,或者说需要进行的一些操作,例如在员工表中,添加或删除员工信息,这两部分就组成了“员工”这个抽象的数据类型大致流程就是:•A:一般用户会编写一个自定义数据类型作为基础类型•B:其中一些抽象操作就可以定义为该类型的成员函数,然后实现这些函数•C:如果对外的接口在公有域中,就可以通过对象来调用这些操作了•当然,我们在使用抽象数据类型的时候,我们更加注意数据本身的API描述,而不会关心数据的表示,这些都是实现该抽象数据类型的开发者应该考虑的事情线性表分为两种——顺序存储结构和链式存储结构,我们先来学习第一种顺序存储结构什么是顺序存储结构呢?顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素怎么理解这这种存储方式呢?例如在一个菜园子中,有一片空地,我们在其中找一小块种蔬菜,因为土地不够平整疏松所以我们需要耕地,同时将种子按照一定的顺序种下去,这就是对表的初始化菜园子可以理解为内存空间,空地可以理解为可以使用的内存空间,我们通过种蔬菜种子的方式,将一定的内存空间所占据,当然,这片空间中你所放置的数据元素都必须是相同类型的也就是说都得是蔬菜种子,有时候有些种子被虫子咬坏了,我们就需要移除一些种子,买来以后再在空出来的位置中选地方种好,这也就是增加和删除数元素地址计算方式从定义中我们可以知道这种存储方式,存储的数据是连续的,而且相同类型,所以每一个数据元素占据的存储空间是一致的,假设每个数据占据L个存储单元那么我们可以的出这样的结论公式•i 代表所求元素的下标•也就是单位长度乘以对应的个数线性表的抽象数据类型#ifndef _LIST_H_#define _LIST_H_#include<iostream> using namespace std;class outOfRange{};class badSize{};template<class T>class List {public:// 清空线性表virtual void clear()=0;// 判空,表空返回true,非空返回false virtual bool empty()const=0;// 求线性表的长度virtual int size()const=0;// 在线性表中,位序为i[0..n]的位置插入元素value virtual void insert(int i,const T &value)=0;// 在线性表中,位序为i[0..n-1]的位置删除元素virtual void remove(int i)=0;// 在线性表中,查找值为value的元素第一次出现的位序virtual int search(const T&value)const=0;// 在线性表中,查找位序为i的元素并返回其值virtual T visit(int i)const=0;// 遍历线性表virtual void traverse()const=0;// 逆置线性表virtual void inverse()=0;virtual~List(){};};/*自定义异常处理类*/class outOfRange:public exception { //用于检查范围的有效性public:const char* what() const throw() {return"ERROR! OUT OF RANGE.\n";}};class badSize:public exception { //用于检查长度的有效性public:const char* what() const throw() {return"ERROR! BAD SIZE.\n";}};#endif在上面线性表的抽象数据类型中,定义了一些常用的方法,我们可以在其中根据需要,增删函数有了这样的抽象数据类型List 我们就可以写出线性表其下的顺序结构和链式结构表的定义写出来异常语句说明:如果new在调用分配器分配存储空间的时候出现了错误(错误信息被保存了一下),就会catch到一个bad_alloc类型的异常,其中的what函数,就是提取这个错误的基本信息的,就是一串文字,应该是constchar*或者string顺序表——顺序存储结构的定义#ifndef _SEQLIST_H_#define _SEQLIST_H_#include "List.h" #include<iostream> using namespace std;//celemType为顺序表存储的元素类型template<class elemType>class seqList:public List<elemType> {private:// 利用数组存储数据元素 elemType *data;// 当前顺序表中存储的元素个数int curLength;// 顺序表的最大长度int maxSize;// 表满时扩大表空间void resize();public:// 构造函数 seqList(int initSize =10);// 拷贝构造函数 seqList(seqList & sl);// 析构函数~seqList() {delete [] data;}// 清空表,只需修改curLength void clear() {curLength =0;}// 判空bool empty()const{return curLength ==0;}// 返回顺序表的当前存储元素的个数int size() const {return curLength;}// 在位置i上插入一个元素value,表的长度增1void insert(int i,const elemType &value);// 删除位置i上的元素value,若删除位置合法,表的长度减1 void remove(int i);// 查找值为value的元素第一次出现的位序int search(const elemType &value) const ;// 访问位序为i的元素值,“位序”0表示第一个元素,类似于数组下标 elemType visit(int i) const;// 遍历顺序表void traverse() const;// 逆置顺序表void inverse();bool Union(seqList<elemType>&B);};顺序表基本运算的实现(一) 构造函数在构造函数中,我们需要完成这个空顺序表的初始化,即创建出一张空的顺序表template<class elemType>seqList<elemType>::seqList(int initSize) {if(initSize <=0) throw badSize();maxSize = initSize;data =new elemType[maxSize];curLength =0;}在这里我们注意区分initSize 和curLenght 这两个变量•initSize:初始化(指定) 数组长度•数组长度是存放线性表的存储空间的长度,一般来说这个值是固定的,但是为了满足需要很多情况下,我们会选择动态的分配数组,即定义扩容机制,虽然很方便,但是确带来了效率的损失,我们在扩容的函数中会再提到这一问题•curLenght:线性表长度,即数据元素的个数(二) 拷贝构造函数template<class elemType>seqList<elemType>::seqList(seqList & sl) {maxSize = sl.maxSize;curLength = sl.curLength;data =new elemType[maxSize];for(int i =0; i < curLength; ++i)data[i] = sl.data[i];}(三) 插入我们下面来谈一个非常常用的操作——插入操作,接着用我们一开始的例子,学校安排体检,大家自觉的按照学号顺讯排好了队伍,但是迟到的某个学生Z和认识前面队伍中的C同学,过去想套近乎,插个队,如果该同学同意了,这意味着原来C同学前面的人变成了Z,B同学后面的人也从C变成了Z同学,同时从所插入位置后面的所有同学都需要向后移动一个位置,后面的同学莫名其妙的就退后了一个位置我们来想一下如何用代码实现它呢,并且有些什么需要特别考虑到的事情呢?•1、插入元素位置的合法以及有效性•插入的有效范围:[0,curLength] 说明:curLength:当前有效位置•2、检查是否表满,表满不能继续添加,否则发生溢出错误•A:不执行操作,报错退出(为避免可以将数组初始大小设置大一些)•B:动态扩容,扩大数组容量(下例采用)•3、首尾节点的特殊插入情况考虑•4、移动方向•利用循环,从表尾开始逐次移动,如果从插入位置开始,会将后面的未移动元素覆盖掉template<class elemType>void seqList<elemType>::insert(int i, const elemType &value) {//合法的插入范围为【0..curlength】if(i <0||i >curLength) throw outOfRange();//表满,扩大数组容量if (curLength == maxSize) resize();for (int j = curLength; j > i; j--)//下标在【curlength-1..i】范围内的元素往后移动一步 data[j] =data[j -1];//将值为value的元素放入位序为i的位置 data[i] = value;//表长增加++curLength;}(四) 删除既然理解了插入操作,趁热打铁,先认识一下对应的删除操作,这个操作是什么流程呢?还是上面的例子,插队后的同学被管理人员发现,不得不离开队伍,这样刚才被迫集体后移的那些同学就都又向前移动了一步,当然删除位置的前后继关系也发生了改变与插入相同,它又有什么注意之处呢?•1、删除元素位置的合法以及有效性•删除的有效范围:[0,curLength - 1]•i < 0 || i > curLength- 1隐性的解决了判断空表的问题•2、移动方向•利用循环,从删除元素的位置后开始逐次前移template<class elemType>void seqList<elemType>::remove(int i) {//合法的删除范围if(i <0|| i > curLength-1) throw outOfRange();for(int j = i; j < curLength -1; j++)data[j] = data[j+1];--curLength;}(五) 扩容操作还记得吗,我们在构造函数中,定义了数组的长度seqList<elemType>::seqList(int initSize) { 代码内容}同时我们将这个初始化的指定参数值做为了数组的长度maxSize = initSize;为什么我们不直接指定构造函数中的参数为maxSize呢?从变量名可以看出这是为了说明初始值和最大值不是同一个数据,也可以说是为了扩容做准备,为什么要扩容呢?数组中存放着线性表,但是如果线性表的长度(数据元素的个数)达到了数组长度会怎么样?很显然我们已经没有多余的空间进行例如插入这种操作,也称作表满了,所以我们定义一个扩容的操作,当涉及到可能表满的情况,就执行扩容操作扩容是不是最好的方式?虽然数组看起来有一丝不太灵光,但是数组确实也是存储对象或者数据的有效方式,我们也推荐这种方式,但是由于其长度固定,导致它在很多时候会受到一些限制,就例如我们上面的表满问题,那么如何解决呢?方法之一就是我们设置初始值比实际值多一些,但是由于实际值往往会有一些波动,就会导致占用过多的内存空间造成浪费,或者仍发生表满问题,为了解决实际问题,很显然还是扩容更加符合需要,但是代价就是一定的效率损失数组就是一个简单的线性序列,这使得元素访问非常快速。
顺序表——精选推荐
![顺序表——精选推荐](https://img.taocdn.com/s3/m/cae159631fb91a37f111f18583d049649b660ee3.png)
顺序表顺序表的1基本操作的代码在下⽂都有,并且经过初步测试,如果有⼤佬发现不对的地⽅,还望多多指正,谢谢。
1.线性表线性表:n个具有相同特性的数据元素的有限序列。
线性表是⼀种在实际中⼴泛使⽤的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的⼀条直线。
但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
(画图没弄整齐--^_^--)顺序表:基本内容如图:1概念及结构顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组存储。
在数组上完成数据的增删查改。
顺序表⼀般可以分为:1. 静态顺序表:使⽤定长数组存储。
2. 动态顺序表:使⽤动态开辟的数组存储#define Capacity 100typedef int DataType; //表中保存的数据类型,在前⾯⽤typedef关键字再给类型名,⽅便⼀改全改struct SeqList{DataType array[Capacity]; //保存顺序表中元素,Capacity是数组总容量size_t size; //记录有效元素个数};静态顺序表实质就是固定容量的数组加⼀个有效元素计数。
顺序表的具体操作以动态顺序表来展⽰:typedef int DataType; //存放的数据类型typedef struct SeqList{DataType* _array; // 指向动态申请的数组空间size_t _size; //记录有效元素个数size_t _capacity; //记录容量,空间总⼤⼩}SeqList;int main(){//要⽤结构体定义⼀个变量,然后将顺序表地址交给指针,⽤指针对顺序表进⾏操作SeqList S1;SeqListInit(&S1);//SeqList *ps = &S1; //和上⾯的效果是⼀样得//SeqListInit(ps);return0;顺序表的主要操作:初始化顺序表、销毁顺序表、检查容量和有效元素个数、尾插尾尾删、头插头删、任意下标插⼊、查找、删除、遍历、更改数据、更改容量等,扩展有在顺序表中进⾏排序、删除重复元素、合并两个或多个顺序表等。
C语言--顺序表
![C语言--顺序表](https://img.taocdn.com/s3/m/efbdb323168884868762d6fa.png)
数据结构C语法讲完了。
语法C语言一套跟计算机交流的语言。
经典的东西:歇后语成语语法都是前面讲过,经过提炼的。
用来处理数据的抽象的方法。
线性表顺序表链表(单链表双向链表)栈和队列树图线性表栈队列线性表:1、顺序表(数组):是存放在连续的存储空间。
2、链表(单链表):单一的存放,使用指针把单一的单元连在一起。
typedef 取别名1、初始化Size = 0;//初始化一个顺序表void SeqListInit(SeqList *L){L->size = 0;}2、插入:把插入的位置之后的数据往后移动,腾出一个空间给新的数据。
//插入数据插入成功返回1 插入失败返回0int SeqListInsert(SeqList *L, int num, int data) //在顺序表L中第num个位置之前插入一个数据data {if (L->size >= MAXSIZE){printf("顺序表已满\n");return 0;}else if (num <= 0 || num > L->size){printf("你输入的num不合法!\n");return 0;}else{for (int i = L->size; i > num; i--) //6ci{L->data[i] = L->data[i - 1]; //size 10 data[0-9] 10}L->data[num] = data;L->size++;return 0;}}3、删除把后面的内容往前移。
int SeqListDelete(SeqList *L, int num) //删除第num个元素{if (L->size <= 0) //NULL L->size 大小NULL 内存{printf("顺序表里面没有数据。
线性表的顺序存储——顺序表
![线性表的顺序存储——顺序表](https://img.taocdn.com/s3/m/f6417a1915791711cc7931b765ce050876327532.png)
线性表的顺序存储——顺序表之前我们讲了线性表, 本篇来阐述下线性表的顺序存储——顺序表定义线性表的顺序存储⼜称为顺序表, 它是⽤⼀组地址连续的存储单元依次存储线性表中的数据元素. 逻辑上相邻的两个数据元素在物理位置上同样相邻.规律顺序表中逻辑顺序与物理顺序相同L = ($a_{1}$, $a_{2}$, ..., $a_{i}$, $a_{i + 1}$, ..., $a_{n}$)其中在逻辑上相邻的两个数据元素,在顺序表中也存放在相同的存储单元当中,每⼀个⼩格⼦就代表⼀个存储单元。
注线性表中的元素的位序是从1开始, ⽽数组中元素下标是从0开始的若线性表存储的起始位置为Loc(A), sizeof(ElemType)为每个数据元素所占⽤的存储空间⼤⼩, 那么根据这⼀特点,我们可以计算出每⼀个数据元素存储的地址。
第⼀个元素的地址是 LOC(A),计算第⼆个元素的地址就可以⽤第⼀个元素的地址加上第⼀个数据元素 $a_{1}$ 所消耗的存储空间,⽤ sizeof 可求得该数据元素所消耗的存储空间⼤⼩。
这⾥需要注意的⼀点是,n 与 MaxSize 是有含义上的不同的,其中 $a_{n}$ 代表的是顺序表中最后⼀个数据元素,⽽ MaxSize 代表的是数组的最后⼀个存储单元。
顺序表的两种实现⽅法顺序表可以⽤数组来实现。
根据数组的两种分配⽅式,也就有两种描述顺序表的⽅法。
分别是静态描述分配顺序表的⽅法和动态描述分配顺序表的⽅法。
⾸先来看数组静态分配时时如何描述⼀个顺序表的。
静态描述分配顺序表#define MaxSize 50typedef struct{ElemType data[MaxSize];int length;}SqList;这就是描述顺序表的语句。
第⼀句是定义了⼀个宏,也就是定义线性表的最⼤长度为 50,同时这也是数组的最⼤容量。
接着定义了⼀个结构体。
结构体就是把多个基本数据类型组合到⼀起构成⼀个新的数据类型。
数位顺序表简单知识点
![数位顺序表简单知识点](https://img.taocdn.com/s3/m/9f2a95760a4c2e3f5727a5e9856a561252d32124.png)
数位顺序表简单知识点数位顺序表是计算机中常用的数据结构之一,用于存储和操作数字。
它按照数位的顺序将数字分解为各个数位,以便进行相应的操作和计算。
本文将介绍数位顺序表的基本概念、应用场景以及相关的操作和算法。
一、数位顺序表的定义和结构数位顺序表是一种线性表,它由一个个数位元素组成,每个数位元素都包含一个数字和一个指针,用来指向下一个数位元素。
数位顺序表的头指针指向第一个数位元素,尾指针指向最后一个数位元素,以便快速定位和操作。
二、数位顺序表的应用场景数位顺序表主要用于处理数字的各个数位,常见的应用场景包括:1. 数字运算:数位顺序表可以方便地进行数字加减乘除、取模和取余等运算,特别适用于大整数的计算。
2. 数字转换:数位顺序表可以将一个数字转换为字符串或字符数组,以便于输出和处理。
3. 数字统计:数位顺序表可以统计一个数字中各个数位的出现次数,或者判断一个数字是否存在重复的数位。
4. 数字排序:数位顺序表可以对一组数字进行排序,根据各个数位的大小进行比较和交换。
三、数位顺序表的基本操作1. 初始化:创建一个空的数位顺序表,并初始化头指针和尾指针。
2. 插入元素:在数位顺序表的尾部插入一个新的数位元素,更新尾指针。
3. 删除元素:删除数位顺序表的尾部元素,更新尾指针。
4. 查找元素:根据指定的位置,查找并返回对应的数位元素。
5. 修改元素:根据指定的位置,修改对应的数位元素的值。
6. 遍历元素:按照顺序依次访问数位顺序表中的每个数位元素。
四、数位顺序表的常用算法1. 数位求和:将两个数位顺序表相同位置的数位元素相加,得到一个新的数位顺序表。
2. 数位比较:比较两个数位顺序表的大小,根据数位元素的大小关系进行比较。
3. 数位排序:将一个数位顺序表中的数位元素按照大小进行排序,可以使用冒泡排序、插入排序或快速排序等算法。
五、数位顺序表的优缺点1. 优点:数位顺序表可以高效地处理数字的各个数位,适用于大整数的计算和处理,具有较高的灵活性和准确性。
数据结构实验顺序表的基本操作
![数据结构实验顺序表的基本操作](https://img.taocdn.com/s3/m/969ef368bc64783e0912a21614791711cc79792f.png)
数据结构实验-顺序表的基本操作顺序表是一种线性数据结构,它的元素在内存中是连续存储的。
顺序表具有随机访问的特点,可以通过下标直接访问元素,因此在访问元素时具有较高的效率。
顺序表的基本操作包括插入、删除、查找等,下面将对这些基本操作进行详细介绍。
1. 初始化:初始化顺序表需要为其分配一定的内存空间,以存储元素。
可以使用静态分配或动态分配两种方式来初始化顺序表。
静态分配是在编译时为顺序表分配固定大小的内存空间,而动态分配是在运行时根据需要动态地为顺序表分配内存空间。
2. 插入操作:插入操作是将一个元素插入到顺序表的指定位置上。
在插入元素之前,需要判断顺序表是否已满,如果已满则需要进行扩容操作。
插入元素时,需要将插入位置以及其后的元素向后移动一位,为插入元素腾出位置。
插入操作的时间复杂度为O(n),其中n为顺序表的长度。
3. 删除操作:删除操作是将顺序表中的一个元素删除。
在删除元素之前,需要判断顺序表是否为空,如果为空则无法进行删除操作。
删除元素时,需要将删除位置后面的元素向前移动一位,覆盖删除位置上的元素。
删除操作的时间复杂度为O(n),其中n为顺序表的长度。
4. 查找操作:查找操作是根据给定的关键字,在顺序表中查找满足条件的元素。
可以使用顺序查找或二分查找两种方式进行查找。
顺序查找是从顺序表的第一个元素开始,逐个比较关键字,直到找到满足条件的元素或遍历完整个顺序表。
二分查找是在有序顺序表中进行查找,每次将待查找区间缩小一半,直到找到满足条件的元素或待查找区间为空。
查找操作的时间复杂度为O(n),其中n为顺序表的长度。
5. 修改操作:修改操作是将顺序表中的一个元素修改为新的值。
修改操作需要先进行查找操作,找到待修改的元素,然后将其值修改为新的值。
修改操作的时间复杂度为O(n),其中n为顺序表的长度。
6. 遍历操作:遍历操作是依次访问顺序表中的每个元素。
可以使用for循环或while循环进行遍历,从第一个元素开始,依次访问每个元素,直到遍历完整个顺序表。
顺序表的应用实验原理
![顺序表的应用实验原理](https://img.taocdn.com/s3/m/d2bc384e854769eae009581b6bd97f192279bfe3.png)
顺序表的应用实验原理1. 实验目的本实验旨在探究顺序表的应用原理,通过实际操作和观察,加深对顺序表的理解,并学习其常见的应用场景。
2. 实验原理2.1 顺序表的定义顺序表是一种线性表,是由相同数据类型的元素组成的有序序列。
在顺序表中,元素之间的关系是按照顺序排列的,每个元素都有一个确定的位置。
2.2 顺序表的实现方式顺序表可以通过数组来实现,每个元素在内存中占据一段连续的存储空间。
通过数组下标,可以直接访问到顺序表中的元素,使得顺序表的操作更加高效。
2.3 顺序表的应用场景顺序表在实际应用中具有广泛的应用场景。
例如,在图书馆管理系统中,图书的存放和查询可以使用顺序表来实现。
在学生成绩管理系统中,学生的成绩排名可以采用顺序表来实现。
3. 实验步骤3.1 创建顺序表首先,要创建一个顺序表,需要确定顺序表的最大长度。
根据最大长度创建一个数组,并设置一个变量来记录当前顺序表的长度。
3.2 插入元素要向顺序表中插入一个元素,需要先判断顺序表是否已满。
如果未满,则在顺序表的末尾插入新元素,并将顺序表的长度加1。
3.3 删除元素要从顺序表中删除一个元素,需要先判断顺序表是否为空。
如果非空,则将顺序表的最后一个元素删除,并将顺序表的长度减1。
3.4 查找元素要查找顺序表中特定的元素,可以遍历整个顺序表,逐个比较元素的值,直到找到目标元素。
3.5 修改元素要修改顺序表中的元素,可以先查找到目标元素的位置,然后直接修改该位置上的元素的值。
3.6 输出顺序表最后,可以通过遍历顺序表,逐个输出元素的值,以便查看顺序表的内容。
4. 实验结果通过以上步骤,我们可以实现一个功能完备的顺序表,并实现对顺序表的插入、删除、查找和修改等操作。
这样,我们可以方便地对一组数据进行操作和管理。
5. 实验总结顺序表是一种简单而常见的数据结构,在实际中有着广泛的应用。
通过本实验,我们更深入地了解了顺序表的应用原理和实现方式,掌握了实现顺序表的基本操作。
数据结构-顺序表
![数据结构-顺序表](https://img.taocdn.com/s3/m/3fce3ea6915f804d2b16c19e.png)
数据结构课堂教学讲义第2讲顺序表重点:顺序表的类型定义与插入和删除操作;难点:插入与删除操作一、线性表的定义与基本操作(10分钟)1. 定义线性表是由n个元素构成的一个有限集。
其中,n为表长,当n=0为空表。
记为,L=(a1,a2,a3,…,a i,…,a n)线性表名称为L、表长为n、空表时n=0、第i个元素为a i,其位序为i。
a i的前驱为a1~a i-1、其后继为a i+1~a n。
a i-1是a i的直接前驱,a i+1是a i的直接后继。
2. 线性表的基本操作(1)initlist(L)(2)getlen(L)(3)locate(L,x)(4)getelem(L,i,e) // 1≤i≤n(5)insert(L,i,x) // 1≤i≤n+1(6)delete(L,i,e) // 1≤i≤n(7)list(L)二、顺序表定义(10分钟)1. 定义、位序与下标的关系顺序表:用顺序存储结构存储的线性表。
位序=下标+12. 顺序表中元素存储地址计算Loc(a i)=Loc(a1)+(i-1)*k其中,k为每个元素所占空间大小(字节数)。
3. 顺序表类型定义#include “stdio.h”#include “stdlib.h”typedef int ElemType;#define INITSIZE 5typedef struct{ ElemType *data; // 顺序表的基地址int length; // 顺序表的长度int listsize; // 顺序表的当前空间大小(字节数)三、顺序表的基本操作与实现(40分钟)1. initlist(L)void initlist(sqlist *L){ L->data=(ElemType *)malloc(sizeof(ElemType)* INITSIZE); L->length=0;L->listsize= INITSIZE;}2. getlen(L)int getlen(sqlist L){ return L.length;}3. getelem(L,i,e)int getelem(sqlist L,int i,ElemType *e){ if(i<1||i>L.length) return 0;*e=L.data[i-1];return 1;}4. locate(L,x)int locate(sqlist L,ElemType x){ int i;for(i=0;i<L.length;i++)if(L.data[i]==x) return i+1;return 0;}5. insert(L,i,x)假设i=3,则插入x后,如下图所示。
数据结构 顺序表
![数据结构 顺序表](https://img.taocdn.com/s3/m/ecdf7e2653d380eb6294dd88d0d233d4b14e3fb8.png)
数据结构顺序表
顺序表是一种物理存储结构,它是用一组地址连续的存储单元存储线性表中的数据元素,结构简单,查找效率低,是一种数据存储形式。
顺序表一般以数组的形式表示,元素从第0个位置开始存储,直到最后一个位置。
二、顺序表的特点
1、在顺序表中,存储的数据元素在物理位置上是连续的;
2、插入和删除操作比较麻烦,需要移动大量的元素;
3、查找操作比较简单,只需要按照顺序查找即可;
4、顺序表所需的存储空间是比较稳定的,除非改变表的长度;
5、顺序表只能在一端进行插入和删除操作,而不能在两端进行插入和删除操作。
三、顺序表的操作
1、查找:顺序表查找操作比较简单,只需要沿顺序表顺序从头到尾依次比较即可。
2、插入:在顺序表中插入元素时,需要在插入位置之后的所有元素都往后移动一个位置,直到表尾,然后将新元素插入。
3、删除:顺序表删除操作也是比较复杂的,需要先将删除位置之后的所有元素都往前移动一个位置,然后再将表尾元素删除。
四、顺序表的应用
顺序表在很多领域中有着广泛的应用,如:
1、顺序表可以用于存储复杂的数据结构,如图的邻接表;
2、顺序表可以用于存储文件,如文本文件,图片文件等;
3、顺序表可以用于实现某些算法,如快速排序和二分查找;
4、顺序表可以用于实现某些操作系统级功能,如进程管理、内存分配和管理等。
ch2 顺序表及其应用
![ch2 顺序表及其应用](https://img.taocdn.com/s3/m/aa45b240767f5acfa1c7cd67.png)
♣ 顺序表的运算集合
(6)插入SqLinsert (L , i ,x)
在顺序表L中的第i位置插入值为x的数据元素, 表长由n变为n+1。 (7)删除 SqLdelete (L , i ) 在顺序表L中删除第i个元素,表长由n变为n-1。
2.1 顺序表的基本概念
2.1.1 顺序表的定义 2.1.2 顺序表的数据结构分析
( a1 a2 a3
… ai-1 ai a i+1
…
an )
♣ 顺序表的存储结构
☞ 数据元素ai-1、ai在存储器中占用相邻的物理 存储区域 ☞ 若每个数据元素占用x个存储单元, 则数据 元素ai 与ai-1所占存储空间首地址间的关系满足:
Loc(ai)= Loc (ai-1) +x
☞ 顺序表数据元素ai的的存储位置与数据元素 a1的存储地址(顺序表的首地址)间的关系为: Loc(ai)= Loc (a1) +(i-1)*x ☞ 是一种顺序存储结构
第2章 顺序表及其应用
☞ 2.1 顺序表的基本概念 2.2 顺序表的基本运算实现 2.3 顺序表的基本运算性能分析 2.4 顺序表的应用1——查找问题 2.5 顺序表的应用2——排序问题 2.6 顺序表的应用3——字符处理问题
2.1 顺序表的基本概念
☞ 2.1.1 顺序表的定义 2.1.2 顺序表的数据结构分析 2.1.3 顺序表的数据类型描述
7、删除运算
SqLdelete (L , i )
a1 a2
ai-1 ai ai+1
an
操作: (1) ai+1 ~an 依次前移
(2)st =st -1
数组下标
内存 元素序号 a1 a2 1 2
顺序表的基本操作(5篇)
![顺序表的基本操作(5篇)](https://img.taocdn.com/s3/m/a9e02eee51e2524de518964bcf84b9d529ea2c62.png)
顺序表的基本操作(5篇)第一篇:顺序表的基本操作*********************************** 实验题目:顺序表的基本操作班级:姓名:学号:专业:实验完成的时间:*********************************一、实验目的(1)(2)(3)(4)掌握顺序表的基本运算,熟悉对顺序表的一些基本操作和具体函数的定义。
掌握顺序表的存储结构及其基本操作。
熟悉c语言程序的基本结构,掌握函数定义、调用等功能。
熟悉c语言环境的使用及程序的输入、编辑、调试和运行的全过程。
二、实验要求(1)熟练掌握线性表的存储结构及其基本操作。
(2)理解所给出的算法,掌握顺序表在实际中的应用。
(3)将上机程序调试通过,并能独立完成一至两个拓展题目。
三、实验内容实现顺序表上的插入、删除等操作。
调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。
加深对有关算法的理解。
(1)主要内容:#define MAXSIZE 100 /*宏定义*/ //#define OVERFLOW-2 #include “stdio.h” /*包含输入输出文件*/typedef int data;typedef struct /*定义顺序表的结构*/ {data vec[MAXSIZE];/*顺序表数据成员所占据的存储空间*/ int last;/*顺序表中最后一个元素在数组中的下标(或向量中的位置)从0开始*/ }sequenlist;int insert(L,i,x)/*在顺序表的第i个元素之前插入一个新元素x*/ sequenlist *L;int i;data x;{ int j;if(((*L).last)>=MAXSIZE-1){printf(“the list is overflow!n”);return(0);/*溢出判断*/ } else if((i<1)||(i>(*L).last+1)){printf(“position is not correct!n”);return(0);/*插入位置不正确*/ } else {for(j=(*L).last;j>=i-1;j--)/*后移元素*/(*L).vec[j+1]=(*L).vec[j];(*L).vec[i-1]=x;/*插入新元素*/(*L).last=(*L).last+1;/*修改last的值*/ } return(1);} void DELETET(L,i)sequenlist *L;int i;{ int j;if(i<1||(i>L->last+2)) printf(“删除的位置错误n”);else {for(j=i;j<=(*L).last;j++)(*L).vec[j-1]=(*L).vec[j];(*L).last--;} } void listprint(sequenlist *L)/*输出线性表*/ { int i;for(i=0;i<=(*L).last;i++)printf(“i,e=%d,%dn”,i,L->vec[i]);} main(){ sequenlist sl={{1,2,3,4,5,6,7,8,9,10},9};//直接给顺序表赋初值sequenlist *L;/*定义一个指向顺序表类型的指针变量*/ int i,j,x;//elemtype e;L=&sl;/*给指针变量赋值*/ printf(“请输入你插入的位置和数n”);scanf(“%d,%d”,&i,&x);printf(“这个插入的位置: %d n插入的数:%dn”,i,x);insert(L,i,x);listprint(L);printf(“请输入删除的位置:”);scanf(“%d”,&j);DELETET(L,j);listprint(L);}(2)预习思考题(1)定义一个定位函数locate(L,x),具有元素检索的功能。
数据结构实例精讲:顺序表
![数据结构实例精讲:顺序表](https://img.taocdn.com/s3/m/f1974eaedd88d0d233d46ab3.png)
数据结构实例精讲:顺序表2.1 顺序表的定义和基本运算实现用一片连续的存储单元依次存储线性表中的各个数据元素,这种存储结构称为线性表的顺序存储结构,顺序存储结构的线性表又称为顺序表。
在顺序表的存储结构中,假设每个元素在存储器中需占用k个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置,则顺序表中第i+1个数据元素的存储位置LOC(a i+1)和第i个数据元素的存储位置LOC(a i)之间满足下列关系:LOC(a i+1)= LOC(a i)+ k若顺序表的第一个数据元素a0的存储位置为LOC(a0),通常称做顺序表的起始位置或基地址,则顺序表的第i个数据元素a i的存储位置为:LOC(a i)= LOC(a0)+i*k显然,顺序表中每个元素的存储地址是该元素在表中序号的线性函数。
只要知道某个元素在顺序表中的序号,就可以确定其在内存中的存储位置。
所以说,顺序表的存储结构是一种随机存取结构。
顺序表的存储结构可以用高级程序设计语言中的一维数组来表示。
设Elemtype表示抽象的数据元素类型,我们可以定义顺序表如下:#define MAXNUM; // 顺序表最大元素个数typedef struct {Elemtype elem [MAXNUM];int length;// 顺序表的当前长度} SqList ;由于线性表的长度可变,且所需最大存储空间随问题不同而不同,因此,在C语言中可用动态分配的一维数组。
即线性表的动态分配顺序存储结构定义为:#define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量#define LISTINCREMENT 10 // 线性表存储空间的分配增量typedef struct{ElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeif(ElemType)为单位)} SqList;【实例2-1】顺序表的基本运算实现。
顺序表
![顺序表](https://img.taocdn.com/s3/m/4ae12809eff9aef8941e06e0.png)
顺序表1.顺序表的定义(1) 顺序存储方法即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。
(2) 顺序表(Sequential List)用顺序存储方法存储的线性表简称为顺序表(Sequential List)。
2.结点ai 的存储地址不失一般性,设线性表中所有结点的类型相同,则每个结点所占用存储空间大小亦相同。
假设表中每个结点占用c个存储单元,其中第一个单元的存储地址则是该结点的存储地址,并设表中开始结点a1的存储地址(简称为基地址)是LOC(a1),那么结点ai的存储地址LOC(ai)可通过下式计算:LOC(ai)= LOC(a1)+(i-1)*c 1≤i≤n注意:在顺序表中,每个结点ai的存储地址是该结点在表中的位置i的线性函数。
只要知道基地址和每个结点的大小,就可在相同时间内求出任一结点的存储地址。
是一种随机存取结构。
3.顺序表类型定义#define ListSize 100 //表空间的大小可根据实际需要而定,这里假设为100typedef int DataType; //DataType的类型可根据实际情况而定,这里假设为inttypedef struct {DataType data[ListSize];//向量data用于存放表结点int length;//当前的表长度}SeqList;注意:①用向量这种顺序存储的数组类型存储线性表的元素外,顺序表还应该用一个变量来表示线性表的长度属性,因此用结构类型来定义顺序表类型。
②存放线性表结点的向量空间的大小ListSize应仔细选值,使其既能满足表结点的数目动态增加的需求,又不致于预先定义过大而浪费存储空间。
③由于C语言中向量的下标从0开始,所以若L是SeqList类型的顺序表,则线性表的开始结点a1和终端结点an分别存储在L.data[0]和L.Data[L.length-1]中。
④若L是SeqList类型的指针变量,则a1和an分别存储在L->data[0]和L->data[L->length-1]中。
顺序表——精选推荐
![顺序表——精选推荐](https://img.taocdn.com/s3/m/9fb1d42886c24028915f804d2b160b4e767f8116.png)
顺序表1.顺序表的定义顺序表是线性表的顺序表⽰,即⽤⼀组地址连续的存储单元依次存储线性表的数据元素。
2.顺序表的存储结构为了使顺序表的空间分配尽可能不受限制,这⾥先让顺序表的初始化容量为8,当空间不⾜时再对容量进⾏扩展,每次容量的增量为3。
#define SEQLIST_INIT_SIZE 8 //初始化⼤⼩#define INC_SIZE 3 //空间的增量typedef int ElemType; //元素类型typedef struct SeqList{ElemType *base; //指向顺序表开辟的基准空间int capacity; //容量int size; //表的长度(⼤⼩)}SeqList;3.顺序表的常⽤操作1.初始化//顺序表的初始化void InitSeqList(SeqList *list){list->base = (ElemType *)malloc(sizeof(ElemType) * SEQLIST_INIT_SIZE);assert(list->base != NULL);list->capacity = SEQLIST_INIT_SIZE;list->size = 0;}2.容量扩展//空间不⾜,重新开辟bool Inc(SeqList *list){ElemType *newbase = (ElemType*)realloc(list->base,sizeof(ElemType)*(list->capacity+INC_SIZE));//空间开辟是否失败?if(newbase == NULL){printf("增配空间失败,内存不⾜.\n");return false;}list->base = newbase;list->capacity += INC_SIZE;return true;}3.尾插//在顺序表尾部插⼊数据void push_back(SeqList *list, ElemType x){//判断顺序表空间是否满且增加空间是否失败?if(list->size >= list->capacity && !Inc(list)){printf("顺序表空间已满,%d不能尾部插⼊数据.\n",x);return;}//数据尾插list->base[list->size] = x; //size的⼤⼩就是尾部插⼊时数组的下标list->size++;}4.头插//在顺序表头部插⼊数据printf("顺序表空间已满,%d不能头部插⼊数据.\n",x);return;}//将顺序表数据后移for(int i=list->size; i>0; --i){list->base[i] = list->base[i-1];}//数据头插list->base[0] = x;list->size++;}5.存储数据显⽰//显⽰顺序表内的数据void show_list(SeqList *list){for(int i=0; i<list->size; ++i){printf("%d ",list->base[i]);}printf("\n");}6.尾删//删除顺序表尾部数据void pop_back(SeqList *list){//判断顺序表是否为空?if(list->size == 0){printf("顺序表已空,不能尾部删除数据.\n");return;}//将size值减1,来达到删除的⽬的list->size--;}7.头删//删除顺序表头部数据void pop_front(SeqList *list){//判断表是否为空?if(list->size == 0){printf("顺序表已空,不能尾部删除数据.\n");return;}//将顺序表中的数据前移⼀位(第⼀个数据除外)for(int i=0; i<list->size-1; ++i){list->base[i] = list->base[i+1];}//将size值减1,来达到删除的⽬的list->size--;}8.按位置插⼊数据//按位置插⼊数据void insert_pos(SeqList *list, int pos, ElemType x){//判断位置是否合法?if(pos<0 || pos>list->size)//判断顺序表空间是否满且增加空间是否失败?if(list->size >= list->capacity && !Inc(list)){printf("顺序表空间已满,%d不能按位置插⼊数据.\n",x);return;}//将该位置及其之后的数据都向后移动⼀位for(int i=list->size; i>pos; --i){list->base[i] = list->base[i-1];}//将数据插⼊list->base[pos] = x;list->size++;}9.查找数据假定顺序表内的数据唯⼀。
顺序表存储位置计算
![顺序表存储位置计算](https://img.taocdn.com/s3/m/d6881cc99f3143323968011ca300a6c30d22f169.png)
顺序表存储位置计算【原创版】目录1.顺序表的定义与特点2.顺序表的存储位置计算方法3.顺序表存储位置计算的实例解析4.顺序表存储位置计算的优缺点分析正文一、顺序表的定义与特点顺序表是一种常见的数据结构,用于存储一系列有序的数据元素。
它按照数据元素的大小顺序进行排列,支持快速的插入和删除操作。
顺序表的特点是数据元素之间存在紧密的联系,数据元素的顺序不可随意改变。
二、顺序表的存储位置计算方法在计算顺序表的存储位置时,通常需要考虑以下几个因素:1.数据元素的大小:数据元素越大,所需的存储空间越多。
2.数据元素的个数:数据元素的个数越多,所需的存储空间越大。
3.存储设备的容量:存储设备的容量决定了顺序表能够存储的最大位置。
根据以上因素,可以采用以下方法计算顺序表的存储位置:1.确定数据元素的大小和个数,从而确定所需的总存储空间。
2.检查存储设备的容量,确保其大于或等于所需的总存储空间。
3.根据存储设备的容量和数据元素的大小,计算顺序表的存储位置。
三、顺序表存储位置计算的实例解析假设有一个顺序表,其中包含 10 个整数,整数的范围为 1~100。
现在需要计算该顺序表的存储位置。
1.确定数据元素的大小和个数:整数的范围为 1~100,所需的总存储空间为 1000。
2.检查存储设备的容量:假设存储设备的容量为 1024,大于所需的总存储空间。
3.计算顺序表的存储位置:根据存储设备的容量和整数的大小,可以计算出顺序表的起始地址为 0,结束地址为 999。
四、顺序表存储位置计算的优缺点分析顺序表存储位置计算的优点:1.简单易懂:计算方法简单,容易理解和实现。
2.支持快速插入和删除:顺序表支持快速的插入和删除操作,适用于频繁进行插入和删除操作的场景。
顺序表存储位置计算的缺点:1.空间浪费:顺序表需要预先分配一定大小的连续空间,可能会造成空间浪费。
2.插入和删除操作受限:在顺序表中,插入和删除操作只能在表头和表尾进行,操作效率较低。
详解C语言之顺序表
![详解C语言之顺序表](https://img.taocdn.com/s3/m/89253cadf021dd36a32d7375a417866fb84ac045.png)
详解C语⾔之顺序表⽬录⼀、思维导图⼆、步骤1.初始化2.求表长3.插⼊数据元素4.删除数据元素5.取出数据元素按位查找按位查找所有代码总结⼀、思维导图⼆、步骤1.初始化代码如下:void ListInit(SeqList *L){L->size = 0;}2.求表长代码如下:int ListLength(SeqList L){return L.size;}3.插⼊数据元素代码如下:int ListInsert(SeqList *L, int i, DataType x){int j;if (L->size >= MaxSize){printf("顺序表已满,插⼊失败\n");return 0;}else if (i<0 || i>L->size){printf("参数i不合法,插⼊失败\n");return 0;}else{for (j = L->size; j > i; j--)L->list[j] = L->list[j - 1];L->list[i] = x;L->size++;return 1;}}4.删除数据元素代码如下:int ListInsert(SeqList *L, int i, DataType x){int j;if (L->size >= MaxSize){printf("顺序表已满,插⼊失败\n");return 0;}else if (i<0 || i>L->size){printf("参数i不合法,插⼊失败\n");return 0;}else{for (j = L->size; j > i; j--)L->list[j] = L->list[j - 1];L->list[i] = x;L->size++;return 1;}}5.取出数据元素按位查找代码如下:int ListGet(SeqList L, int i, DataType *x){if (L.size <= 0){printf("顺序表已空,取出元素失败\n");return 0;}else if (i < 0 || i >= L.size){printf("参数i不合法,取出元素失败\n");return 0;}else{*x = L.list[i];return 1;}}按位查找代码如下:int ListGetZ(SeqList L, DataType x, int *i){int j;for (j = 0; j < ListLength(L); j++){if (L.list[j] == x){*i = j;return 1;}}return 0;}所有代码#include <stdio.h>#define MaxSize 1024 //数组能存储的最⼤最⼤元素个数typedef int DataType; //存储数据元素的数据类型typedef struct{DataType list[MaxSize];int size; //当前存储的数据元素个数}SeqList;//初始化void ListInit(SeqList *L){L->size = 0;}//求表长int ListLength(SeqList L){return L.size;}//插⼊数据元素int ListInsert(SeqList *L, int i, DataType x){int j;if (L->size >= MaxSize){printf("顺序表已满,插⼊失败\n");return 0;}else if (i<0 || i>L->size){printf("参数i不合法,插⼊失败\n");return 0;}else{for (j = L->size; j > i; j--)L->list[j] = L->list[j - 1];L->list[i] = x;L->size++;return 1;}}//删除数据元素int ListDelete(SeqList *L, int i, DataType *x){int j;if (L->size <= 0){printf("顺序表已空,删除失败\n");return 0;}else if (i < 0 || i >= L->size){printf("参数i不合法,删除失败\n");return 0;}else{*x = L->list[i];for (j = i; j < L->size - 1; j++)L->list[j] = L->list[j + 1];L->size--;return 1;}}//取出数据元素//按位查找void ListGet(SeqList L, int i, DataType *x){if (L.size <= 0){printf("顺序表已空,取出元素失败\n");return 0;}else if (i < 0 || i >= L.size){printf("参数i不合法,取出元素失败\n");return 0;}else{*x = L.list[i];return 1;}}//安值查找int ListGetZ(SeqList L, DataType x, int *i){int j;for (j = 0; j < ListLength(L); j++){if (L.list[j] == x){*i = j;return 1;}}return 0;}int main(){SeqList L;int i, x;ListInit(&L);for (i = 0; i < 10; i++)ListInsert(&L, i, i + 10);ListDelete(&L, 4, &x);for (i = 0; i < ListLength(L); i++){ListGet(L, i, &x);printf("%d ", x);}system("pause");return 0;}总结本篇⽂章就到这⾥了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!。
利用顺序表实现存取、遍历和查找方法
![利用顺序表实现存取、遍历和查找方法](https://img.taocdn.com/s3/m/32ab37774531b90d6c85ec3a87c24028905f8549.png)
利用顺序表实现存取、遍历和查找方法顺序表啊,就像是一列排得整整齐齐的小火车,每个车厢都有自己的位置,里面装着各种各样的数据。
这顺序表可真是个好东西,它能让我们很方便地实现存取、遍历和查找的操作呢。
先说说这存取吧。
这就好比你在小火车上放东西或者拿东西。
顺序表有它固定的结构,每个元素都按照顺序排在那里。
比如说你要存一个数字5进去,那就得按照顺序表的规则来,找到合适的位置放进去。
这就像是在小火车上找到一个空车厢,然后把你的货物(数据)放进去。
取出来也类似呀,你知道这个数据在哪个位置,就像你知道货物在哪个车厢,然后直接去拿就好啦。
这过程说起来简单,可也得小心呢。
要是不按照顺序表的规则来,就像是你在小火车上乱塞东西,到时候找起来可就麻烦啦。
再讲讲遍历。
遍历就像是你沿着小火车一节车厢一节车厢地检查货物。
从顺序表的第一个元素开始,一个一个地看过去,直到最后一个元素。
这就像是你要检查小火车上每个车厢里装的是什么东西一样。
你可以对每个元素做一些操作,比如说看看这个数字是不是你想要的,或者对这个数字进行一些计算之类的。
这就好比你检查车厢的时候,看到货物如果是水果,你可以看看有没有坏的,要是数字的话,你可以看看是不是大于10之类的。
这个过程可有趣啦,就像你在探寻小火车里的小秘密一样。
最后就是查找啦。
查找就像是你在小火车里找特定的货物。
比如说你要找一个写着“苹果”的箱子,你就得沿着小火车一个车厢一个车厢地找。
在顺序表中查找某个特定的值也是这样。
你可以从开头开始,一个一个元素地对比,看看是不是你要找的那个。
这有点像捉迷藏,你要在小火车的各个车厢里把你要找的那个“小朋友”(数据)找出来。
不过呢,要是小火车很长很长,一个一个找就有点费时间啦。
这时候就可以想一些更聪明的办法,比如说如果这小火车里的货物是按照一定顺序摆放的,像数字是从小到大排列的,那你就可以根据这个规律来更快地找到你要的东西,就像你知道苹果箱子在前面几节车厢,就不用从最后面开始找啦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
k = m+n-1; //k为结果线性表的工作指针(下标) i = m-1; j = n-1; //i,j分别为LA和LB的工作指针(下标) while (i>=0 && j>=0) { if (LA.elem[i] >= LB.elem[j]) LA.elem[k- -] = LA.elem [ i- -]; else LA.elem[k- -] = LB.elem[j- -]; } while (j >= 0) LA.elem[k- -] = LB.elem[j- -]; LA.length = m+n;
2018/10/15
13
数据结构
[题目分析] 在顺序存储的线性表上删除元素, 通常要涉及到一系列元素的移动(删第i个 元素,第i+1至第n个元素要依次前移)。本 题要求删除线性表中所有值为item的数据元 素,并未要求元素间的相对位置不变。因此 可以考虑设头尾两个指针(i=0,j=n-1), 从两端向中间移动,凡遇到值item的数据元 素时,直接将右端元素左移至值为item的数 据元素位置。
2018/10/15
6
数据结构
[算法讨论] 算法中循环控制变量的初值和终 值是关键。数组从下标0开始,第n个元素的 下标是n-1。因为首尾对称交换,所以控制 变量的终值是线性表长度的一半。当n为偶 数,“一半”恰好是线性表长度的二分之一; 若n是奇数,“一半”是小于n/2的最大整数, 这时取大于1/2的最小整数的位置上的元素, 恰是线性表中间位置的元素,不需要逆置
数据结构
第二章 线性表
顺序表的简单应用
2018/10/15
滨州学院信息工程系
1
数据结构
复习
#define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 typedef struct { ElemType *elem; int int } SqList; // 顺序表
2018/10/15
//存放线性表的数组空间基地址 length; // 当前长度 listsize; // 当前分配的容量
2
数据结构
顺序表的应用实例
例1 顺序结构线性表LA与LB的结点关键字 为整数。LA与LB的元素按非递减有序,线 性表空间足够大。 试用类C语言给出一种高效算法,将LB 中元素合到LA中,使新的LA的元素仍保持 非递减有序。高效指最大限度的避免移动元 素。
2018/10/15 3
void Union(SqList &LA , SqList LB) 数据结构 {// LA和LB是顺序存储的线性表,元素按非递减有序排列,本算 //法将LB合并到LA中,元素仍非递减有序。
m = LA.length; n = LB.length;
//m,n分别为线性表LA和LB的长度
2018/10/15 9
数据结构
例4 已知线性表(a1 a2 a3 …an)按顺 序存于内存,每个元素都是整数,试 设计用最少时间把所有值为负数的元 素移到全部正数值元素前边的算法: 例:(x,-x,-x,x,x,-x …x)变为(-x,-x,x…x,x,x)。
2018/10/15
10
数据结构
[题目分析]可采用快速排序的思想来实现,只是提出暂存的第一个元素(枢轴)并不 作为以后的比较标准,比较的标准是元素是否为负数,即与0比较。
数据结构
[算法讨论] 本算法时间复杂度为O(n)。算法只是按 题目要求把正负数分开,题目并未提及零的 问题,将零放到了正数一边。对此问题的扩 充是若元素包含正数、负数和零,并要求按 负数、零、正数的顺序重排线性表,统计负 数、零、正数的个数。
20度为n的线性表A采用顺序存储 结构,请写一时间复杂度为O(n)、空间复 杂度为O(1)的算法,该算法删除线性表中 所有值为item的数据元素。(O(1)表示算 法的辅助空间为常量)。 【北京航空航天大学 2000 五(10分)】
2018/10/15
7
数据结构
例3 已知顺序表L,每个元素都是互不
相等的整数,将所有奇数移动到所有 偶数前面。要求时间最少,辅助空间 最少。
2018/10/15
8
void move(SqList &L) 数据结构 { //将顺序表L中的所有奇数移动到偶数的前面 i = 0; j = L.length-1; while(i <= j) { //从前向后查询偶数 while( L.elem[i]%2 == 1) i++; //从后向前查询奇数 while( L.elem[j]%2 == 0) j--; if ( i < j ) { L.elem[i] <―> L.elem[j]; i++; j--; } } }
int Rearrange(int a[], int n) {∥a是具有n个元素的数组,线性表的元素是整数。本算法重排顺序表a,
//所有值为负数的元素移到所有值为正数的数的前面。
i = 0; j = n-1; ∥ i, j 初始值为a的第1个和第n个元素下标 t = a[0]; ∥暂存枢轴元素。 while( i<j ) { while( i<j && a[j]>=0) j--; ∥ 若当前元素为大于等于零,则指针前移。 if( i<j ) a[i++] = a[j]; ∥ 找到负数将其前移。 while(i<j &&a[i]<0) i++; ∥ 当前元素为负数时指针后移。 if( i<j ) a[j--] = a[i]; ∥ 找到正数将其后移。 } a[i] = t; ∥将原第一元素放到最终位置。 } 2018/10/15 11
}
2018/10/15 4
数据结构
例2 请写一个算法将顺序存储结构的 线性表(a1...an)逆置为(an...a1)
2018/10/15
5
数据结构
顺序存储结构的线性表的逆置,只需一个变量辅助空间。 算法核心是选择循环控制变量的初值和终值。 void SeqInvert(SqList &A) {∥A是顺序存储的线性表,本算法将其逆置。 for(i = 0;i <= A.length/2-1;i++) { t = A.elem[i]; A.elem[i] = A.elem[A.length-1-i]; A.elem[A.length-1-i] = t; } }