顺序表

01-顺序表

瘦欲@ 提交于 2019-12-02 06:36:58
一、数据结构与算法   数据结构与算法是一个程序员的基本功,技术日月更新,但数据结构和算法就相当于一个人的内功,这个人在编程的造诣高不高,就要看内功深厚不深厚。数据结构与算法是一个程序员的基本功,需要平时不断去积累。生活中许多都设涉及到数据结构与算法,数据库就是很典型的,只有认识到数据结构与算法,才能够从底层开发出轮子,让大家直接用轮子去造车子。 1、顺序表   将一组元素看成一个序列,元素在序列的位置和顺序。这样的一组序列元素的组织形式,我们可以抽象为 线性表 。   根据线性表的 实际存储方式 ,分为两种实现模型:        1、顺序表 :将元素顺序地存放在一块连续的存储区,元素间的顺序关系由它们的存储顺序自然表示。        2、链表 :将元素存放在通过连接构造起来的一系列存储快中。 2、顺序表的基本形式    内存:   由上图可知内存的基本单位是字节,而一字节占位8。内存存储的本质是存储二进制数据,如何让计算机分辨出存储的数据是各自的类型,int类型占4个字节,即上图的连续的4个内存单元。char类型占1个字节,即内存的一个单元。   图a表示顺序表的基本形式,数据元素是连续存储,每个元素所占的存储单元大小固定相同(同类型数据)元素的下标是逻辑地址,而元素的物理地址(实际内存地址,即在内存中的实际地址)可以通过存储区的起始地址L 0 加上逻辑下标与存储单元的大小

SDUT ACM 3664-顺序表应用7:最大子段和之分治递归法

我是研究僧i 提交于 2019-12-02 06:11:36
顺序表应用7:最大子段和之分治递归法 Time Limit: 10 ms Memory Limit: 400 KiB Problem Description 给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。 注意:本题目要求用分治递归法求解,除了需要输出最大子段和的值之外,还需要输出求得该结果所需的递归调用总次数。 递归调用总次数的获得,可以参考以下求菲波那切数列的代码段中全局变量count的用法: #include int count=0; int main() { int n,m; int fib(int n); scanf("%d",&n); m=fib(n); printf("%d %d\n",m,count); return 0; } int fib(int n) { int s; count++; if( (n == 1) || (n == 0) ) return 1; else

顺序表的基本操作

筅森魡賤 提交于 2019-12-02 05:16:30
今天和大家分享一下顺序表的基本操作 编写一个完整的程序,实现顺序表的建立、插入、删除、输出等基本运算。 (1) 建立一个顺序表,含有n个数据元素。 (2) 输出顺序表及顺序表的长度 。 (3) 在顺序表中删除值为x的结点或者删除给定位置i的结点。 (4) 将顺序表就地逆置,即利用原表的存储空间将线性表(a1,a2,...,an)逆置为(an,an-1,...,a1)。 (5) 将顺序表按升序排序。 (6) 设顺序表中的数据元素递增有序,将x插入到顺序表的适当位置上,以保持该表的有序性。 (7) 在主函数中设计一个简单的菜单,分别测试上述算法。 根据上题,我写了一个完整的程序,包括三个头文件,一个源程序。 头文件1(包括一些库文件): #include <iostream> #include <stdlib.h> using namespace std; 头文件2(一些基本定义): #define INIT_SIZE 100 #define INCRE 20 #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType; typedef struct SqList { ElemType *elem;//顺序表头, int length;//顺序表中含有数据的个数 int listsize;//顺序表的长度

动态顺序表的基本操作

