顺序表

顺序表的实现

。_饼干妹妹 提交于 2020-03-10 06:46:25
顺序表 概念及结构 : 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下,采用数组存储,在数组上完成数据的增删查改。 顺序表一般可以分为 : 静态顺序表 :使用定长数组存储 动态顺序表 :使用动态开辟的数组存储 静态顺序表适用于确定知道需要存放多少数据的场景。 静态顺序表的定长数组导致N定大了,空间开辟多了就会浪费, 开少了又不够用。 相比之下,动态顺序表更加灵活,根据需要动态的分配空间大小。 动态顺序表源代码如下: public class SeqList { private int [ ] datas = new int [ 100 ] ; private int size = 0 ; // size 这个成员只能提供 get 方法, 不能提供 set // size 是通过后面是增删方法来进行维护的. public int getSize ( ) { return size ; } //打印顺序表 public void display ( ) { String result = "[" ; for ( int i = 0 ; i < size ; i ++ ) { result += datas [ i ] ; if ( i < size - 1 ) { result += "," ; } } result += "]" ; System .

C++顺序表折半查找

自古美人都是妖i 提交于 2020-03-10 06:28:47
算法思想 折半查找:又称二分查找,适用于有序的顺序表。 先将中间位置元素与Key进行比较 若相等,则返回中间位置下标 若不相等: ① key<中间值,在左半边继续查找 ② key>中间值,在右半边继续查找 算法实现 int BinarySearch ( sqList L , int key ) { int low = 0 , high = L . length - 1 ; while ( low <= high ) //'<='很关键 { int mid = ( low + high ) / 2 ; if ( L . data [ mid ] == key ) return mid + 1 ; else if ( key < L . data [ mid ] ) high = mid - 1 ; else low = mid + 1 ; } return - 1 ; } 运行代码 # include "stdafx.h" # include <iostream> using namespace std ; # define MaxSize 50 typedef struct { int data [ MaxSize ] ; int length ; } sqList ; void Creat ( sqList & L ) ; int Search ( sqList L , int

线性表——链接表(2-4)

情到浓时终转凉″ 提交于 2020-03-10 05:29:09
顺序表结构(技术)是组织一组元素的最重要方式,它可以直接地实现线性表也是许多其他数据结构的实现基础采用顺序表结构实现线性表,重要问题是加入1删除等操作的效率这类操作改变表中元素序列的结构,是典型的变动操作由于元素在存储区里连续排列。加入/删除操作需要移动(可能很多的)元素,操作代价高。表结构不够灵活,不容易调整和变化。如果一个表在使用中经常需要修改结构,用顺序表实现就不很方便,操作代价可能很高,根源在于元素存储的集中方式和连续性如果程序里需要巨大的线性表,采用顺序表实现。就需要很大块的连续存储空间,这也可能造成存储管理方面的困难。 链接表实现的基本需要: 能够找到表中的首元素(无论直接或间接,通常很容易做到)。 从表里的任一个元素出发,可以找到它之后的下一个元素,显然,把表元素保存在连续的存储区里,自然满足这两个需求,顺序关联是隐含的。但满足这两种需求,并不一定要连续存储元素。实现线性表的另一方式是基于链接结构,用链接显式地表示元素之间的顺序关联。基于链接技术实现的线性表称为链接表或链表实现链接表的基本想法:把表元素分别存储在一批独立的存储块(称为结点)里。保证从一个元素的结点可找到与其相关的下一个元素的结点。在结点里用链接的方式显式记录元素(结点)之间的关联,这样只要知道表中第一个结点, 就能顺序找到表里其他元素。 来源: CSDN 作者: 想飞的蓝笨笨 链接: https:/

DS博客作业02-线性表

一曲冷凌霜 提交于 2020-03-08 23:22:33
0.PTA得分截图 1.本周学习总结 1.1 总结线性表内容 什么是线性表? 定义: 线性表是具有相同特性的数据元素的一个有限序列。 线性表一般表示: (a1,a2,a3...ai..an) 这里a1为表头元素,an为表尾元素。 线性表特征: 1.元素个数n——表长度; n=0——空表 2.1<i<n时 a[i]的直接前驱是a[i-1],a[1]无直接前驱 a[i]的直接后继是a[i+1], a[n]无直接后继 3.元素同构,且不能出现缺项 线性表的抽象数据类型描述 ADT List { 数据对象D={ai|ai∈Elemset, i=1,2, . n, n≥0} 数据关系: R={<ai-1, ai>|ai-1,ai∈D, i=2, .., n} 基本操作: InitList (&L) :构造一个空的线性表L DestroyList (&L) :销毁线性表L占用内存空间 ListEmpty(L):若线性表L为空表,则返回TRUE,否则返回FALSE ListLenght(L):返回线性表L数据元素个数 GetElem(L, i, &e):用e返回线性表L中第i个数据元素的值 LocatElem(L,e):返回L中第一个值域与e相等的逻辑位序。若这样的元素不存在,则返回值为0。 ListInsert(&L, i,e) : ListDelete(&L, i, &e) : } /

DS博客作业01——线性表

随声附和 提交于 2020-03-08 22:02:45
0.PTA得分截图 1.本周学习总结 1.1 总结线性表内容 顺序表结构体定义 typedef int ElemType; typedef struct { ElemType data[MaxSize]; //存放顺序表元素 int length ; //存放顺序表的长度 } List; typedef List *SqList; 顺序表插入 void InsertSq(SqList& L, int x) { int i; for (i = L->length; i > 0; i--) { if (L->data[i - 1] > x) L->data[i] = L->data[i - 1]; else { L->data[i] = x; break; } } if (i == 0) { L->data[0] = x; } L->length++; } 在知道顺序表长度的条件下,从后往前重构顺序表,直至插入位置。 顺序表删除 void DelSameNode(List& L) { int i, j=0,k=0; static int h[100]; for (i = 0; i < L->length; i++) { if (h[L->data[i]] == 0) { h[L->data[i]]++; L->data[j++] = L->data[i]; } else { k++;

DS博客作业01-线性表

白昼怎懂夜的黑 提交于 2020-03-08 19:50:40
0.PTA得分截图 1.1 线性表学习总结 1.线性表的基本概念 线性表是一个具有n个相同特性的有限序列,所有元素都属于同一种数据类型。线性表的逻辑结构简单,便于实现和操作,运用范围广泛。按照存储方式可以分为:顺序表和链表。 2.顺序表 将数据依次存储在连续的整块物理空间中,各结点间的存储单元地址是连续的。 结构体定义 typedef struct node{ ElemType data[MAX]; int length;//保存线性表的长度,或者也可以定义int型变量last用于保存线性表中最后一个数据所在的位置下标。 }Node,*NodeList; 基本操作 顺序表的插入 :实质上就是移动数组的操作,可以从头开始遍历,找到插入的位置后,开始移动数组,或者从末尾开始边移动数组边比较,找到插入的位置后,直接插入; 伪代码: void InserList(NODE & list,int x) { 判断顺序表是否满了,如果满了就return for i=list.length to 0 //从末尾开始一个一个把数据右移,直到找到x的插入位置停止。 if x>list.data[i-1] //找到插入位置,退出循环; break; else list.data[i]=list.data[i-1];//数据进行右移; end if end for list.length++;/

第一次博客作业——线性表

匆匆过客 提交于 2020-03-08 19:46:53
0.PTA得分截图 1.本周学习总结 1.1 总结线性表内容 * 一.顺序表: 顺序表存储结构:把线性表中的所有元素按照顺序存储方式进行存储的结构成为顺序表。 顺序存储的优缺点: 优点: 1.逻辑相邻,物理相邻 2.无须为表示表中元素之间的顺序关系增加额外的存储空间 3.可随机存取任一元素 4.存储空间使用紧凑 缺点: 1.插入、删除操作需要移动大量的元素(除操作在表尾的位置进行外) 2.预先分配空间需按最大空间分配,利用不充分 3.表容量难以扩充 顺序表的特点:1.实现数据元素逻辑上相邻即物理地址相邻; 2.可以实现数据元素的随机存取;(以数组的形式存储) 图示如下: 顺序表的结构体定义: 栈区例子: typedef int ElemType; typedef struct { ElemType data[MaxSize]; //存放顺序表元素 int length ; //存放顺序表的长度 } List; typedef List *SqList; 堆区例子: * 顺序表基本操作 顺序表的初始化:(创建一个新链表) void CreateList(SqList& L, int n) { int index = 0; //初始化顺序表 L = new List; L->length = n; //给表中数据元素赋值 while (n--) cin >> L->data[index

DS博客作业02--线性表

好久不见. 提交于 2020-03-08 19:05:04
0.PTA得分截图 1.本周学习总结 1.1 总结线性表内容 1.顺序表结构体定义、顺序表插入、删除的代码操作 顺序表的定义: 线性表的顺序存储又称为顺序表。 它用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。 第 1 个元素存储在线性表的起始位置,第 i 个元素的存储位置后面紧接着存储的是第 i+1 个元素。 因此,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。 顺序表结构体的定义:typedef int ElemType即是定义数据元素类型,可以适应更多类型; typedef struct的内容就是定义了定义顺序表类型,只是定义了一个类型,而不是变量; 顺序表结构的定义,对于在代码的后续操作起着关键性作用,所以在结构体的定义中要仔细。 顺序表插入、删除的代码操作:顺序表的插入和删除操作,在顺序表开始寻找到相对性的数值, 就开始执行操作。删除操作针对于区间删除来说,先从第一个for循环开始执行,定义三个变量, 找到重复元素就开始删除操作。顺序表的插入删除都是要遍历链表,找到相对应的元素进行操作。 2.链表结构体定义、头插法、尾插法、链表插入、删除操作 链表结构体的定义:对于单链表而言,先定义的一个结构体用来描述单链表的结点。从这个结构 定义中,我们知道,结点由存放数据元素的数据域存放后继结点地址的指针域组成

顺序表的应用示例

不羁岁月 提交于 2020-03-08 18:47:26
学习完最基本的线性表操作,我们开始学习运用这些强大的操作。一开始,大家可能很不习惯使用这些操作,但还是那句话,熟能生巧。只要你肯下功夫,什么都是手到擒来,代码都能变成金块。 我们今天来讲一下这道例题: 假设有两个集合A和B(元素都按非递减有序排列),分别用两个线性表La和Lb表示。利用线性表的基本运算设计一个算法求一个新的集合C,将两个集合的并集放在线性表Lc中,Lc仍按非递减有序排列。 大家有什么奇思妙想?先自己想一想,写一写,画一画。 想好了吗?下面贴我的代码: SqList* UnionList(SqList La,SqList Lb,SqList* Lc){ //函数的返回值是一个指向SqList结构体类型的指针。 //形式参数包括两个待合并的有序顺序表La和Lb和一个指向未初始化的顺序表的指针Lc,该顺序表用于存放合并后的顺序表。 int i=1,j=1,k=0; //i和j分别表示顺序表La和Lb中元素的逻辑位置。 //k用来表实顺序表Lc中元素的逻辑位置。 Lc=InitList(Lc);//初始化顺序表Lc。 int ai,bj;//分别用来带出La和Lb顺序表中找到的元素。 while(i<=ListLength(&La)&&j<=ListLength(&Lb)){ //当i尚小于等于顺序表La的长度且j尚小于等于顺序表Lb的长度时,即两个顺序表都没有遍历完成时

《线性表的一些总结》

非 Y 不嫁゛ 提交于 2020-03-08 11:14:24
                        线性表 1,线性表可分为:顺序表和链表。 2,其中顺序表和链表有又静态顺序表,动态顺序表和静态链表,动态链表之分。 3,线性表的一般操作有: (1):线性表的创建,插入,删除等操作。 //顺序表的一些基本操作 #include<stdio.h> #define MaxSize 10 //向顺序表中插入元素 void InsertElem(int Sqlist[],int *len,int i,int x) {//向顺序表中第i个位置上插入元素x int t; if(*len==MaxSize || i<1 || i>*len+1) { printf("插入位置非法!"); return; } for(t = *len-1;t>=i-1;t--) Sqlist[t+1] = Sqlist[t]; Sqlist[i-1] = x; *len = *len+1; } //向顺序表中删除元素 void DelElem(int Sqlist[],int *len,int i) {//删除顺序表中第i个元素 int j; if(i<1 || i>*len) { printf("删除位置非法!"); return; } for(j=i;j<=*len-1;j++) Sqlist[j-1] = Sqlist[j]; *len = *len - 1;