數據結構 | 如何實現線性表的順序結構

来源:https://www.cnblogs.com/liu-en-ci/archive/2018/02/02/8407189.html
-Advertisement-
Play Games

什麼是線性表 線性表就是零個或多個數據元素的有限序列。 首先是一個序列,然後序列之間有順序,序列中的元素如果存在多個,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且一個前驅和一個後繼。 什麼是線性表的順序存儲結構 線性表的順序存儲結構就是用一段地址連續的存儲單元依次存儲線性表的數據元素, ...


什麼是線性表

線性表就是零個或多個數據元素的有限序列。
首先是一個序列,然後序列之間有順序,序列中的元素如果存在多個,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且一個前驅和一個後繼。

什麼是線性表的順序存儲結構

線性表的順序存儲結構就是用一段地址連續的存儲單元依次存儲線性表的數據元素,也就是用數組去實現順序存儲結構。
下麵用代碼實現一下順序結構。

首先寫一個介面

介面主要描述一下實現類要實現哪些方法,這裡順序結構包括三個方法,分別是獲得元素,插入元素以及刪除元素的方法。

package com.stucture.sqlList;

/**
 * 線性表順序存儲結構的介面
 * 指的是用一段地址連續的存儲單元存儲線性表的數據元素
 * @ClassName: ISeqList
 * @author cier
 * @date 2018-1-22
 */

public interface ISeqList<T> {
    /**
     * 獲得元素
     * @param i 需要獲得第i個元素
     * @return
     */
    public T getElem(int i);

    /**
     * 插入元素
     * @param i 元素的插入位置
     * @param t 需要插入的元素
     * @return 是否成功刪除
     */
    public boolean insertElem(int i,T t);

    /**
     * 刪除元素
     * @param i 需要刪除元素的位置
     * @return
     */
    public T deleteElem(int i);
}

然後寫一個介面的實現類

該類主要實現了介面的三個方法,下麵描述一下三個方法要註意的點。

獲得元素方法
  1. 因為我這裡用的泛型,所以返回的也是泛型的結果,用泛型的優點就是可擴展性更強了,在後面泛型可以不受類型的約束,可以使用整型,字元串型。
  2. 因為線性表的下標索引是從1開始的,所以我們返回的是 i-1 的數據元素

    插入元素方法
  3. 如果插入的位置不合理,列印錯誤語句並返回。
  4. 如果線性表的長度大於等於預設分配的MAXSIZE,答應錯誤語句並返回。
  5. 如果插入的位置不在表尾,那就從最後一個元素開始向前遍歷到 i 個位置,分別將他們都向後移動一個位置。
  6. 將要插入元素填入數組 i-1 的位置處。
  7. 表長加 1。

    刪除元素方法
  8. 如果線性表為空,列印錯誤語句並返回。
  9. 如果刪除的位置不合理,列印錯誤語句並返回。
  10. 如果刪除的元素不在表尾,那就從刪除元素位置開始遍歷到最後一個元素位置,分別將它們都向前移動一個位置。
  11. 表長減 1。
    ```java
    package com.stucture.sqlList;

/**

  • @author cier
  • @date 2018/1/22 10:57
    */
    public class SeqList

    private T[] data; // 數組存儲數據元素
    private int length; // 線性表當前長度

    public SeqList() {
    data = (T[]) new Object[MAXSIZE];
    }

    /**
    • 獲得元素
    • @param i 需要獲得第i個元素
    • @return
      */
      @Override
      public T getElem(int i) {
      if (i < 0 || i > MAXSIZE) {
      return null;
      }
      T t = data[i - 1];
      return t;
      }
    /**
    • 插入元素
    • @param i 元素的插入位置
    • @param t 插入的元素
    • @return
      */
      @Override
      public boolean insertElem(int i, T t) {
      // 線性表已經滿了
      if (length == MAXSIZE) {
      System.out.println("該線性表已經滿了");
      return false;
      }
      // 插入的位置不在範圍內
      if (i < 1 || i > MAXSIZE) {
      System.out.println("該位置不合法");
      return false;
      }
      // 插入的位置不在表尾
      if (i < length) {
      for (int j = length; j >= i; j--) {
      data[j] = data[j - 1];
      }
      }
      // 線性表的下標是從1開始,但是數組的下標是從0開始的,所以插入的t是在 i-1 的位置
      data[i - 1] = t;
      length++;
      return true;
      }

    @Override
    public T deleteElem(int i) {

    // 線性表為空時
    if (length == 0) {
        System.out.println("線性表為空");
        return null;
    }
    // 刪除的數據不在範圍內時
    if (i < 1 || i > length) {
        System.out.println("刪除位置不在範圍內");
        return null;
    }
    T t = data[i - 1];
    for (int j = i; j < length; j++) {
        data[j - 1] = data[j];
    }
    length--;
    return t;

    }

    public T[] getData() {
    return data;
    }

    public void setData(T[] data) {
    this.data = data;
    }

    public int getLength() {
    return length;
    }

    public void setLength(int length) {
    if (length < 0 || length > MAXSIZE){
    System.out.println("長度不合法");
    }
    this.length = length;
    }
    }
    ```

    最後測試線性表

    測試線性表需要註意以下幾點:
  1. 初始化線性表,這裡我使用的是偽隨機種子設置數組的長度以及數組中元素的值。
  2. 隨機生成刪除元素的下標,滿足條件則自動刪除元素。
  3. 隨機生成插入元素的下標和數據,滿足條件則自動插入元素。
  4. 最後展示線性表中的數據。
    ```java
    package com.stucture.sqlList;

import java.util.Random;

/**

  • 測試線性表
  • @author cier
  • @date 2018/1/22 11:47
    */
    public class SeqListTest {
    final int MAX = 25;
    Random r = new Random();
    SeqList

    public SeqListTest(){
    initSeqList();
    }

    /**
    • 創建一個線性表順序存儲結構
      */
      public void initSeqList(){
      seqList = new SeqList

      if (length > SeqList.MAXSIZE) {
      System.out.println("該長度不合法");
      }

      for (int i = 1; i<=length; i++){
      int j = r.nextInt(MAX);
      System.out.print(j + " ");
      if (!seqList.insertElem(i,j)) {
      System.exit(0);
      }
      }
      System.out.println("\n原始數組是:");
      display(seqList);
      }

    /**
    • 測試刪除元素
      */
      public void deleteElem() {
      int i = r.nextInt(MAX);
      System.out.println("\n\n刪除的位置是:"+i);
      Integer deleteNumber = seqList.deleteElem(i);
      if(deleteNumber == null) {
      System.exit(0);
      } else {
      System.out.println("刪除的元素是:"+ deleteNumber);
      System.out.println("刪除元素後數組是:");
      display(seqList);
      }
      }
    /**
    • 測試隨機插入方法
      */
      public void insertByRandom() {
      int i = r.nextInt(MAX);
      System.out.println("\n\n隨機插入的位置是:"+i);
      int elem = r.nextInt(MAX);
      System.out.println("隨機插入數據是:"+elem);
      seqList.insertElem(i,elem);
      System.out.println("隨機插入數據後數組是:");
      display(seqList);
      }
    /**
    • 數據展示
      */
      public void display(SeqList seqList) {
      for (int i = 1; i < seqList.getData().length; i++) {
      if (seqList.getElem(i) != null){
      System.out.print(seqList.getElem(i) + " ");
      }
      }
      System.out.println("\n數組的長度為:"+seqList.getLength());
      }
    /**
    • 獲取元素
      */
      public void getElem(){
      int i = r.nextInt(MAX);
      System.out.println("\n獲取位置為:"+i);
      System.out.println("獲取到的元素為:"+seqList.getElem(i));
      }

    public static void main(String[] args) {
    SeqListTest seqListTest = new SeqListTest();
    seqListTest.insertByRandom();
    seqListTest.deleteElem();
    seqListTest.getElem();
    }
    }

```

