先看一個初始化帶頭結點單鏈表的例子,LNode是結點變數,LinkList是結點指標變數,等同于LNode*
typedef struct LNode{ // 定義單鏈表節點型別 int data; struct LNode *next; }LNode,*LinkList;
例1、錯誤的方法:初始化帶頭結點的單鏈表
void InitList(LinkList L) { L = (LinkList)malloc(sizeof(LNode)); L->data = https://www.cnblogs.com/366Z/p/3; L->next = NULL; } void Empty(LinkList L) { if(NULL == L) { printf("鏈表不存在\n"); } else if(NULL == L->next) { printf("空表\n"); } } int main() { LNode p; p.data = 2; printf("p.data = https://www.cnblogs.com/366Z/p/%d/n",p.data); LinkList L = NULL; InitList(L); printf("L->data = https://www.cnblogs.com/366Z/p/%d/n",L->data); return 0; }
輸出結果:p.data = https://www.cnblogs.com/366Z/p/2 鏈表不存在
例2、正確的方法:初始化帶頭結點的單鏈表
void InitList(LinkList *L) { (*L) = (LinkList)malloc(sizeof(LNode)); (*L)->data = https://www.cnblogs.com/366Z/p/3; (*L)->next = NULL; } void Empty(LinkList L) { if(NULL == L) { printf("鏈表不存在\n"); } else if(NULL == L->next) { printf("空表\n"); } } int main() { LNode p; p.data = 2; printf("p.data = https://www.cnblogs.com/366Z/p/%d/n",p.data); LinkList L = NULL; InitList(&L); printf("L->data = https://www.cnblogs.com/366Z/p/%d/n",L->data); return 0; }
輸出結果:
p.data = https://www.cnblogs.com/366Z/p/2
空表
L->data = https://www.cnblogs.com/366Z/p/3
為什么第一個 InitList(LinkList L)函式不能初始化單鏈表L呢?不是用的地址傳遞嗎?
答:
問題就在于L = (LinkList)malloc(sizeof(LNode));
這里的 L 是InitList函式的形參,也就是區域變數,函式運行結束后就不存在了,
而main函式中的 L 指標變數,實際上是存盤在全域變數中的,兩個L不是同一個L,
例1中,main函式中的 LinkList L 一開始是指向 NULL的
從InitList(L)執行開始,雖然InitList函式中也是對L進行操作,但是此時的L 是InitList函式中的形參L ,之后的也都是對于形參的操作,如下圖
例1 中傳入的是LinkList 變數L,屬于一級指標,不能對實參指標變數 L本身進行操作,來修改實參 L 的值,使得L指向新分配的LNode,所以實參 L 還是指向NULL,因為輸出結果“鏈表不存在”,
例2中,傳入的是LinkList 變數的指標 &L,屬于二級指標,可以對實參指標變數 L 本身進行操作,來修改實參 L 的值,使得L指向新分配的LNode,(*L) = (LinkList)malloc(sizeof(LNode));
作者:猿DUDU,鏈接:https://juejin.cn/post/6947208722871484424
PS:另外對于學習編程或者正在作業的朋友,如果你想更好的提升你的編程能力乃至轉行,彎道超車,快人一步!筆者這里或許可以幫到你~
C語言C++編程學習交流圈子【點擊進入】微信公眾號:C語言編程學習基地
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習書籍分享:

編程學習視頻分享:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/273108.html
標籤:C
上一篇:編程學習 | 編譯與解釋
