相关文章:

  1. 《数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表》

文章目录

  • 数据结构基本概念
    • 一、逻辑结构
    • 二、存储结构
    • 三、数据结构定义
    • 四、数据结构的通用的几个操作
  • 数组实现线性表
    • 一、基本概念
    • 二、接口
    • 三、功能实现
    • 四、几个关键的地方

数据结构基本概念

一、逻辑结构
  1. 集合:元素罗列在一起
  2. 线性结构:元素前后相继一一对应
  3. 树形结构:元素存在一对多的关系
  4. 图结构或网状结构:元素之间存在多对多的关系
二、存储结构
  1. 顺序存储:地址连续,用数组
  2. 链式存储:地址不连续,用指针
三、数据结构定义
  • 数据结构:为了某种特殊的需求而专门设计的存储方式
四、数据结构的通用的几个操作
  • 插入 (add, insert)
  • 删除 (delete)
  • 修改 (update)
  • 查找 (get, indexOf)
  • 遍历
  • 排序 (sort)

数组实现线性表

一、基本概念

底层是数组,实际上就是Java中的ArrayList。

二、接口
public interface MyList {// 新增一个元素void add(Object element);// 删除一个元素boolean delete(Object element);// 根据索引删除一个元素boolean delete(int index);// 将指定位置元素更新为新元素boolean update(int index, Object newElement);// 当前列表中是否含有target这个元素boolean contains(Object target);// 返回指定索引的元素Object get(int index);// 返回列表大小int size();// 查找指定元素下标int indexOf(Object element);
}
三、功能实现
public class MyArrayList implements MyList {// 列表底层结构private Object[] elements;// 列表中已经存储的元素个数private int size = 0;// 列表的容量大小, 默认为10private int capacity = 10;// 自定义容量创建列表public MyArrayList(int capacity) {this.capacity = capacity;elements = new Object[capacity];}// 默认构造函数public MyArrayList() {elements = new Object[capacity];}@Overridepublic void add(Object element) {// 扩容:把原来的小容量数组拷贝到新的大容量数组,丢弃小容量数组if (size >= capacity) {capacity *= 2;Object[] newArr = new Object[capacity];System.arraycopy(elements, 0, newArr, 0, elements.length);elements = newArr;}// 这里的size既表示列表中已经存储的元素个数,也表示列表中的下一个存放元素的下标// 即size指向elements中第一个为null的元素elements[size++] = element;}@Overridepublic boolean delete(Object element) {return indexOf(element) >= 0 && delete(indexOf(element));}@Overridepublic boolean delete(int index) {if (index > size - 1) return false;// 进行元素位移覆盖System.arraycopy(elements, index + 1, elements, index, size - index);size--;return true;}@Overridepublic boolean update(int index, Object newElement) {if (index > size - 1) return false;elements[index] = newElement;return true;}@Overridepublic boolean contains(Object target) {return indexOf(target) >= 0;}@Overridepublic Object get(int index) {return elements[index];}public int size() {return size;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder("[");for (int i = 0; i < size; i++) {sb.append(elements[i] + (i == size - 1 ? "" : ", "));}sb.append("]");return sb.toString();}@Overridepublic int indexOf(Object element) {for (int i = 0; i < size; i++) {if (elements[i].equals(element)) return i;}return -1;}
}
四、几个关键的地方
  1. 对于列表的size属性的理解
    (1) size值的是列表中已经存储的元素个数
    (2) 也可以把size理解成指向底层数组中的第一个为null的元素的指针

  2. void add(Object element)功能实现

    public void add(Object element) {// 扩容:把原来的小容量数组拷贝到新的大容量数组,丢弃小容量数组if (size >= capacity) {capacity *= 2;Object[] newArr = new Object[capacity];System.arraycopy(elements, 0, newArr, 0, elements.length);elements = newArr;}// 这里的size既表示列表中已经存储的元素个数,也表示列表中的下一个存放元素的下标// 即size指向elements中第一个为null的元素elements[size++] = element;
    }
    

    注意:

    1. 数组的扩容:由于线性表的底层是数组,当线性表存储的元素大于了其容量时,必须进行数组的扩容,扩容的思路为把原来存满的数组拷贝到新的扩容后数组中,丢弃原来的数组,使用现在新的大容量数组。
    2. 数组的扩容效率很低,所以使用线性表的时候最好预估即将存储的元素数量,为线性表指定capacity。
  3. boolean delete(int index)功能实现

    public boolean delete(int index) {if (index > size - 1) return false;// 进行元素位移覆盖System.arraycopy(elements, index + 1, elements, index, size - index);size--;return true;
    }
    

    注意:

    1. 数组的位移:将指定下标右边的那部分元素(包括最后一个元素右边的null)向左位移覆盖。
    2. 数组的位移效率很低,所以最好不要使用线性表进行中间元素的增删。

