有了動態內存分配的基礎,要實現鏈表就不難了。
所謂鏈表,就是用一組任意的存儲單元存儲線性表元素的一種數據結構。鏈表又分為單鏈表、雙向鏈表和循環鏈表等。我們先講講單鏈表。所謂單鏈表,是指數據接點是單向排列的。一個單鏈表結點,其結構類型分為兩部分:
1、數據域:用來存儲本身數據
2、鏈域或稱為指針域:用來存儲下一個結點地址或者說指向其直接后繼的指針。
例:
typedef struct node { char name[20]; struct
node *link; }stud;
這樣就定義了一個單鏈表的結構,其中char
name[20]是一個用來存儲姓名的字符型數組,指針*link是一個用來存儲其直接后繼的指針。
定義好了鏈表的結構之后,只要在程序運行的時候在數據域中存儲適當的數據,如有后繼結點,則把鏈域指向其直接后繼,若沒有,則置為NULL。
單鏈表中每個結點的存儲地址是存放在其前趨結點next域中,而開始結點無前趨,故應設頭指針head指向開始結點。 注意:
鏈表由頭指針唯一確定,單鏈表可以用頭指針的名字來命名。 下面就來看一個建立帶表頭(若未說明,以下所指鏈表均帶表頭)的單鏈表的完整程序。
#include <stdio.h> #include <malloc.h> #define N
10 typedef struct node { char name[20]; struct node
*link; }stud; stud * creat(int n) { stud *p,*h,*s; int
i; if((h=(stud
*)malloc(sizeof(stud)))==NULL) { printf("不能分配內存空間!"); exit(0); } h->name[0]='\0'; h->link=NULL; p=h; for(i=0;i<n;i++) { if((s=
(stud *)
malloc(sizeof(stud)))==NULL) { printf("不能分配內存空間!"); exit(0); } p->link=s; printf("請輸入第%d個人的姓名",i+1); scanf("%s",s->name); s->link=NULL; p=s; } return(h); } main() { int
number; stud
*head; number=N; head=creat(number); }
這樣就寫好了一個可以建立包含N個人姓名的單鏈表了。寫動態內存分配的程序應注意,請盡量對分配是否成功進行檢測。
|