第5章 陣列和廣義表
陣列定義:儲存在連續記憶體單元的線性表,是一種隨機儲存結構。多維陣列可以看作每個資料元素都是乙個一維陣列。
c/c++/pascal/basic等語言是行序儲存,fortran等是列序儲存。
行序儲存的陣列a[m][n]: loc(a[i][j]) = loc(a[0][0]) + (i*n + j) * k --- k是每個元素所佔的儲存單元
特殊矩陣的壓縮儲存:
對稱矩陣(元素關於主對角線對稱,ai,j = aj,i),
三角矩陣(矩陣的上(下)三角中的元素均為常數,不包括對角線),
對角矩陣(所有非0元素集中在以對角線為中心的帶狀區域內)
把這些具有一定分布規律的元素壓縮儲存到乙個空間中,進行一定的對映。
稀疏矩陣:只有當非0元素個數遠小於總個數時,只儲存非0元素;
1。 下標按照行有序的三元組順序表儲存結構
2。 十字鍊錶,像編織一樣的串起來。每一行/列均設定乙個鍊錶,方便行列搜尋,降低複雜度。
//三元組
typedef struct
tupnode;
typedef struct
tsmatrix;
//十字鍊錶
typedef struct mtxn
tag;
}
廣義表:
資料元素相對有序,長度為最外層包含元素的個數,深度為所包含括弧的重數。可以遞迴,因為每個元素可以是原子資料也可以是子表資料。
採用動態鏈式結構,新增乙個tag域指示是否為子表。
//廣義表
typedef struct lnode
val;
struct lnode* link;
}
第6章 遞迴
在定義乙個過程或函式時出現呼叫本過程或本函式的成分,成為遞迴。
資料的定義是遞迴的,資料結構是遞迴的,問題的求解方法是遞迴的。
其執行過程分為分解和求值,是函式巢狀呼叫的特殊情況,採用**共享的方式,每次呼叫同乙個函式的**,每一次呼叫開闢棧空間,存放返回位址和引數,全部執行完後,棧應該為空。
#include #include //recursive
/*遞迴是一種分而治之的方法:
1.分析原問題,假設子問題
2.假設子問題可解,確定原問題的解
3.確定乙個特殊情況,作為遞迴出口
*/ //八皇后問題,皇后放在不同行,列,對角線
//place(k,n) 標識在1~k-1列上放好了,place(k+1,n),標誌在1~k列上放好了,是子問題
int cont =0;
int q[20];
void print(int n)
printf("\n");
}int find(int i,int k)
j ++;
} return 1;
}void place(int k,int n)
else
} }}
int main()
//哈夫曼樹和並查集
//求最小帶權路徑長度,用於簡化編碼
//判斷兩個元素之間的關係,利用集合合併,用代表元素標識集合的方法,不斷合併子樹,快速找出兩個元素是否屬於同乙個集合
#include #include typedef structhtnode;
//n個葉子節點,n-1個非葉子節點,更新每個非葉子節點的值
void creatht(htnode ht,int n)
//構造哈夫曼樹,lnode,rnode是最小權重的兩個節點位置
for(i = n; i<2*n-1; i++)
else if(ht[k].weight < min2)
}} ht[i].weight = ht[lnode].weight + ht[rnode].weight;
ht[i].lchild = lnode;
ht[i].rchild = rnode;
ht[lnode].parent = i;
ht[rnode].parent = i; }}
//並查集
typedef struct node
ufstree;
void make_set(ufstree t)
}//在x所在子樹中查詢集合編號,遞迴直到找到祖先
//改進:在找祖先root後,進行路徑壓縮,把該節點的所有祖先節點的父節點改為root
int find_set(ufstree t,int x)
//o(log2 n)樹的深度
//合併的時候讓較小秩的樹根指向較大秩的樹根
void union(ufstree t,int x,int y)
}
資料結構 陣列 廣義表
陣列,是有序的元素序列。若將有限個型別相同的變數的集合命名,那麼這個名稱為陣列名。組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數。用於區分陣列的各個元素的數字編號稱為下標。陣列是在程式設計中,為了處理方便,把具有相同型別的若干元素按無序的形式組織起來的一種形式。這些無序排列的...
資料結構 陣列和廣義表
感覺陣列這一段沒講什麼太多的東西。先是講了下定義,就是每個維度上都有對應的前驅後繼,首尾元素例外。操作只有初始化 銷毀 取元素 修改元素。然後講了下適合用順序儲存結構,多維情況下根據下標 j1 j2 j3 jn 找到對應畫素的儲存位置 cn l,ci 1 bi ci,loc loc基址 ciji l...
資料結構 陣列和廣義表
陣列長度固定,元素型別一致,沒有鏈式映像,因為不能保證位址連續 陣列與線性表的區別與聯絡 相同點 都是相同資料型別的的資料元素組成的有限序列 不同點 陣列要求位址連續,而線性表則無此要求 線性表的元素是邏輯意義上不可再分的,而陣列中每乙個元素還可以是乙個陣列 多維陣列可分 操作上的不同,陣列一旦被定...