結構體 自引用

2021-06-26 19:49:02 字數 3048 閱讀 1658

結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標誌,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體宣告的變數。

[cpp]view plain

copy

struct tag variable-list ;

在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。以下為示例:

[cpp]view plain

copy

//此宣告宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//同時又宣告了結構體變數s1 

//這個結構體並沒有標明其標籤

struct s1;

//此宣告宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//結構體的標籤被命名為******,沒有宣告變數

struct ******;

//用******標籤的結構體,另外宣告了變數t1、t2、t3

struct ****** t1, t2[20], *t3;

//也可以用typedef建立新型別

typedef struct ******2;

//現在可以用******2作為型別宣告新的結構體變數

******2 u1, u2[20], *u3;

在上面的宣告中,第乙個和第二宣告被編譯器當作兩個完全不同的型別,即使他們的成員列表是一樣的,如果令t3=&s1,則是非法的。結構體的成員可以包含其他結構體,也可以包含指向自己結構體型別的指標,而通常這種指標的應用是為了實現一些更高階的資料結構如鍊表和樹等。

如果兩個結構體互相包含,則需要對其中乙個結構體進行不完整宣告,如下所示:

[cpp]view plain

copy

struct b;    //對結構體b進行不完整宣告

//結構體a中包含指向結構體b的指標    

struct a  ;

//結構體b中包含指向結構體a的指標,在a宣告完後,b也隨之進行宣告

struct b;

1.1 不使用typedef時

錯誤的方式:

[cpp]view plain

copy

struct

tag_1;  

這種宣告是錯誤的,因為這種宣告實際上是乙個無限迴圈,成員b是乙個結構體,b的內部還會有成員是結構體,依次下去,無線迴圈。在分配記憶體的時候,由於無限巢狀,也無法確定這個結構體的長度,所以這種方式是非法的。

正確的方式:(使用指標):

[cpp]view plain

copy

struct

tag_1;  

由於指標的長度是確定的(在32位機器上指標長度為4),所以編譯器能夠確定該結構體的長度。

1.2 使用typedef 時

錯誤的方式:

[cpp]view plain

copy

typedef

struct

node;  

這裡的目的是使用typedef為結構體建立乙個別名nodep。但是這裡是錯誤的,因為型別名的作用域是從語句的結尾開始,而在結構體內部是不能使用的,因為還沒定義。

正確的方式:

有三種,差別不大,使用哪種都可以。

[cpp]view plain

copy

/*  方法一  */

typedef

struct

tag_1 node;  

/*  方法二  */

struct

tag_2;  

typedef

struct

tag_2 node;  

struct

tag_2;  

/*  方法三  */

struct

tag_3;  

typedef

struct

tag_3 node;  

錯誤的方式:

[cpp]view plain

copy

typedef

struct

tag_a a;  

typedef

struct

tag_b b;   

錯誤的原因和上面一樣,這裡型別b在定義之 前 就被使用。

正確的方式:(使用「不完全宣告」)

[cpp]view plain

copy

/* 方法一   */

struct

tag_a;  

struct

tag_b;  

typedef

struct

tag_a a;  

typedef

struct

tag_b b;   

/*  方法二   */

struct

tag_a;   

/* 使用結構體的不完整宣告(incomplete declaration) */

struct

tag_b;  

typedef

struct

tag_a a;   

typedef

struct

tag_b b;  

struct

tag_a;  

struct

tag_b;  

C學習 結構體 自引用(續)

結構體自引實現如下功能 在乙個單向鍊錶中,查詢y,將此x值插入到y後 分 種情況 有y,直接插入到y後面 沒有y,則放在鍊錶尾 鏈為空,則要新建鍊錶 插入結點 將乙個x插入到值為y的結點 struct stu struct stu new insert void insert while p nex...

C語言複習 自引用結構體

測試 include include int main struct student p,q,r,current p struct student malloc sizeof struct student q struct student malloc sizeof struct student r...

C語言中結構體 自引用 和 相互引用

technorati 標籤 c語言,結構體,自引用,相互引用,self reference,mutual reference 結構體的自引用 self reference 就是在結構體內部,包含指向自身型別結構體的指標。結構體的相互引用 mutual reference 就是說在多個結構體中,都包含...