线性表

1. 线性表的基础知识

1.1 线性表的定义

线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。

若用L命名,表示:L=(a1,a2,a3,…,ai-1,ai,ai+1,…,an)

1.2 线性表的逻辑特性和特点

逻辑特性

•a1:唯一的表头元素•a2:唯一的表尾元素•除去a1:每个元素有且仅有一个直接前驱a(i-1)•除去an:每个元素有且仅有一个直接后继a(i+1)

特点

•n = 0:空表•表中元素有限个•表中元素具有逻辑上的顺序性,各个元素有先后次序•表中元素都是数据元素,每一个元素都是单个元素•表中元素的数据类型都相同•表中各个元素占用相同大小的存储空间•表中元素具有抽象性

1.3 线性表的存储结构

顺序存储结构:顺序表

链式存储结构:链表

1.4 顺序存储与链式存储的比较

顺序表

•可以随机访问•占用存储空间连续•顺序表的插删,需要移动多个元素

链表

•只能顺序访问•占用额外的存储空间存储元素间的关系,空间利用率更低•存储空间不一定连续•链表的插删不需要移动多个元素

2. 顺序表

2.1 顺序表的定义

线性表的顺序存储叫顺序表

2.2 顺序表的特点

•把线性表中所有元素按照逻辑顺序,依次存储到从指定位置开始的一块连续存储空间•逻辑相邻的两个元素物理也相邻•第i+1个元素的存储位置紧接在第i个元素的存储位置后面•顺序表可以实现随机存取

2.3 顺序表的顺序存储类型描述

一维数组静态分配

•数组的大小空间已经固定•空间满时,再加入新数据会导致溢出

#include "stdio.h"#define MaxSize 50    //线性表的最大长度 typedef int ElemType;typedef struct{    ElemType data[MaxSize];       //顺序表的元素

int length;                    //顺序表当前的长度 }SqList;                        //使用typedef重新定义的顺序表的类型

一维数组动态分配

•空间满时,可以开辟另外一块更大的空间,达到扩充目的•依旧是一次性选择一块大的空间,只不过可以在程序运行时动态指定空间大小

#include "stdio.h"#include "malloc.h"typedef int ElemType;#define MAXSIZE 100       //动态数组的最大容量 typedef struct{    ElemType *data;            //动态分配数组的指针 int length;            //顺序表当前长度 }SqList;                //使用typedef重新定义的顺序表的类型  

//动态分配空间 L->data=(int *)malloc(MAXSIZE*sizeof(int));

2.4 顺序表上基本操作

2.4.1 插入操作

实现思路

 1. 在顺序表L的第i个(1<=i<=L.length+1)个位置插入新元素e 2. 如果i的输入不合法,则返回0,表示插入失败 3. 若i的输入合法,顺序表的第i个元素以及其后的所有元素右移一个位置,腾出一个空位置插入新元素e,顺序表长度增加1,插入成功,返回1。

实现代码

/*    *    将元素e插入到顺序表L中位序i的位置  */int ListInsert(SqList *L,int i,ElemType e){int j;

//判断输入的 i 是否合法,最小值应为 1,最大值应为 length+1 if(i < 1 || i > L->length + 1){            return 0;    }

//判断当前的存储空间是否已满if(L->length >= MAXSIZE){                 return 0;    }

// 移位 for(j=L->length;j>=i;j--){                        L->data[j] = L->data[j-1];    }

//执行插入操作     L->data[i-1] = e;                        

//顺序表长度加 1     L->length++;                            

return 1;}

2.4.2 删除操作

实现思路

 1. 删除顺序表L中的第i(1<=i<=L.length)个位置的元素 2. 成功则返回1,并将被删除的元素用引用变量e返回 3. 否则,返回0

实现代码

