國內高校的資料結構教材大都選自清華大學嚴蔚敏老師的書,考慮到大多數同學c語言的基礎不是很好,尤其是對結構體和指標的理解不深刻的同學,如果直接去看資料結構中用到的各種結構體的定義,就不是很友好,因此寫下這篇部落格,串講一下常見的資料結構的結構體定義以及一些細節問題~
//比如單鏈表的結構體的定義:
typedef
struct lnodelnode,
*linklist;
由於各種輔導書或者一般的教材**不是非常規範,在定義乙個鍊錶的結點的時候也是多種多樣的,這樣導致大家在閱讀**的時候會糾結各種各樣的寫法~
我們先回憶一下c語言中的關鍵字typedef,該關鍵字的作用是「起別名」,是將乙個已知型別起另外乙個名字。
比如我們來看大家最熟悉的整形(
int)
我們定義乙個整形變數a:
int a;
我們還可以給int起乙個別名: typedef
int myint 此時我們如果想定義乙個整形變數b,可以採用如下語法:
myint b;
//它等價於int b;
搞清楚typedef的作用以後,我們回到最初的單鏈表的結構體的定義中來。
我們知道在c語言中如果要定義乙個結構體變數或者結構體指標的時候,需要使用關鍵字struct
(補充一句:c++中是不需要的)
struct lnode* head;
//c語言定義乙個單鏈表的頭指標
我們為了省略關鍵字struct 所以使用
typedef
struct lnode lnode
這樣我們就可以省略掉struct這個關鍵字了,因為我們相當於做了typedef
struct lnode lnode;
此時struct lnode 的別名就叫作lnode 這樣我們在寫**的時候就可以省略掉struct 這個關鍵字
所以lnode* head;
//它等價於struct lnode* head;
討論完第乙個大家可能覺得有問題的地方以後,我們來看第二個關於 linklist 的問題:在說這個問題之前,我們先來看乙個大家的易錯點,這也是c語言考試中比較常考的乙個知識點~
//例如 我們定義兩個整形變數a和b:
int a,b;
//它等價於int a; int b;
我們再定義兩個整形指標p和q:
int* p,
*q;//它等價於int *p; int *q;
但是很多c語言基礎不紮實的同學,可能在定義指標的時候會出現乙個小小的錯誤
還是定義兩個整形指標p和q,不少同學會有下面的寫法:
int *p,q;
這裡等價的寫法其實是:int *p; int q; 實際上它是乙個整形指標和乙個整形變數,而並非p和q兩個指標,所以回歸到我們的單鏈表中,就會有同學犯同樣的錯誤:
lnode* head,p; 看似正確,但是是乙個很細節的錯誤,實際上它定義的是是lnode* head; lnode p;
而正確的寫法應該是:lnode* head,
*p; 這個等價於lnode* head; lnode* p; 這才是我們想要的正確結果
為了防止這個細節錯誤的發生,我們將*和lnode放在一起並起別名為linklist
也就是typedef
struct lnode
*linklist;
簡單化簡一下就是:
typedef
struct lnode* linklist;
現在linklist head; 就等價於lnode* head;
這樣我們就可以少寫乙個* 同時也可以減少上面的細節錯誤
與此同時,如果我們需要定義多個結點指標,只需要:
linklist p,q,r;
等價於:
lnode *p,
*q,*r;
等價於:
lnode* p;
lnode* q;
lnode* r
總結如下:
在如下的定義的前提下:
typedef
struct lnodelnode,
*linklist;
1.struct lnode* head;
2. lnode *head;
3. linklist head;
以上三種定義是等價的
C 基礎 C 中的資料結構
陣列具有以下的特點 陣列屬於線性結構,在記憶體中是連續存放的。陣列的元素型別必須相同。陣列可以直接通過下標訪問。陣列的查詢速度非常快,新增和刪除速度慢。陣列在初始化時要指定陣列長度。動態陣列具有以下的特點 arraylist的底層其實就是乙個陣列。arraylist在宣告時不必指定長度,會根據儲存的...
C語言基礎(十二) 資料結構概覽
資料 類 資料物件 集合 資料元素 類物件 資料項 屬性 什麼是資料結構?概念 相互之間存在一種或多種特定關係的資料元素 類物件 的集合。資料結構包括 資料的邏輯結構 數學形式 集合結構 線性結構 1 1 樹形結構 1 n 圖形結構 n n 資料的物理結構 儲存形式 順序儲存形式 ep.陣列 鏈式儲...
C語言的資料結構
資料型別 基本資料型別 構造資料型別 指標型別 空型別。1 基本資料型別 不能再分解為其他型別,如整型 int 字元型 char 浮點型 float double 列舉 enum 整型 int 十進位制 八進位制 十六進製制 a 十進位制 無字首,其數碼為0 9 b 八進位制 必須以0開頭,數碼取值...