1. 程式人生 > >連結串列中LinkList L與LinkList *L的區別

連結串列中LinkList L與LinkList *L的區別

typedef struct Node{
int elem;
struct node * next;
}node,*LinkList;

對於LinkList L: L是指向定義的node結構體的指標,可以用->運算子來訪問結構體成員,即L->elem,而(*L)就是個Node型的結構體了,可以用點運算子訪問該結構體成員,即(*L).elem;

對於LinkList *L:L是指向定義的Node結構體指標的指標,所以(*L)是指向Node結構體的指標,可以用->運算子來訪問結構體成員,即(*L)->elem,當然,(**L)就是Node型結構體了,所以可以用點運算子來訪問結構體成員,即(**L).elem;

在連結串列操作中,我們常常要用連結串列變數作物函式的引數,這時,用LinkList L還是LinkList *L就很值得考慮深究了,一個用不好,函式就會出現邏輯錯誤,其準則是:
如果函式會改變指標L的值,而你希望函式結束呼叫後儲存L的值,那你就要用LinkList *L,這樣,向函式傳遞的就是指標的地址,結束呼叫後,自然就可以去改變指標的值;
而如果函式只會修改指標所指向的內容,而不會更改指標的值,那麼用LinkList L就行了;

下面說個具體例項吧!

#include <stdio.h>
#include <stdlib.h>

typedef int
ElemType; typedef struct Node{ ElemType elem; struct Node * next; }Node, * LinkList;

//初始化連結串列,函式呼叫完畢後,L會指向一個空的連結串列,即會改變指標的值,所以要用*L

void InitList(LinkList *L)
{
 *L = (LinkList)malloc(sizeof(Node));
 (*L)->next = NULL;
}

//清空連結串列L,使L重新變為空連結串列,函式呼叫完後不會改變指標L的值,只會改變指標L所指向的內容(即L->next的值)

void ClearList(LinkList L)
{ LinkList p; while(p = L->next) free(p); }

//銷燬連結串列L,釋放連結串列L申請的記憶體,使L的值重新變為NULL,所以會改變L的值,得用*L

void DestroyList(LinkList *L)
{
 LinkList p;
 while(p = (*L)->next )
  free(p);
 free(*L);
 *L = NULL;
}

void main()
{
 LinkList L = NULL;
 InitList(&L);
 ClearList(L);
 DestroyList(&L);
}