数据结构之线性表

Posted Accper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之线性表相关的知识,希望对你有一定的参考价值。

线性表

线性表的基本概念

  • 对于同一个线性表,其每一个数据元素的值虽然不同,但必须具有相同的数据类型;
  • 数据元素之间具有一种线性的或“一对一”的逻辑关系。
    1. 第一个数据元素没有前驱,这个数据元素被称为开始节点;
    2. 最后一个数据元素没有后继,这个数据元素被称为终端节点;
    3. 除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。

 

线性表的抽象数据类型描述

基本操作如下:

  1. 线性表的置空操作clear():将一个已经存在的线性表置为空表。
  2. 线性表判空操作isEmpty():判断线性表是否为空,若为空,则返回true;否则,返回为false。
  3. 求线性表的长度操作length():求线性表中的数据元素的个数并返回其值。
  4. 取元素操作get(i):读取并返回线性表中的第i个数据元素的值。其中i的取值范围为0≤i≤length()-1。
  5. 插入操作insert(i,x):在线性表的第i个数据元素之前插入一个值为x的数据元素。其中i的取值范围为0≤i≤length()。当i=0时,在表头插入x;当i=length()时,在表尾插入x。
  6. 删除操作remove(i):删除并返回线性表中第i个数据元素。其中i的取值范围为0≤i≤length()-1。
  7. 查找操作indexOf(x):返回线性表中首次出现的指定的数据元素的位序号,若线性表中不包含此数据元素,则返回-1。

线性表的抽线数据类型用Java接口描述如下:

 

 1 /**
 2  * 
 3  * @author Accper
 4  * 
 5  */
 6 public interface IList {
 7     // 线性表置空操作
 8     public void clear();
 9 
10     // 判断线性表是否为空操作
11     public boolean isEmpty();
12 
13     // 获取线性表中元素的长度操作
14     public int length();
15 
16     // 获取指定位置上面的元素操作
17     public Object get(int i);
18 
19     // 在指定位置上面插入元素的操作
20     public void insert(int i, Object x);
21 
22     // 删除指定位置上面的元素的操作
23     public void remove(int i);
24 
25     // 查找指定元素的位置首次出现的位置操作
26     public int indexOf(Object x);
27 
28     // 显示线性表中的内容操作
29     public void display();
30 }

 

 

线性表的顺序存储及实现

  1. 顺序表的定义
    • 所谓顺序表就是顺序存储的线性表。顺序存储是用一组地址连续的存储单元依次存放线性表中各个元素的存储结构。
  2. 顺序表的特点:
    • 在线性表中逻辑上相邻的数据元素,在物理存储上也是相邻的。
    • 存储密度高,但要预先分配“足够应用”的存储空间,这可能会造成存储空间的浪费。
    • 便于随机存储。
    • 不便于插入和删除操作,这是因为在顺序表上进行的插入和删除操作会引起大量数据元素的移动。
  3. 顺序存储结构类的描述

 

  1 /**
  2  * 
  3  * @author Accper
  4  * 
  5  */
  6 public class SqList implements IList {
  7     // 线性表存储空间
  8     private Object[] listElem;
  9     // 线性表的当前长度
 10     private int curLen;
 11 
 12     // 顺序表类的构造函数,构造一个存储空间容量为maxSize的线性表
 13     public SqList(int maxSize) {
 14         // TODO Auto-generated constructor stub
 15         curLen = 0;
 16         listElem = new Object[maxSize];
 17     }
 18 
 19     // 将一个已经存在的线性表置成空表
 20     public void clear() {
 21         // TODO Auto-generated method stub
 22         // 置顺序表的当前长度为0
 23         curLen = 0;
 24     }
 25 
 26     // 判断线性表中的数据元素的个数是否为0,若为0则返回true,否则返回false
 27     public boolean isEmpty() {
 28         // TODO Auto-generated method stub
 29         return curLen == 0;
 30     }
 31 
 32     // 求线性表中的数据元素的个数并返回其值
 33     public int length() {
 34         // TODO Auto-generated method stub
 35         // 返回顺序表的当前长度
 36         return curLen;
 37     }
 38 
 39     // 读取到线性表中的第i个数据元素并由函数返回其值,其中i的取值范围为0≤i≤length()-1,若i不在此范围则抛出异常
 40     public Object get(int i) {
 41         // TODO Auto-generated method stub
 42         if (i < 0 || i >= curLen) {
 43             throw new RuntimeException("第" + i + "个元素不存在");
 44         }
 45         return listElem[i];
 46     }
 47 
 48     // 在线性表的第i个数据元素之前插入一个值位x的数据元素
 49     public void insert(int i, Object x) {
 50         // TODO Auto-generated method stub
 51         // 判断表是否满了
 52         if (curLen == listElem.length) {
 53             throw new RuntimeException("存储空间已经满了,无法插入新的元素");
 54         }
 55         // 插入的位置不合法
 56         if (i < 0 || i > curLen) {
 57             throw new RuntimeException("插入的位置不合法");
 58         }
 59         // 必须要从最后一个元素开始依次逐个后移动,直到第i个数据元素移动完毕为止。
 60         for (int j = curLen; j > i; j--) {
 61             listElem[j] = listElem[j - 1];
 62         }
 63         listElem[i] = x;
 64         curLen++;
 65     }
 66 
 67     public void remove(int i) {
 68         // TODO Auto-generated method stub
 69         if (i < 0 || i > curLen - 1) {
 70             throw new RuntimeException("删除的位置不合法");
 71         }
 72         for (int j = i; j < curLen; j++) {
 73             listElem[j] = listElem[j+1];
 74         }
 75         curLen--;
 76     }
 77 
 78     // 返回线性表中首次出现指定的数据元素的位序号,若线性表中不包含此数据元素,则返回-1
 79     public int indexOf(Object x) {
 80         // TODO Auto-generated method stub
 81         for (int i = 0; i < curLen; i++) {
 82             if (listElem[i].equals(x)) {
 83                 return i;
 84             }
 85         }
 86         return -1;
 87     }
 88 
 89     // 输出线性表中的数据元素
 90     public void display() {
 91         // TODO Auto-generated method stub
 92         for (int i = 0; i < curLen; i++) {
 93             System.out.print(listElem[i] + " ");
 94         }
 95         System.out.println();
 96     }
 97 
 98     // 测试
 99     public static void main(String[] args) {
100         SqList sqList = new SqList(10);
101         sqList.insert(0, "a");
102         sqList.insert(1, "z");
103         sqList.insert(2, "d");
104         sqList.insert(3, "m");
105         sqList.insert(4, "z");
106         int order = sqList.indexOf("z");
107         if (order!=-1) {
108             System.out.println("顺序表中第一次出现的值为z的数据元素的位置为:"+order);
109         }else {
110             System.out.println("顺序表中不包括z元素");
111         }
112     }
113 }

 

以上是关于数据结构之线性表的主要内容,如果未能解决你的问题,请参考以下文章

常见数据结构之线性表

数据结构之线性表之顺序存储Java实现

[DataStructure]非线性数据结构之哈希表二叉树及多叉树 Java 代码实现

数据结构之顺序线性表

数据结构与算法之----线性表

数据结构之线性表再思考