C 速查手冊- 6.3.1 自我參考的結構 - 程式語言教學誌

文章推薦指數: 80 %
投票人數:10人

結構(structure) 中不能有與自己相同識別字(identifier) 名稱的結構,但可以有指向相同識別字名稱結構的指標(pointer) ,這是說C 語言可以簡單的利用結構與指標把資料 ... C速查手冊 6.3.1自我參考的結構 結構(structure)中不能有與自己相同識別字(identifier)名稱的結構,但可以有指向相同識別字名稱結構的指標(pointer),這是說C語言可以簡單的利用結構與指標把資料連接起來,形成複雜的資料結構(datastructure)。

如下例定義了一個結構list,其中有一個成員宣告為指向list的指標 #include structlist{ char*name; structlist*nextPtr; }; typedefstructlistList; intmain(void) { Lista,b,c,*startPtr; a.name="John"; b.name="Mary"; c.name="Tony"; startPtr=&a; a.nextPtr=&b; b.nextPtr=&c; c.nextPtr=NULL; while(startPtr!=NULL){ printf("%s\n",startPtr->name); startPtr=startPtr->nextPtr; } return0; } /*《程式語言教學誌》的範例程式 http://kaiching.org/ 檔名:structlist.c 功能:示範自我參考的結構 作者:張凱慶*/ 編譯後執行,結果如下 $gccstructlist.c $a.out John Mary Tony $ 宣告List變數的地方 Lista,b,c,*startPtr; 這裡分別宣告了三個List型態的結構變數,另外一個指向List型態的指標變數。

下面替三個List變數設定成員值 a.name="John"; b.name="Mary"; c.name="Tony"; 底下繼續將a的位址指派給額外宣告的指標startPtr startPtr=&a; 這是說將a作為此資料結構的起始點,同時利用額外的指標進行操作。

因為從指標可以輕易的取所指向結構的成員,指標也可以當成控制變數,因而使用指標得以容易遊走在資料結構中。

List型態結構的另一個成員nextPtr,便是指向下一筆資料項目的位址。

接下來 a.nextPtr=&b; b.nextPtr=&c; c.nextPtr=NULL; 此例中把a當成第一筆資料,也就是資料結構的起始項目,b是第二筆資料,c為第三筆資料,因此a的nextPtr指向b的位址,而b的nextPtr指向c。

由於c為最後一筆資料,因此將c的nextPtr設為NULL,NULL是C語言標準程式庫(standardlibrary)所定義的一個特別的值,代表無效的指標。

最後的while迴圈 while(startPtr!=NULL{ printf("%s\n",startPtr->name); startPtr=startPtr->nextPtr; } 最後使用了一個迴圈(loop),這個迴圈的結束條件為startPtr等於NULL。

此迴圈的任務為印出指標所指向結構的name成員,然後把startPtr重新指派給所指向結構的nextPtr成員。

由於startPtr最初的值為a的位址,所以第一次進入迴圈會印出a的name成員,同時a的nextPtr成員的值會重新指派給startPtr。

我們之前是將a的nextPtr設定成b的位址,所以第二次進入迴圈時,startPtr指向的是b,之後的動作皆可類推。

這樣的資料結構稱之為鍵結串列(linkedlist),所有的資料可以分開儲存在不同非連續的記憶體位址。

須留意一點,這裡用一個簡單的方式說明C語言的結構與指標的一般應用,而非建立實際可有效運用的資料結構。

複雜的資料結構還需要用標準程式庫中的malloc()向作業系統借記憶體空間,不需要使用後還得用free()將借來的記憶體空間還給作業系統,真正大型的C程式就需要大量的運用malloc()與free()及其他記憶體相關的函數做記憶體管理。

上一頁6.3結構 回C速查手冊首頁 下一頁6.4聯合 回C教材首頁 回程式語言教材首頁



請為這篇文章評分?