你离开我真会死。 提交于 2019-12-02 05:15:52
顺序表   顾名思义,就是用一段连续的存储单元依次存储数据元素的线性结构 。 顺序表又分为静态顺序表和动态顺序表。   静态顺序表的基本操作: https://blog.csdn.net/zhao_miao/article/details/81145855 下面我们来分析动态顺序表的基本操作: 我们要完成的基本操作是: 初始化 打印 尾部插入 尾部删除 头部插入 头部删除 查找指定元素 指定位置插入 删除指定位置元素 删除指定元素 删除所有的指定元素 返回顺序表的大小 判断顺序表是否为空 冒泡排序 选择排序 选择排序的优化 二分查找 二分查找递归写法 首先定义一个结构体   与静态顺序表不同,动态顺序表没有最大容量的限制,可以边使用边开辟,节省空间。 # define DataType int typedef struct SeqList { DataType *data; //存放的数据 int sz; //有效元素的个数 int capacity; //容量 }SeqList,*qSeqL   由于顺序表里存放的元素的类型是未知的,所以将int重命名为DataType,若想在顺序表中存储其他类型的数据,只需将int修改为对应的类型即可。 初始化函数   初始化sz,capacity,以及指针data void InitSeqList (qSeqList seq) {

c++实现顺序表

冷暖自知 提交于 2019-12-02 01:50:10
类的声明 一般类的声明在头文件中进行,类中成员函数的实现在源文件中进行 1234567891011121314151617181920212223242526272829 using namespace std;typedef int dataType; //与上同样的道理,如果数据类型有变化,只需要修改此处即可class node{ public: dataType data;};class sql{ public: sql(); ~sql(); void (int n); //输入n个数值构造n个节点 void traverseSql();//遍历节点并输出 bool isEmpty();//判断线性表是否为空 bool isFull();//判断线性表是否为满 int getLength();//返回线性表当前长度 bool getElemByIndex(int i,dataType& elem);//按索引返回线性表中元素 bool getElemByElem(dataType data,int& elem);//按数值返回线性表中元素 bool insertSql(int n,dataType data);//按索引位置插入元素 bool insertSqlAtHead(dataType data);//在顺序表头插入元素 bool insertSqlAtEnd

05 顺序表的具体实现(代码)

≡放荡痞女 提交于 2019-12-01 13:42:04
项目结构: main.cpp: #include <iostream> #include<stdio.h> #include<stdlib.h> #include "function_for_SqList.h" using namespace std; int main() { SqList L; Book book1 = { //创建两本书 "001", "book_one", 23.6 }; Book book2 = { "002", "book_two", 34.7 }; int initResult=0; int insertResult=0; //图书插入结果值返回 initResult = InitList(L); //创建线性表 printf("添加之前的图书个数:%d\n", GetLength(L)); //获取当前图书个数 //添加第一本书 insertResult = ListInsert_Sq(L, 1, book1); if(insertResult == 1){ printf("插入第一本书完成,此时线性表中图书个数为:%d\n", GetLength(L)); }else{ printf("图书插入失败\n"); } insertResult = ListInsert_Sq(L, 2, book2); if(insertResult == 1){

2、线性表之顺序表

