線性表,順序表一些概念及區別

什麼是線性表?

線性表是具有相同數據類型的n個元素的有限序列

1.線性表(邏輯結構)的存儲結構分爲順序表和鏈表

  • 線性表是具有相同數據類型的n個數據元素的有窮集合 -- 它是一種邏輯結構。
  • 線性表是一種邏輯結構,表示元素之間一對一的相鄰關係。順序表和鏈表是指存儲結構,兩者屬於不同層面的概念,因此不能互相混淆。
  • 也就是說線性表這一種邏輯結構對應的的存儲結構分爲順序表鏈表

2.線性表特點:

有限性:元素個數有限

邏輯上的順序性:排序有先後順序

每個元素都相同大小的存儲空間,因爲表中元素數據類型都相同

表中元素具有抽象性,但我們僅討論元素間的邏輯關係我們不在意元素究竟表示什麼內容。

3.比如↓↓↓

例:線性表是具有n個(數據元素)的有限序列。(數據庫中的一條記錄就是一組數據元素。)

例:集合不是線性表(不滿足順序性),所有整數組成的序列不是線性表(不滿足有窮性),鄰接表不是線性表(是一種存儲結構,而線性表是邏輯結構,在此不能相提並論)

我們一定要理解線性表,以及其與順序表、鏈表的區別!!!下面我們看線性表順序存儲結構和鏈式存儲結構~

 

 

線性表的順序存儲結構

也稱順序表,用一組物理地址連續的存儲單元依次存儲線性表中的數據元素,從而使邏輯上相鄰的元素物理位置也相鄰。表中的邏輯位置與物理位置相同!線性表位序從1開始,數組下標從0開始

順序存儲有兩種描述方式:

1.靜態分配方式

#define MaxSize 50
typedef struct{
    ElemType data[MaxSize];
    int length;
}SqList;

這是靜態分配的,數組的大小和空間事先已經固定,一旦空間佔滿,再加入新的數據就會溢出,進而導致程序崩潰!

2.動態分配方式

#define InitSize 100    //表長度的初始定義
typedef struct{
    ElemType *data;    //指示動態分配數組的指針
    int MaxSize, length;//數組的最大容量和當前個數
}SeqList;

動態分配時,存儲數組的空間是在程序執行的過程中通過動態分配語句分配的,一旦數據空間佔滿,就另外開闢一塊更大的存儲空間,用以替換原來的存儲空間,從而達到擴充數據存儲空間的目的,而不需要爲線性表一次性的劃分所有的空間。

  • C的初始動態分配語句:L.data = (ElemType*)malloc(sizeof(ElemType)* InitSize);
  • C++的初始動態分配語句:L.data = new ElemType(InitSize);

PS:動態分配不是鏈式存儲,它同樣屬於順序存儲結構,物理結構沒有變化,依然是隨機存取方式,只是分配時的大小可以在運行時決定。

數據表完整代碼實現:https://blog.csdn.net/lady_killer9/article/details/82695770

先寫到這,明日接着更~

 

順序表的代碼實現

1.從順序表中刪除具有最小值的元素(假設唯一)並由函數返回被刪元素的值,空出的位置由最後一個元素填補,若順序表爲空則顯示出錯信息並停止運行。

思路:

  • 順序表爲空顯示出錯信息停止運行 -> 函數返回值設置爲bool型,出錯就返回false
  • 從順序表中刪除元素需要知道此元素在順序表中的角標
  • 返回被刪除元素的值需要記錄此值,可以考慮使用引用

搜索整個順序表,查找最小值元素並記住其位置,搜索結束後用最後一個元素填補空出的原最小值元素的位置

代碼:

bool Del_Min(SqList &L, ElemType &value){
    if(L.length == 0) return false;
    value = L.data[0];
    int pos = 0;
    for(int i = 1; i < L.length; i++){
        if(L.data[i] < value){
            value = L.data[i];
            pos = i;
        }
    }
    L.data[pos] = L.data[L.length - 1];
    L.length--;
    return true;
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章