鏈表學習筆記(一)

從這篇博文學到的,由衷感謝panda點擊打開鏈接

/*
名稱:初始化鏈表(1)(直接改變主調函數中的指針head)
功能:製造一個頭節點
接收:指向節點的指針地址 &head
返回:int
*/
int ref_initLink(struct node **L){
	//L爲指向head(指向節點的指針)的指針,用L接收head的地址
	//L接收到head的地址(&head)後,用malloc分配空間
	//空間大小爲struct node
	//類型爲指向struct node的指針
	//返回給*L,L內存儲的是指針head的地址,那麼*L就是head的內容,下面的語句直接改變了head裏的內容,讓head指向了分配好的空間
	*L = (struct node*)malloc(sizeof(struct node));
	//age置爲0,把head的next置爲空
	(*L)->age = 0;
	(*L)->next = NULL;
	return 0;
}
/***********************
	//爲什麼要用二級指針**L,而不把head直接傳過來,用一級指針,例如
	int mian(void){
		...
		struct node *head;
		ref_initLink(head);
		...
	}
	int ref_initLink(struct node *L){
		...
		L = (struct node*)malloc(sizeof(struct node));
		...
	}
	//這時,貌似直接改變了head中所存儲的地址,讓head指向了新分配的內存,但其實不然。
	//上述這種參數傳遞方法,其實仍然是按值傳遞,head是head,L是L。
	//L是函數臨時創建的副本,L在initLink結束後會被銷燬,而head內的值(所存的地址、也就是指向)並沒有改變
	//真正指向分配好的空間的指針是L,但是可惜,L在函數結束時會被銷燬掉
	//如果不想使用二級指針,那麼就要修改函數
	//首先,函數不能返回int值,而要返回指向結構體的指針
	//其次,函數不接收參數,所有的動作函數自己完成,更改後如下
************************/

/*
名稱:初始化鏈表(2)(不改變主調函數中的指針head)
功能:製造一個頭節點
接收:void
返回:指向結構體的指針
*/
struct node* initLink(void){
	//函數自己定義一個指向結構體的指針L
	struct node* L;
	//給L分配空間
	L = (struct node*)malloc(sizeof(struct node));
	//age置爲0,next置爲空
	L->age = 0;
	L->next = NULL;
	//返回L,main中會有一個同樣爲struct node型的指針來接收這個L
	return L;
}
/***********************
//主函數可以寫成如下,例如
int mian(void){
...
struct node *head;
head = initLink(void);
...
return 0;
}
head接收到函數返回的L,所以head就成了頭節點
************************/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章