/**    将元素e从顺序表L中删除*    *L:    线性表的地址 *     i: 待删除元素在顺序表L中的位置*    e:返回删除元素数据域中的数据 */int listDelete(SqList *L,int i,ElemType *e){int j;

//判断输入的 i 是否合法    最小值为 1 ,最大值为 length if(i < 1 || i > L->length){return 0;    }

//获取被删除元素数据域中的数据     *e = L->data[i-1];

//移位,从被删除元素的位置开始,讲后面的元素往前移动 for(j=i;jlength;++j){        L->data[j-1] = L->data[j];    } //顺序表长度减 1      L->length--;return 1;}

2.4.3 按值查找

实现思路

 1. 在顺序表L中查找第一个元素值等于e的元素,并返回其位序

实现代码

/**    查找顺序表中值为e的元素,如果查找成功,返回元素位序,否则返回0 *    L:顺序表*    e:待查找的数据 */int LocaleElem(SqList L,ElemType e){int i;

//循环便利顺序表L for(i=0;ilength;++i){//判断顺序表中的元素与待查找数据进行匹配 if(L.data[i] == e){//返回元素位序     位序与下标有 1 的差距 return i+1;        }    }//查找失败 return 0;}

3. 整体代码(c语言)

#include "stdio.h"#include "malloc.h"typedef int ElemType;#define MAXSIZE 100       //动态数组的最大容量 typedef struct{    ElemType *data;            //动态分配数组的指针 int length;            //顺序表当前长度 }SqList;                //使用typedef重新定义的顺序表的类型  

//动态分配空间 

//初始化顺序表 void InitList(SqList *L){    L->data=(int *)malloc(MAXSIZE*sizeof(int));}

/*    *    将元素e插入到顺序表L中位序i的位置  */int ListInsert(SqList *L,int i,ElemType e){int j;

//判断输入的 i 是否合法,最小值应为 1,最大值应为 length+1 if(i < 1 || i > L->length + 1){            return 0;    }

//判断当前的存储空间是否已满if(L->length >= MAXSIZE){                 return 0;    }

// 移位 for(j=L->length;j>=i;j--){                        L->data[j] = L->data[j-1];    }

//执行插入操作     L->data[i-1] = e;                        

//顺序表长度加 1     L->length++;                            

return 1;}

/**    将元素e从顺序表L中删除*    *L:    线性表的地址 *     i: 待删除元素在顺序表L中的位置*    e:返回删除元素数据域中的数据 */int listDelete(SqList *L,int i,ElemType *e){int j;

//判断输入的 i 是否合法    最小值为 1 ,最大值为 length if(i < 1 || i > L->length){return 0;    }

//获取被删除元素数据域中的数据     *e = L->data[i-1];

//移位,从被删除元素的位置开始,讲后面的元素往前移动 for(j=i;jlength;++j){        L->data[j-1] = L->data[j];    } //顺序表长度减 1      L->length--;return 1;} /**    查找顺序表中值为e的元素,如果查找成功,返回元素位序,否则返回0 *    L:顺序表*    e:待查找的数据 */int LocaleElem(SqList L,ElemType e){int i;//循环便利顺序表L for(i=0;ilength;++i){//判断顺序表中的元素与待查找数据进行匹配 if(L.data[i] == e){//返回元素位序     位序与下标有 1 的差距 return i+1;        }    }//查找失败 return 0;}//创建顺序表 void CreateList(SqList *L){int i;for(i=0;ilength;i++)    {        scanf("%d",&L->data[i]);    }}//输出顺序表 void PrintList(SqList L){int i;for(i = 0;ilength;i++)    {printf("%d ",L.data[i]);    }}main(){SqList L;int i;int e;    InitList(&L);printf("请输入顺序表L的长度:\n");    scanf("%d",&L.length);printf("请输入顺序表L:\n");    CreateList(&L);printf("输入的顺序表为:");    PrintList(L);printf("\n");printf("\n");printf("请输入插入的位序和值:");    scanf("%d%d",&i,&e);     ListInsert(&L,i,e);printf("插入之后的顺序表L:");    PrintList(L);printf("\n");printf("\n");printf("请输入删除的位序:");scanf("%d",&i);     listDelete(&L,i,&e);printf("删除之后顺序表L:");    PrintList(L);printf("删除元素的值为:%d",e);printf("\n");}

进栈顺序为abcd则出栈顺序为_线性表之顺序表示相关推荐

  1. java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)

    线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像.通常,称这种存储结构的线性表为顺序表.特点是:逻辑上相邻的数据元素,其物理次序上也 ...

  2. 进栈顺序为abcd则出栈顺序为_进栈顺序为a、b、c、d,则出栈顺序可以为?

    @依风152: 这个是CSDN上的,你看看 13楼 18,19楼 这个你应该能看明白! 我两年多没看数据结构了╮(╯▽╰)╭ 先说两条数学结论: 设入栈序列为I(n):1,2,...,n 1,I(n) ...

  3. 线性表的顺序储存(顺序表的c++实现)

    顺序表的定义 :数据结构在内存中的表示通常有两种形式,即顺序储存表示和链式储存表示.线性表的顺序储存是指用一组地址连续的储存单元依次储存线性表的数据元素,我们把这种储存形式储存的线性表叫做顺序储存.线 ...

  4. Java之根据入栈顺序是否能得到出栈顺序

    入栈.出栈顺序匹配 前言 一.Java入栈.出栈 1.例题 二.题解 A.纯正的模拟 B.LinkedHashSet C.利用CPU 总结 参考文献 前言 给出入栈顺序,匹配一个出栈顺序是否合法,即出 ...

  5. 已知入栈顺序求所有的出栈顺序已知出栈顺序求所有的入栈顺序

    一.已知入栈顺序求所有的出栈顺序 已知入栈顺序是{1,2,3,4,5},求所有的出栈顺序? 我的思路: 既然入栈顺序固定,我觉得可以使用递归来做. 先定义一个函数,比如说叫做help. //伪代码 v ...

  6. 数据结构——绪论以及线性表的顺序表示

    绪论 数据类型 数据类型是一个值的集合和定义在此集合上一组操作的总称. (1)原子类型:其值不可再分的数据类型,如int,char,float. (2)结构类型:其值可以再分解为若干成分的数据类型. ...

  7. 四、【线性表】线性表的顺序表示和实现

    线性表的顺序表示和实现 前文我们提到过线性表是逻辑结构,只说明了数据元素之间的相互关系,想要使用线性表,我们还需要在计算机上表示出这些数据元素以及元素之间的关系.而对于同一种逻辑结构,可以有多种存储结 ...

  8. mysql 线性表_数据结构-线性表之顺序表

    线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...

  9. 大话西游之王道考研数据结构第一讲---线性表的顺序表示

    大话西游之王道考研数据结构第一讲---线性表的顺序表示 写在前面的话 王道考研数据结构是一本非常好的书,本系列所有的内容是按照其书进行讲述的,所以您可以以那本书作为主要内容,这个做参考. 大学时候,在 ...

最新文章

  1. Flutter开发之布局-4-container(18)
  2. 【转载】用 Pyinstaller 来打包 + 解决打包结果过大问题
  3. (转载)H.264码流的RTP封包说明
  4. 2020年应届生找工作难?Python爬虫解析疫情之下用人市场中的机遇与挑战
  5. 在 Kubernetes 集群中使用 MetalLB 作为 Load Balancer(上)
  6. Linux模拟超级终端minicom(二)
  7. 洛谷P1482 Cantor表(升级版) 题解
  8. burst什么意思_为什么Windows/iOS操作很流畅而Linux/Android却很卡顿呢?
  9. 东南大学的计算机类和电子信息哪个专业好,东南大学王牌专业有哪些及专业排名...
  10. bpe编码_缓冲池扩展(BPE)–实施另一级缓存
  11. STL——配接器(adapters)
  12. java二维码生成器
  13. FlightGear的IO系统
  14. php易宝支付扫码支付代码_刷脸支付将颠覆扫码支付——汇刷刷脸支付
  15. HTML网页图片滚动代码
  16. 各种编码中使用到的工具类
  17. C++核心准则​SL.con.1:标准库array或vector好于C数组
  18. openwrt 开启软看门狗
  19. Elixir元编程基础知识
  20. android content

热门文章

  1. python TypeError: not all arguments converted during string formatting 解决
  2. 因为此版本的应用程序不支持其项目类型(.vcproj)的解决方法
  3. Android--一个好玩的应用程序/开机自启动
  4. mysql 生产实践_mysql-主从复制
  5. 层次聚类多维度matlab实现_第34集 python机器学习:凝聚聚类
  6. 记一次lua打包环境导致的coredump
  7. php 验证码 扩展,使用 Captcha 扩展包 为 Laravel 5 应用生成验证码
  8. pinctrl虚拟spi的linux驱动,LinuxSPI驱动.md
  9. mysql 客户端 交叉编译_移植mysql到嵌入式ARM平台
  10. netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送