一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 數據結構線性表之順序存儲詳解原理

Java 數據結構線性表之順序存儲詳解原理

2022-02-28 00:36pier~呀 Java教程

線性表的順序存儲是指用一組地址連續的存儲單元依次存儲線性表中的各個元素、使得線性表中在邏輯結構上相鄰的數據元素存儲在相鄰的物理存儲單元中,即通過數據元素物理存儲的相鄰關系來反映數據元素之間邏輯上的相鄰關

線性表的定義

線性表的邏輯特征:

  • ①有且僅有一個稱為開始元素的a1,她沒有前趨,僅有一個后繼結點a2;
  • ②有且僅有一個稱為終端元素的an,他沒有后繼,只有一個直接前驅a(n-1);
  • ③其余元素ai(2≤i≤n-1)稱為內部元素,他們都有且僅有一個直接前驅a(i-1)和直接后繼a(i+1)。

Java 數據結構線性表之順序存儲詳解原理

線性表的圖像表示

線性表的基本運算

  • 線性表初始化
  • 求表長
  • 按索引值查找元素
  • 按值查找
  • 插入元素
  • 刪除

線性表的存儲之順序存儲

線性表順序存儲的定義:線性表的順序存儲指的是將線性表的數據元素按其邏輯次序依次存入一組連續的存儲單元里,用這種方式存儲的線性表稱為順序表。

Java 數據結構線性表之順序存儲詳解原理

定義線性表

定義線性表的默認空間大小,定義一個數組,定義數組的長度,初始化一個size用來保存里面元素的個數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/** 定義線性表默認空間大小 */
private final Integer ListSize=100;
/**定義數組長度*/
private Integer Len;
/** 定義線性表保存的數據類型
 * 使用泛型*/
private Object[] list;
/**存一個當前元素的個數*/
private Integer size=0;
/**定義默認線性表*/
public SeqList(){
    Len = ListSize;
    this.list = new Object[Len];
    size++;
}

初始化線性表

把線性表里面的元素全部置空

?
1
2
3
4
5
6
7
/**清空線性表*/
public void clear(){
    for (int i = 0; i < size; i++) {
        list[i]=null;
    }
    size=0;
}

添加元素

這里采用尾插法,即每次默認將元素放在最后面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**添加元素到指定位置*/
public void insert(T element , int index){
    if(index>=Len || index<0){
        throw new IndexOutOfBoundsException("輸入的索引值超過了線性表的范圍");
    }
    Capacity(size+1);
    //將添加元素的元素往后移一位
    for (int i = size-2; i >= index-1; i--) {
        list[i+1]=list[i];
    }
    list[index-1]=element;
    size++;
}
/**添加元素到末尾*/
public void add(T element){
    insert(element,size);
}

查找元素

這個模塊分為按索引值查找,和按元素值查找

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**線性表的查找
 * 按索引值查找*/
public T getNode(int index){
    return (T)list[index-1];
}
/**按元素值查找返回索引值*/
public int LocateNode(T t){
    for(int i=0;i<list.length;i++){
        if(list[i].equals(t)){
            return i+1;
        }
    }
    System.out.println("沒有找到該元素!");
    return -1;
}

刪除元素

刪除元素,又分為刪除指定元素,和刪除最后一個元素

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**刪除指定位置的元素*/
public T delete(int index){
    if(!OutIndex(index)){
        throw new IndexOutOfBoundsException("刪除位置不在線性表的索引范圍內!");
    }
    for (int i = index-1; i < size-1; i++) {
        list[i]=list[i+1];
    }
    /*if(size - index >0){
        System.arraycopy(list,index,list,index-1,size-index);
    }*/
    list[size-1]=null;
    size--;
    return (T) list;
}
/**刪除最后一個元素*/
public T remove(){
    return delete(size-1);
}

打印線性表

打印線性表,其實就是重寫一個toString方法,將線性表打印出來

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**循環打印線性表*/
    @Override
    public String toString(){
        StringBuilder sb = new StringBuilder();
        if(isEmpty()){
            return "[]";
        }
        else {
            sb.append("[");
            for (int i = 0; i < size-1; i++) {
                int a=0;
                if(list[i]!=null){
                    sb.append(list[ i ]);
                }
                else {
                    break;
                }
                sb.append(",");
            }
            sb.append("]");
            sb.deleteCharAt(sb.indexOf(",]"));
        }
        return sb.toString();
    }

