1. 程式人生 > 實用技巧 >資料結構二、線性表

資料結構二、線性表

第一節、線性表

  • 線性表的特點

    • 元素個數有限
    • 元素具有邏輯上的順序性
    • 都是資料元素
    • 資料型別相同
    • 只討論邏輯關係

    可以使用的操作:求表長 Length(List)

第二節、順序表

  • 順序表
    • 順序表的3特點
      • 隨機訪問,
      • 儲存密度高
      • 邏輯上相鄰的元素物理上也相鄰
    • 2分配方式
      • 靜態分配,SqList
      • 動態分配,SeqList
  • 順序表演算法題型
    • 逆置
    • 刪除所有值為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

  • 靜態連結串列

    一塊連續的儲存空間

  • 連結串列演算法題型

    • 逆置:頭插法
    • 求公共結點:求長度,長連結串列走長度之差,再共同走
    • 刪除所有值相同的結點
    • 使一個連結串列元素順序有序,直接插入排序
    • 有序順序輸出連結串列元素,每次檢索最小值或最大值
    • 連結串列根據奇偶順序分為兩個連結串列,尾插法
    • 遞增有序順序表,去重複元素,使表中不再有重複元素,直接插入排序
    • 求交集 並集 差集

第四節、陣列與矩陣

  • 陣列對映方法:按行優先 按列優先
  • 矩陣的壓縮儲存
    • 對稱矩陣
    • 三角矩陣
    • 三對角矩陣
    • 稀疏矩陣