半城伤御伤魂 提交于 2019-12-01 13:41:57
一、顺序表 线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。 顺序表:将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。 二、顺序表的基本形式 顺序表的数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即: 访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。 三、顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中的元素集合,另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息,这部分信息主要包括元素存储区的 容量 和当前表中已有的 元素个数 两项。 四、顺序表的两种基本实现方式 一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。一体式结构整体性强,易于管理。但是由于数据元素存储区域是表对象的一部分,顺序表创建后,元素存储区就固定了。 分离式结构,表对象里只保存与整个表有关的信息(即容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过链接与基本表对象关联。 五、元素存储区替换 一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区

基本数据结构整理

旧城冷巷雨未停 提交于 2019-12-01 13:14:21
数据结构 基本数据结构 基本定义解释 数据结构 数据结构分为线性结构和非线性结构,其中线性表是典型的线性结构。 存储结构 对计算机数据存储的结构描述,一般分为线性结构和非线性结构。 存取结构 在一个数据结构上对查找操作的时间性能的一种描述,一般有随机存储结构和顺序存储结构。 随机存储结构 一个数据结构上进行查找的性能为O(1),即查找任意元素的时间复杂度为1。(如顺序表等) 顺序存储结构 一个数据结构上进行查找的时间性能为O(n)。(如单链表等) 链表 链表是一个动态结构,不需要提前分配内存。 线性表 线性表是一个静态的结构,需要提前分配对应的存储空间,分配之后就不能修改,从逻辑上定义元素是一对一关系。 顺序表 顺序表是使用数组的方式对线性表的实现,在内存中是连续的空间,一旦分配,无法更改。 链表 链表是使用指针的方式实现线性表,在内存中可以连续也可以不连续。 链表节点构成 指针域(用于存放指针L->next在左边时为指针域)、数据域(用于存放数据的)。 链表指针 对应数据的指针地址( L->next在右边时为指针)。 链表指针域 存放对应指针的区域。 线性表和链表的选择 首相考虑数据的存储密度线性线性表为1,链表小于1,顺序表的访问速度快,链表的存储删除速度快。 线性表和链表的重点知识 初始化、查找、插入、删除、遍历、逆置、合并、分解等操作。 双链表删除p指针操作顺序 p-

线性表自测题

本小妞迷上赌 提交于 2019-12-01 11:02:41
一、填空题 1 .在顺序表中插入或删除一个元素,需要平均移动 表中一半 元素,具体移动的元素个数 与 表长和该元素的个数 有关。 2 .线性表中结点的集合是 有限的 的,结点间的关系是 一对一 的。 3 .向一个长度为 n 的向量的第 i 个元素 (1 ≤ i ≤ n+1) 之前插入一个元素时,需向后移动 n-i+1 个元素。 4 .向一个长度为 n 的向量中删除第 i 个元素 (1 ≤ i ≤ n) 时,需向前移动 n-i 个元素。 5 .在顺序表中访问任意一结点的时间复杂度均为 O(1) ,因此,顺序表也称为 随机存取 的数据结构。 6 .顺序表中逻辑上相邻的元素的物理位置 一定 相邻;单链表中逻辑上相邻的元素的物理位置 不一定 相邻。 7 .在单链表中,除了首元结点外,任一结点的存储位置由 其直接前驱和链域的值 指示。 8 .在 n 个结点的单链表中要删除已知结点 *p ,需找到它的 前驱结点 ,其时间复杂度为 O(n) 。 二、判断正误 ( 错 ) 1. 链表的每个结点中都恰好包含一个指针。 ( 错 ) 2 . 链表的物理存储结构具有同链表一样的顺序。 ( 错 ) 3 . 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动将后续各个单元向前移动。 ( 错 ) 4 . 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 ( 错 ) 5.

04 顺序存储的线性表 概述1

≡放荡痞女 提交于 2019-12-01 10:13:22
顺序表结构: 基本方法:.h文件 1 //方法 2 Status InitList(SqList &L); //线性表L初始化(参数用引用) 3 4 void DestroyList(SqList &L); //销毁线性表L 5 6 void ClearList(SqList &L); //清空线性表L 7 8 int GetLength(SqList L); //求线性表L的长度 9 10 int IsEmpty(SqList L); //判断线性表是否为空 11 12 int GetElem(SqList L, int i, ElemType &e); //获取线性表元素 13 14 int LocateElem(SqList L, ElemType e); //获取元素的位置 方法具体定义:.cpp文件 1 #include "function_for_SqList.h" 2 //方法 3 //线性表L初始化(参数用引用) 4 Status InitList(SqList &L){ //构造一个空的顺序表 5 L.elem = new ElemType[MAXSIZE]; //为顺序表分配空间 6 if(!L.elem){ 7 exit(OVERFLOW); //存储分配失败 8 } 9 L.length = 0; //空表长度为0 10 return OK; 11 } 12