天天看點

資料結構中的C語言基礎,送給正在刷王道的考研黨~

國内高校的資料結構教材大都選自清華大學嚴蔚敏老師的書,考慮到大多數同學C語言的基礎不是很好,尤其是對結構體和指針的了解不深刻的同學,如果直接去看資料結構中用到的各種結構體的定義,就不是很友好,是以寫下這篇部落格,串講一下常見的資料結構的結構體定義以及一些細節問題~

//比如單連結清單的結構體的定義:
typedef struct LNode{
	struct LNode* next;
	int data;
}LNode,*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{
	struct LNode* next;
	int data;
}    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{
	struct LNode* next;
	int data;
}*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 LNode{
	struct LNode* next;
	int data;
}LNode,*LinkList;


 1. struct LNode* head;   
 2. LNode *head; 
 3. LinkList head;
以上三種定義是等價的
           

希望這篇文章能讓大家更清楚的掌握各種資料結構的結構體的定義

繼續閱讀