C語言通過鏈表瞭解指針

2020-08-12 22:54:05

C語言鏈表函數傳參通俗易懂


我們知道鏈表的基本單元就是一個結構體,如:
typedef struct Node
{
int val;
struct Node *next;
}Node,*pNode;
結構體中包括本結點的值和指向下一塊結構體的指針(C語言中不能在結構體中定義自己,所以需要存放結構體指針),通過指針將結點一個一個連線起來,形成簡單的單鏈表。
typedef 將定義結構體重新命名爲Node以及將定義結構體指針命名爲pNode,方便在後續程式設計中使用結構體。

首先來看一下簡單有關鏈表操作的函數宣告

void initLink(pNode *p); //初始化頭指針
void print(pNode p);     //列印鏈表的值
int getLength(pNode p);  //獲取鏈表的長度
//在指定位置上插入一個數據
void addByIndex(pNode *p,int index,int val); 

第一個函數,傳入的是指針,指向鏈表的頭結點指針,此時在主函數中 pNode head;只是對頭結點的一個宣告,要使用的話必須在ininLink函數中實現分配記憶體,傳參的本質是在記憶體新開闢一個空間,如果傳的參數是 pNode p,程式會在新開闢的空間中重新宣告一個p,這個與主函數的p有不一樣的記憶體地址,所分配的空間指向爲新宣告的p,無法爲主函數中p分配空間。當傳入是pNode p 時,爲p分配的記憶體就是主函數中p的記憶體,此時的p爲指向主函數head的指針。
弄懂函數傳參原理後,對後面幾個函數就有很好的理解。
第二個函數傳的pNode p,此時的p相當於head的副本,但副本中next的指向與主函數中head的next指向是相同的,相當於有兩頭指針同時指向一個鏈表。此函數是實現列印功能的,所以要小心數據的修改。
第三個函數與第二個函數差不多。
大部分都是這種情況!
在这里插入图片描述

第四個函數,傳參是pNode *p,在這裏其實跟傳pNode p的效果是一樣的,只是爲了不用重新在爲頭結點建立副本,也可以用帶返回值的函數。

總的來說,指針功能是非常的強大的,用得好的話,可以事半功倍,不好的話,就一大堆記憶體溢位問題。技術有限,還望多多包涵