先來看C語言創建鏈表、插入節點和遍歷鏈表的一段代碼:
[c]
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node{
ElemType elem;
struct Node *next;
}Node, *LinkedList;
//void init_linkedlist(LinkedList *list) {
void init_linkedlist(LinkedList *list) {
*list = (LinkedList)malloc(sizeof(Node));
(*list)->next = NULL;
}
void insert(LinkedList list, ElemType elem) {
Node *p, *q;
q = list;
p = (Node *)malloc(sizeof(Node));
p->elem = elem;
p->next = NULL;
while(q->next != NULL) q = q->next;
q->next = p;
}
void main() {
LinkedList list, p;
init_linkedlist(&list);
insert(list, 3);
insert(list, 4);
insert(list, 5);
p = list->next;
while(p != NULL) {
printf("%4d", p->elem);
p = p->next;
}
printf("\n");
}
這個小程序完成的功能很簡單,創建一個鏈表,然後插入3,4,5這三個整數,最後遍歷鏈表輸出每個節點中的整數。但是大家注意到沒有,在main函數中,初始化鏈表的函數參數的是一個二級指針,為什麼要使用一個二級指針作為參數呢?在任何一本C語言的教材上,都會寫C語言的函數參數傳遞是值傳遞方式,所有的參數都是通過值傳遞的,使用指針作為參數可以在函數中改變參數的值(此處感覺表達有誤,但是想不到更好的表達方式)。可能有人會有疑問了,在上面代碼的main函數中初始化鏈表的調用函數代碼
[java]
init_linkedlist(&list);
list已經是一個指針了,為什麼要傳遞一個指針的地址,直接使用指針不行嗎?確實不行。