日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性表之顺序表

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性表之顺序表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

線性表的儲存:
1,基于順序表的儲存實現
2,基于鏈式表的儲存實現
本文只講順序表的實現。
一,定義
線性表的儲存結構是把線性表中的所有元素 按照 其邏輯順序依次儲存到計算機的內存單元中 指定儲存位置開始的 一連續的存儲空間中。
二,在計算機內存中的確定
第i個元素的位置 = 基地址(第一個元素的位置) + 元素所占存儲空間的大小* i

Loc(a i) = Loc(a 0) + c * i;

三,特點
1,在線性表邏輯上相鄰的元素在屋里儲存位置上也相鄰。
2,可按照數據元素的位序號進行隨機存取。
3,進行插入、刪除操作需要移動大量的數據元素。
4,需要進行存儲空間的預先分配,可能會造成空間浪費,但存儲密度較高。

四,用數組描述很合適了

1,先聲明一個順序表的接口

/*** 2020年3月31日下午5:43:19* 線性表的抽線數據Java接口 --順序儲存結構*/ package com.lovely.linearList;/*** @author echo lovely*/ public interface IList {void clear(); // 清除表boolean isEmpty(); // 是否是空表int length(); // 順序表的長度Object get(int i) throws Exception; // 返回線性表數據中第i個元素void insert(int i, Object x) throws Exception; // 把x插入第i個位置void remove(int i) throws Exception; // 移除i位置的數據元素int indexOf(Object x); // 數據x的下標void display(); // 輸出線性表各個元素的值}

2,聲明類實現接口

package com.lovely.linearList;/*** 2020年3月31日下午6:00:32* * @author echo lovely** 順序表(順序儲存) * 隨機存儲簡單 * 插入 刪除麻煩* 會對內存空間預先分配 造成空間浪費 但儲存密度高(在一塊內存中 一連串的)** 儲存地址 由第一個位置的儲存地址 和一個數據元素所占的儲存單元 確定* Lca(a n) = Lca(a 0) + c* i (i--n個元素) c為大小*/ public class SequenceList implements IList{private Object[] listItem; // 順序表的儲存空間private int maxSize; // 順序表的最大長度private int curLen; // 順序表的當前長度// 構建一個儲存空間為 maxSize的順序表public SequenceList(int maxSize) {this.maxSize = maxSize; // 最大長度listItem = new Object[maxSize];curLen = 0; }@Overridepublic void clear() {// 清空順序表this.curLen = 0; }@Overridepublic boolean isEmpty() {// 順序表是否是空表return curLen == 0;}@Overridepublic int length() {// 順序表的長度return curLen;}@Overridepublic Object get(int i) throws Exception {// 數據長度控制 if (i < 0 || i > curLen - 1)throw new Exception("第" + i + "個數據不存在");return listItem[i];}@ overridepublic void insert(int i, Object x) throws Exception {if (curLen == maxSize)throw new Exception("順序表滿");if (i < 0 || i > curLen) {throw new Exception("插入位置" + i + "非法");}for (int j = curLen; j > i; j --) { // 從后往前遍歷listItem[j] = listItem[j - 1]; // 將插入位置及其之后的元素向后移動一個單位}listItem[i] = x;curLen ++;}@Overridepublic void remove(int i) throws Exception {if (i < 0 || i > curLen - 1)throw new Exception("數據" + i + "位置非法了");for (int j = i; i <= curLen - 2; i ++) { // 從前往后遍歷System.out.println("j = " + j);listItem[j] = listItem[j + 1]; // 從第 i個位置 后面的元素向前移動一個單位j ++;}curLen = curLen - 1;}@Overridepublic int indexOf(Object x) {for (int i = 0; i < curLen; i++) {if (listItem[i].equals(x)) // 這里看object是什么類型了return i;}return -1;}@Overridepublic void display() {for (int i = 0; i < curLen; i++) {System.out.print(listItem[i] + " ");}System.out.println();System.out.println("順序表的總長度: " + listItem.length);}}

3,測試順序表

package com.lovely.linearList;public class TestSequenceList {public static void main(String[] args) {// 最大長度為5SequenceList list = new SequenceList(5);try {list.insert(0, 25);list.insert(1, 77);list.insert(2, 88);list.insert(3, 99);list.insert(4, 3);list.display();System.out.println("插入數據后順序表的長度: " + list.length());list.remove(0);System.out.println("移除數據后順序表的長度: " + list.length());} catch (Exception e) {e.printStackTrace();}list.display(); }} /* 25 77 88 99 3 順序表的總長度: 5 插入數據后順序表的長度: 5 j = 0 j = 1 j = 2 j = 3 移除數據后順序表的長度: 4 77 88 99 3 順序表的總長度: 5 */

總結:
1,線性表具有較好的靜態性,較差的動態性(插入, 刪除)。
2,順序表利用元素的物理儲存次序反映線性表元素的邏輯關系,不需要額外的元素關系進行元素表達。
3,插入,刪除操作的效率較低,每插入,或者刪除一個元素,其它元素的移動次數較多,平均移動元素表中數據元素個數的一半。并且數組的容量不可更改,容量小了,造成資源溢出,大了,內存浪費。

總結

以上是生活随笔為你收集整理的线性表之顺序表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。