實現的完整代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
class SeqList<T>{
    /** 定義線性表默認空間大小 */
    private final Integer ListSize=100;
    /**定義數組長度*/
    private Integer Len;
    /** 定義線性表保存的數據類型
     * 使用泛型*/
    private Object[] list;
    /**存一個當前元素的個數*/
    private Integer size=0;
    /**定義默認線性表*/
    public SeqList(){
        Len = ListSize;
        this.list = new Object[Len];
        size++;
    }
    /**定義自定義長度的線性表*/
    public SeqList(int length){
        Len = length;
        list = new Object[Len];
        size++;
    }
    /**獲取當前線性表的長度*/
    public int getLen(){
        return Len;
    }
    /**獲取當前線性表元素的個數*/
    public int getSize(){
        return size;
    }
    /**根據元素查找在線性表中的位置,未找到返回-1*/
    public int getIndex(T element){
        for (int i = 0; i < size; i++) {
            if(list[i].equals(element)){
                return i;
            }
        }
        return -1;
    }
    /**判斷是否表滿或表空*/
    private boolean OutIndex(int index){
        //return size==Len;//不擴容的話,可以這樣寫,但是怕擴容
        if(index>size || index<0){
            return false;
        }
        else {
            return true;
        }
    }
    /**根據索引值返回元素*/
    private T getElement(int index){
        if(!OutIndex(index)){
            throw new IndexOutOfBoundsException("輸入的索引值超過了線性表的范圍");
            /* System.out.println("輸入索引超過了線性的范圍");
            return null; */
        }
        return (T)list[index];
    }
    /**擴容*/
    private T Capacity(int capacity){
        if(capacity<Len){
            Len = Len+(Len+1)/2;
            if(capacity<Len){
                Capacity(Len);
            }
            else {
                list = Arrays.copyOf(list,Len);
                return (T) list;
            }
        }
        return (T)list;
    }
    /**添加元素到指定位置*/
    public void insert(T element , int index){
        if(index>=Len || index<0){
            throw new IndexOutOfBoundsException("輸入的索引值超過了線性表的范圍");
        }
        Capacity(size+1);
        //將添加元素的元素往后移一位
        for (int i = size-2; i >= index-1; i--) {
            list[i+1]=list[i];
//            System.out.println("i="+i);
        }
        list[index-1]=element;
        size++;
    }
    /**添加元素到末尾*/
    public void add(T element){
        insert(element,size);
    }
    /**判斷元素表是否為空*/
    public boolean isEmpty(){
        return size==0;
    }
    /**刪除指定位置的元素*/
    public T delete(int index){
        if(!OutIndex(index)){
            throw new IndexOutOfBoundsException("刪除位置不在線性表的索引范圍內!");
        }
        for (int i = index-1; i < size-1; i++) {
            list[i]=list[i+1];
        }
        /*if(size - index >0){
            System.arraycopy(list,index,list,index-1,size-index);
        }*/
        list[size-1]=null;
        size--;
        return (T) list;
    }
    /**刪除最后一個元素*/
    public T remove(){
        return delete(size-1);
    }
    /**清空線性表*/
    public void clear(){
        for (int i = 0; i < size; i++) {
            list[i]=null;
        }
        size=0;
    }
    /**線性表的查找
     * 按索引值查找*/
    public T getNode(int index){
        return (T)list[index-1];
    }
    /**按元素值查找返回索引值*/
    public int LocateNode(T t){
        for(int i=0;i<list.length;i++){
            if(list[i].equals(t)){
                return i+1;
            }
        }
        System.out.println("沒有找到該元素!");
        return -1;
    }
    /**循環打印線性表*/
    @Override
    public String toString(){
        StringBuilder sb = new StringBuilder();
        if(isEmpty()){
            return "[]";
        }
        else {
            sb.append("[");
            for (int i = 0; i < size-1; i++) {
                int a=0;
                if(list[i]!=null){
                    sb.append(list[ i ]);
                }
                else {
                    break;
                }
                sb.append(",");
            }
            sb.append("]");
            sb.deleteCharAt(sb.indexOf(",]"));
        }
        return sb.toString();
    }
}

測試一下

測試代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
    SeqList<String> seqList = new SeqList<String>();
    //添加一個元素
    seqList.add("pier");
    seqList.add("真好看");
    seqList.add("90度點頭");
    System.out.println("添加后的線性表為\n\t"+seqList.toString());
    seqList.insert("pipi",1);
    System.out.println("在位置1的地方添加元素后的線性表為\n\t"+seqList.toString());
    seqList.delete(1);
    System.out.println("刪除第二個元素后的線性表為\n\t"+seqList.toString());
    System.out.println("pier時第"+seqList.LocateNode("pier")+"個元素");
    System.out.println("第1個元素是"+seqList.getNode(1)+"。");
}

運行結果

Java 數據結構線性表之順序存儲詳解原理

到此這篇關于Java 數據結構線性表之順序存儲詳解原理的文章就介紹到這了,更多相關Java 數據結構 內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_43325476/article/details/120919973

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本在线看免费 | 亚洲国产综合自在线另类 | 欧美专区综合 | 毛片的网站 | 五月天中文在线 | 二次元美女脱裤子让男人桶爽 | 日韩一区二区不卡 | 97porm自拍视频区原创 | 色综合天天网 | 国产90后美女露脸在线观看 | 国产精品视频久久久久 | 99精品国产自产在线观看 | 四虎最新免费观看网址 | 无码人妻丰满熟妇啪啪网不卡 | 韩国美女主播在线 | 国产最新进精品视频 | 欧美日韩一区二区三区免费 | 好舒服好爽再快点视频 | 国产成人啪精品午夜在线观看 | 亚洲欧美国产精品完整版 | 下雨天小说词枝 | 日韩毛片高清在线看 | 国产成人亚洲影视在线 | 全黄h全肉细节文在线观看 全彩成人18h漫画 | 夫妇交换小说全文阅读 | 日本午夜大片免费观看视频 | 久久精品嫩草影院免费看 | 天堂在线观看中文字幕 | 色哟哟在线播放 | 色字当头 | 青草青草视频 | 亚洲AV无码一区二区三区乱子伦 | 秀婷程仪公欲息肉婷在线观看 | 国产亚洲精品一区在线播 | 精品人伦一区二区三区潘金莲 | 午夜影视免费 | 精品无人区一区二区三区 | 九九热这里只有精品视频免费 | 国产午夜小视频 | 我和岳偷长篇小说 | 久久亚洲电影www电影网 |