引用自身的結構體,乙個結構體中有乙個或多個成員的基型別就是本結構體型別時,說明這個結構體可以引用自己,所以稱作引用自身的結構體。
例如下面的結構體:
struct link a;p是乙個可以指向struct link型別變數的指標成員,這樣,a.p=&a就是合法的表示式。那麼,這有什麼意義呢?
這樣的意義就是我們可以把分散儲存的資料項,用乙個結構體成員鏈結起來(當然這也耗費了那個儲存指標的記憶體空間)看下面的程式
#include struct這樣的相鏈的資料儲存形式稱為鍊錶!上面形成鍊錶的方法是人為定義的,在程式執行過程中,不會生成新的儲存單元,所以也稱為「靜態鍊錶」node;
main()
printf("\n
");}
下面看一種更方法使用的「動態鍊錶」
前面的日誌中提到了c語言動態儲存分配提供了「按需分配記憶體」的實現方法,有乙個問題是,如果多次動態分配儲存單元,各儲存單元的位址不是一定是連續的,而所需要處理的批量資料往往是乙個整體,各資料之間存在著順序關係,這樣,我們可以利用上面的鍊錶把動態得到的儲存單元在邏輯上(而不是在物理上)連線起來,就可以實現我們需要的順序關係了。這時,是把鍊錶技術與動態儲存分配結合了起來,所以這裡我們給了鍊錶乙個新的名詞叫做「動態鍊錶」
很自然,我們上面例子中的鍊錶只有乙個指向後面資料項的指標,如果有兩個呢?乙個指後,乙個指前,這樣就會出現「雙向鍊錶」與「單向鍊錶」的區別
下面我們主要看單向鍊錶
事實上,單身鍊錶中的每個儲存單元的資料(也就是結構體)的格式型別是相同的(包括資料成員和指標成員)
如下:
struct abc;與單向鍊錶有關的演算法有以下幾類:
建立鍊錶 輸出結點資料 插入結點資料 刪除結點資料
下面這個程式是示例
#include #includestruct slist;
typedef
struct
slist slist;
slist *creat_slist()
r->next='\0'
; /*退出迴圈後,r指向最後乙個結點,而這個最後結點的成員next要指向'\0'
*/returnh;
/*返回動態鍊錶的頭結點指標*/}
void print_slist(slist *head)while(p!='\0'
); printf(
"->end\n");
} }slist *insert_snode(slist *head,int x,int
y) s->next=p;
/*在p指向的結點前面插入,所以新的結點的next指向p
*/q->next=s;
/*q-next本指向p結點,現在令其指向s結點,實現了插入
*/return head;/*
頭指標並未變化,返回即可*/}
slist *insert_bnode(slist *head,int x,int
y) s->next=p->next;
/*在p指向的結點後面插入,所以新的結點的next指向p
*/p->next=s;
/*p-next本指向p後面的結點,現在令其指向s結點,實現了後插入
*/return head;/*
頭指標並未變化,返回即可*/}
slist *del_node(slist *head,int
x) q->next=p->next;
/*把q->next置成p->next,
*/free
(p);
/*釋放p的儲存空間,實現刪除
*/return
head;
/*頭指標並未變化,返回即可*/}
main()
結構體和鍊錶
1 簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構體是 陣列...
結構體小結
11.26 1.struct 結構體名 結構體成員 最後的 不能省!也可指定乙個無名的結構體型別,他不出現結構體名。2.結構體變數的初始化和引用。struct 結構體名 結構體成員 成員 也可成員.成員列表 3.只能對最低一級的成員進行賦值運算。struct studentstu struct bi...
C語言 鍊錶 結構體
目的 1.編寫手機 薄管理程式,用結構體實現下列功能 1 手機 薄含有姓名 宅電 手機3項內容,建立含有上述資訊的 簿。2 輸入姓名,查詢此人的號碼。3 插入某人的號碼。4 輸入姓名,刪除某人的號碼。5 將以上功能分別用子函式實現,編寫主函式,可以根據使用者的需要,呼叫相應的子函式。建議用結構體和鍊...