1. 程式人生 > 其它 >連結串列結構體定義LNode,*LinkList以及typedef

連結串列結構體定義LNode,*LinkList以及typedef

技術標籤:資料結構單鏈表連結串列資料結構linux

連結串列:線性表的鏈式儲存結構

連結串列結構體定義LNode,*LinkList的理解

程式碼分析:

typedef struct node{
	datatype data;
	struct node* next;
}linknode,*linklist; 

以上程式碼可以分解為:
typedef struct node linknode; //將結構體型別struct node重新命名為linknode
typedef struct node *linklist; //將struct node *重新命名為linklist

建立單鏈表
linklist L; //等價於 struct node * L

可以理解為,通過typedef,將struct node *替換為linklist,當我們在使用LinkList L定義變數時,實際上就是在使用 struct node * L定義變數。使得以後想定義指向struct node型別的指標變數時,不需要寫struct node * ,只需要使用LinkList,減少了程式碼的書寫。

可理解為:
linklist = struct node *

後續malloc時候,返回值為void*型,寫法如下:
linklist L;
L = (linklist)malloc(sizeof(linknode));

對於typedef

1.概述:typedef本身是一種儲存類的關鍵字,與auto,extern,static,register等關鍵字不能出現在同一個表示式中

2.作用:使用typedef定義新型別
int a; ———— 傳統變數宣告表示式
int myint_t; ———— 使用新的型別名myint_t替換變數名a
typedef int myint_t; ———— 在語句開頭加上typedef關鍵字,myint_t就是我們定義的新型別

上述程式碼中的:typedef int datatype;就是如此。

typedef的作用有以下幾點:

1)typedef的一個重要用途是定義機器無關的型別。例如,定義一個叫REAL的浮點型別,該浮點型別在目標機器上可以獲得最高的精度:

typedef long double REAL;

如果在不支援 long double 的機器上執行相關程式碼,只需要對對應的typedef語句進行修改,例如:

typedef double REAL;

或者:

typedef float REAL;

2)使用typedef為現有型別建立別名,給變數定義一個易於記憶且意義明確的新名字。例如:

typedef unsigned int UINT

3)使用typedef簡化一些比較複雜的型別宣告,例如:

typedef void (*PFunCallBack)(char* pMsg, unsigned int nMsgLen);

上述宣告引入了PFunCallBack型別作為函式指標的同義字,該函式有兩個型別分別為char*和unsigned int引數,以及一個型別為int的返回值。通常,當某個函式的引數是一個回撥函式時,可能會用到typedef簡化宣告。

3. typedef與#define

兩者的區別如下:
#define進行簡單的進行字串替換。 #define巨集定義可以使用#ifdef、#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義。
typedef是為一個型別起新名字。typedef符合(C語言)範圍規則,使用typedef定義的變數型別,其作用範圍限制在所定義的函式或者檔案內(取決於此變數定義的位置),而巨集定義則沒有這種特性。

通常,使用typedef要比使用#define要好,特別是在有指標的場合裡。

下面列舉幾個示例。

3.1 示例1

程式碼如下:

   typedef char* pStr1;
    #define pStr2 char* 
    pStr1 s1, s2;
    pStr2 s3, s4;

在上述的變數定義中,s1、s2、s3都被定義為char型別;但是s4則定義成了char型別,而不是我們所預期的指標變數char,這是因為#define只做簡單的字串替換,替換後的相關程式碼等同於為:

char* s3, s4;

而使用typedef為char*定義了新型別pStr1後,相關程式碼等同於為:

char *s3, *s4;

3.1 示例2

程式碼如下:

typedef char *pStr;
char string[5]="test";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;

在編譯過程中,報錯如下:
在這裡插入圖片描述
根據錯誤資訊,能夠看出p2為只讀的常量了,所以p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,typedef不是簡單的文字替換,上述程式碼中const pStr p2並不等於const char * p2,pStr是作為一個型別存在的,所以const pStr p2實際上限制了pStr型別的p2變數,對p2常量進行了只讀限制。也就是說,const pStr p2和pStr const p2本質上沒有區別(可類比const int p2和int const p2),都是對變數p2進行只讀限制,只不過此處變數p2的資料型別是我們自己定義的(pStr),而不是系統固有型別(如int)而已。

所以,const pStr p2的含義是:限定資料型別為char *的變數p2為只讀,因此p2++錯誤