数据结构 (一) ----- 数据结构基本概念基于数组实现线性表相关推荐

  1. 数据结构(C语言版)---第2章 线性表

    线性表 最常用最简单的一种数据结构:n个数据元素的有限序列 线性表的抽象数据类型定义 ADT List{ 数据对象:..... 数据关系:..... 基本操作:InitList(&L) 操作结 ...

  2. Java数据结构和算法:字符串、数组和广义表

    数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...

  3. 数据结构和算法详解(二)——线性表(数组、链表、栈、队列)

    一.数组 线性表:   线性表就是数据排成像一条线一样的结构.每个现行表上的数据最多只有前和后两个方向.常见的线性表结构:数组,链表.队列.栈等. 什么是数组: 数组(Array)是一种线性表数据结构 ...

  4. python线性表顺序存储实现_数据结构——基于C的线性表的顺序存储结构的基本操作的实现...

    /*** *SeqList.c *Copyright (c) 2015, XZG. All rights reserved. *Purpose: * 线性表顺序存储结构的创建.数据插入.数据获取.获取 ...

  5. 数据结构(C语言版) 第二章 线性表 知识梳理+作业习题详解

    目录 一.线性表顺序存储结构(顺序表) 0.线性表的基本概念 1.样例引入:多项式相加 二.线性表链式存储结构(链表) 0.链表的基本概念 1.前插法代码实例 2.链表尾插法完整代码附带各种操作 三. ...

  6. 关于数据结构链表问题(C语言实现)—— 线性表顺序存储设计与实现

    这是我的第一篇博客(内容为废话) 现在马上面临毕业的我,发现整理总结问题真的非常重要,刚刚开始学习数据结构,并且非科班出身的我,感觉得到压力非常大,所以开始学习完后在这进行回忆,复习学习.在这里要感谢 ...

  7. 线性表的增加C语言实现,数据结构(严蔚敏)C语言实现---线性表的顺序存储

    总觉得写的代码差点什么,所以回过头开始看数据结构,真正去实现一下. 这次看的是线性表的顺序存储,代码如下: 1.为了增加代码可读性,用了一些宏定义,文件名称为BaseDefine.h,内容如下: #i ...

  8. 数据结构(C语言版)实验一 线性表

    C语言数据结构实验一 **实验要求:实验目的: 1.掌握线性表的定义: 2.掌握线性表的基本操作,如建立.查找.插入和删除等. 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使 ...

  9. 王道计算机考研 数据结构 课后编程习题代码(绪论、线性表)

    第二章.线性表 2.2.3 1. 题意 :从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删函数的值,空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行. 思路 :搜索整个顺 ...

最新文章

  1. MonoRec:无需激光雷达,只需单个相机就可以实现三维场景的稠密重建
  2. Dispatch_queue
  3. Apache Nifi 实战:多表导入实现及填坑 GitChat连接
  4. Android开发:Menu选项菜单
  5. 安全的API接口解决方案
  6. 网页上html表格如何导出excel,(将html网页导出excel表格数据库)如何将网页表格导出到excel...
  7. 如何在股票软件画波浪?波浪原理?初级应用画线
  8. android 电视开机广告,电视广告饶过谁?国外用户亦未幸免 Android TV智能电视加入广告...
  9. 超20GB显存怪兽!RTX 30或于9月9日发布,AMD蓄力卡皇之争
  10. 电子招投标——电子投标书制作教程
  11. R语言-处理缺失值的方法
  12. Mac系统投屏到电视机的方法
  13. C语言 数据结构 线性循环队列 基本操作代码
  14. 笑是理想的热情与态度
  15. 根据贷款还款方式(等额本金,等额本息,等本等息,先息后本),计算本息
  16. 从 git 的历史记录中彻底删除文件或文件夹
  17. 学python如何找工作
  18. STATA regress回归结果分析
  19. MT940银行对账单怎么解析呢
  20. 关于新加坡IT薪酬和找工作网站

热门文章

  1. 【原创】设计模式面对面之观察者模式
  2. bootstrap 专注前端开发
  3. jquery项目中一些比较常用的简单方法
  4. 《ASCE1885的源码分析》の简单的进程封装类
  5. CMD下netstat ping等命令提示:不是内部或外部命令,也不是可运行的程序或批处理文件。
  6. 敏捷BI与数据驱动机制
  7. set/multiset容器
  8. 音乐计算机官方.,Boom音乐电脑版
  9. 怎么在php分页上结束分页,很经典的分页程序,该如何处理
  10. 中仪股份管道机器人_中仪股份携带管道机器人再次出发美国,携手2018年WEFTEC欢度国庆...