關於運行結果

因為不是手動插入數據,刪除數據,而是使用隨機數自動插入和刪除,所以結果會有很多組,不過沒關係,多運行幾次數據不一樣反而能對比著得到結果,下麵貼一個完美的運行結果。

產生的數組長度為:16
22 4 8 11 17 3 10 8 18 18 7 9 14 4 3 18
原始數組是:
22 4 8 11 17 3 10 8 18 18 7 9 14 4 3 18
數組的長度為:16

隨機插入的位置是:12
隨機插入數據是:14
隨機插入數據後數組是:
22 4 8 11 17 3 10 8 18 18 7 14 9 14 4 3 18
數組的長度為:17

刪除的位置是:15
刪除的元素是:4
刪除元素後數組是:
22 4 8 11 17 3 10 8 18 18 7 14 9 14 3 18 18
數組的長度為:16

獲取位置為:17
獲取到的元素為:18


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 許久沒有寫了,雖然每天都有在學,但是學的東西也少了,後面難度慢慢加大,學習速度也是變慢了。這是許多天積累下來的筆記,從第一次接觸對象,到慢慢去瞭解,現在處於還待深入瞭解的狀態。萬物皆對象,那是不是說沒有對象的小伙伴不必擔心了呢? 萬物皆對象 終於到了對象這裡。面向對象程式設計(簡稱OOP),Java ...
  • 1 Mybatis的動態SQL簡介 2 if標簽 3 where標簽 4 trim標簽 5 choose-when-otherwise標簽(選擇分支) 6 set標簽 7 foreach標簽 8 內置參數 9 bind標簽 10 sql標簽 ...
  • 該系列教程系個人原創,並完整發佈在個人官網 "劉江的博客和教程" 所有轉載本文者,需在頂部顯著位置註明原作者及www.liujiangblog.com官網地址。 Python及Django學習QQ群:453131687 本章以創建一個Web投票應用為例子,手把手的教你如何使用Django開發Web應 ...
  • Python 學習的第一天 寫此博客 是為了激勵自己,並且將自己的心得以及遇到的問題與人分享 一、課堂筆記 1.Python 3.0 和 Python 2.0 不相容 Python 2.6 和 Python 2.7 是 Python 的過度版本 2.有關Python 的安裝以及helloworld ...
  • springboot+atomikos+mysql+mybatis+druid+分散式事務 ...
  • 使用matplotlib中會遇到選擇顏色的問題,很多人會覺得自帶的matlab風格的顏色不好看。好在Matplotlib已經預見到了這個問題,除了支持最基本的matlab傳統顏色之外,還支持很多種顏色的表達方式: RGB 或者 RGBA 浮點值元組,[0, 1]之間,例如(0.1, 0.2, 0.5 ...
  • Description 給出a,b,c,x1,x2,y1,y2,求滿足ax+by+c=0,且x∈[x1,x2],y∈[y1,y2]的整數解有多少對? 給出a,b,c,x1,x2,y1,y2,求滿足ax+by+c=0,且x∈[x1,x2],y∈[y1,y2]的整數解有多少對? Input 第一行包含7 ...
  • 資料庫準備: CREATE DATABASE web; USE web; CREATE TABLE users( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64), PASSWORD VARCHAR(64), email VARCHAR( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...