學好資料結構和演算法,是我的追求,這並不容易。
基礎不牢,c語言學不好,資料結構你就推不動,陣列,指標之類的東西都不會,怎麼學?今天從頭開始,一點兒一點兒弄懂。文章裡面的**都是天勤資料結構裡面的,我按照這本書複習,加上自己的理解,寫清楚思路。
1.結構體。
結構體相當於乙個集合,裡面一般存放一些型別不同的資料,方便應用。
用人來舉例子①姓名是乙個資料,假設為字元型
②身高是乙個資料,假設為浮點型別
③年齡是乙個資料,假設為整數型別
這三個資料是乙個人的屬性,分開來看沒什麼價值,所以把它們綜合在一起,形成乙個整體,這就成了結構體。
struct
以上是乙個結構體。
我們可以給這個結構體起乙個名字,將它打造成乙個新的資料型別。
typedef struct person
person;
用陣列來模擬結構體。陣列裡面存放的是相同型別的變數,結構體裡面存放的是不同型別的變數。
2.指標
記憶體是由乙個乙個儲存單元構成的,每個儲存單元都有乙個位址,知道位址,就知道這個儲存單元。
我們用整數型別來模擬指標型別。
整數型別是一種資料型別,可以宣告乙個整數型別的變數,這個變數裡面存放的是整數;
指標型別是一種資料型別,可以宣告乙個指標型別的變數,這個變數裡面存放的是位址。
int a;
上面這行**,宣告了乙個int 型別的變數,叫做a,a中存放的是int型別的值;
int *a;
上面這行**,宣告了乙個指標型別的變數,叫做a,a這個指標型別的變數裡面存放著乙個位址,這個位址代表的記憶體單元裡面存放著乙個int型別的值。
講清楚了吧,這個表達能力還是很厲害的。
3.構造結點的寫法
這個結點在資料結構裡面到處都是。把每個結點看成乙個整體,就跟把人看成乙個整體一樣,結點和結點之間的關係,組成了資料結構,人和人之間的關係組成了社會結構。說的雖然不太嚴謹,但是意思差不多。
①鍊錶結點的構造。
跳一下知識點,這裡直接把鍊錶結點拿出來講,不影響的。
typedef struct node
node;
上面這個**在定義結構體的同時,把結構體重新打造成了乙個資料型別;
第一句裡面假設資料的資料型別為int,如有需要,可以替換。
第二句定義了乙個指標變數,叫做next,用來存放下乙個結點的位址。這行**的意思是,定義了乙個指標變數,用來指向和其所在結構體型別相同的結構體。這一句寫的時候,整個結點還沒定義完,所以要把這一句寫完整。
②二叉樹結點的構造
二叉樹裡面,子結點分左右,於是相同的定義方法。
typedef struct btnode
btnode;
③malloc()函式
這個函式用來申請記憶體空間。
就等於要蓋房子,去申請地皮,要不然沒地方。你要多大,我就給你多大,不多不少。要完後,我把位址給你,你去蓋房子。malloc()是乙個函式,那麼就有引數和返回值,它的返回值就是乙個位址。如果有多個記憶體單元,返回的是它們的首位址。
int *p;
這一行**宣告了乙個指標變數,叫做p;
p = (int *)malloc(sizeof(int));
這一行**,先看sizeof(int),這是說明要按照每個int型別的大小分配記憶體;
再看malloc(sizeof(int)),這是說明得到了已申請到的結點的位址;
(int *)是強制型別轉換,把得到的位址強制轉換為指向int變數的位址;
再看左邊的p = ,這個意思是把剛才得到的記憶體單元的首位址給p,這邊一定記住是首位址。
又講清楚了吧,多厲害。
基礎知識1到此結束,如有錯誤,請提出。
1 資料結構和演算法學習目錄
本專欄記錄研究生期間演算法學習過程,從基礎回顧到演算法落地。演算法學習範圍為藍橋杯官網提供的命題範圍 計算機演算法 列舉 排序 搜尋 計數 貪心 動態規劃 圖論 數論 博弈論 概率論 計算幾何 字串演算法等。資料結構 陣列 物件 結構 字串 佇列 棧 樹 圖 堆 平衡樹 線段樹 複雜資料結構 巢狀資...
C 演算法學習 預備知識(4) 異常處理(1)
異常提供了一種通過將控制轉移到名為處理程式的特殊功能來對我們程式中異常情況 如執行時錯誤 做出反應的方法。要捕獲異常,我們必須將一部分 放在異常檢查下。這是通過將該部分 包含在try塊中來完成的。當該塊中出現異常情況時,丟擲異常,將異常處理程式傳遞給控制項。如果沒有丟擲異常,將繼續正常執行,所有處理...
資料結構之預備知識
指標是c語言的靈魂 位址 記憶體單元的編號 從零開始的非負整數 範圍 0 ffffffff 0 4g 1 指標 指標就是位址,位址就是指標 指標變數是存放記憶體單元位址的變數 指標的本質是乙個操作受限的非負整數 分類 1.基本型別指標 基本概念 int i 10 int p i 等價於 int p ...