資料結構二、線性表
阿新 • • 發佈:2020-08-18
第一節、線性表
-
線性表的特點
- 元素個數有限
- 元素具有邏輯上的順序性
- 都是資料元素
- 資料型別相同
- 只討論邏輯關係
可以使用的操作:求表長 Length(List)
第二節、順序表
- 順序表
- 順序表的3特點
- 隨機訪問,
- 儲存密度高
- 邏輯上相鄰的元素物理上也相鄰
- 2分配方式
- 靜態分配,SqList
- 動態分配,SeqList
- 順序表的3特點
- 順序表演算法題型
- 逆置
- 刪除所有值為x的資料元素
- 有序表刪除值重複的元素,當作直接插入排序,
- 合併兩個有序順序表
- AB = (BA)^
//設計一個高效演算法, 將順序表 L 的所有元素逆直,要求演算法的空間複雜度為 0(1)。 //演算法思想: 頭對尾互換 bool reverse(SqList &seqList) { if (seqList.length <=0) { return false; } ElemType tmp; for (int i = 0; i < (seqList.length/2); i++) { tmp = seqList.data[i]; seqList.data[i] = seqList.data[seqList.length-1-i); seqList.data[seqList.length-1-i] = tmp; } return true; } //從有序順序表中刪除所有其值重複的元素,使表中所有元素的值均不同 。 // 演算法思想:有序順序表,從第二個元素開始與前面最後一個元素比較,若相同則刪除 bool del(SqList &l) { if (l.length == 0) { return false; } int i=0; int j=1; for (; i < l.length; j++) { if (l.data[i] != l.data[j]) { l.data[++i] = l.data[j]; } } l.length = i + 1; } //對長度為 n 的順序表 L,編寫一個時間複雜度為 O(n)、空間複雜度為 0(1)的演算法 //, 該演算法刪除線性表中所有值為 x 的資料元素。 // 演算法思想:刪除一個前移1位 刪除2個前移2位,根據刪除個數往前移動 bool delX(SqList &l) { int i=0; //迴圈指標 int tmp=0; //刪除的x的個數,前移位數 while (i < l.length) { if (l.data[i] == x) { tmp++; } else { l.data[i-tmp] = l.data[i]; } } l.length = l.length-tmp; return true; } //將兩個有序順序表合併為一個新的有序順序表,並由 函式返回結果順序表。 // 兩個指標 void merge(SqList &la, SqList &lb, SqList &lc) { if (la.length + lb.length > lc.length) { return false; } int i,j,k=0; while (i < la.length && j < lb.length) { if (la.data[i] < lb.data[j]) { lc.data[k++] = la.data[i++]; } else { lc.data[k++] = lb.data[j++]; } } while (i < la.length) { lc.data[k] = la.data[i++]; } while (j != lb.length) { lc.data[k++] = la.data[j++]; } lc.length = la.length + lb.length; return true; } // 已知在一維陣列 A[m + n] 中依次存放兩個線性表(a1-am)、(b1-bn)。 試編寫一個函式,將陣列中兩個順序表的位置互換, // 演算法思想:通過多次逆置實現 bool swapPostion(DataType A[], int m, int n, int arraySize) { reverse(A, 0, m-1, arraySize); reverse(A, m, m+n-1, arraySize); reverse(A, 0, m+n-1, arraySize); } bool reverse(DataType A[], int left, int right, int arraySize) { if (left >= right || right >= arraySize) { return false; } int tmp; int mid = (left + right) / 2; for (int i = 0; i < mid -left; i++ ) { tmp = A[right-i]; A[right-i] = A[left+i]; A[left+i] = tmp; } }
第三節、連結串列
-
單鏈表的特點
- 順序存取
- 儲存密度小,每個節點內還要存指向下個結點的指標
- 結點記憶體儲單元連續
-
頭結點的優點
- 結點操作方便,連結串列第一個位置和其他位置的操作一致
- 空表和非空表的處理得到了統一,無論連結串列是否為空,頭指標都指向了頭結點的非空指標
-
建立單鏈表的兩種方式
- 頭插法
- 尾插法:需要設定標為指標
-
雙向連結串列
-
迴圈單鏈表
判空條件為 L->next == L
-
迴圈雙鏈表
L->prior == L && L->next == L
-
靜態連結串列
一塊連續的儲存空間
-
連結串列演算法題型
- 逆置:頭插法
- 求公共結點:求長度,長連結串列走長度之差,再共同走
- 刪除所有值相同的結點
- 使一個連結串列元素順序有序,直接插入排序
- 有序順序輸出連結串列元素,每次檢索最小值或最大值
- 連結串列根據奇偶順序分為兩個連結串列,尾插法
- 遞增有序順序表,去重複元素,使表中不再有重複元素,直接插入排序
- 求交集 並集 差集
第四節、陣列與矩陣
- 陣列對映方法:按行優先 按列優先
- 矩陣的壓縮儲存
- 對稱矩陣
- 三角矩陣
- 三對角矩陣
- 稀疏矩陣