什麼是線性表?
線性表是具有相同數據類型的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;
}