1. 程式人生 > 程式設計 >C語言實現單鏈表反轉

C語言實現單鏈表反轉

一、理解指標

看懂連結串列的結構並不是很難,但是一旦把它和指標混在一起,就很容易讓人摸不著頭腦。所以,要想寫對連結串列程式碼,首先就要理解好指標。

  有些語言有“指標”的概念,比如 C 語言;有些語言沒有指標,取而代之的是“引用”,比如 Java、Python。不管是“指標”還是“引用”,實際上,它們的意思都是一樣的,都是儲存所指物件的記憶體地址。

  將某個變數賦值給指標,實際上就是將這個變數的地址賦值給指標,或者反過來說,指標中儲存了這個變數的記憶體地址,指向了這個變數,通過指標就能找到這個變數。

  p->next=q。這行程式碼是說,p 結點中的 next 指標儲存了 q 結點的記憶體地址。p->next=p->next->next。這行程式碼表示,p 結點的 next 指標儲存了 p 結點的下下一個結點的記憶體地址。

C語言標準規定,對於一個符號的定義,編譯器總是從它的名字開始讀取,然後按照優先順序順序依次解析。對,從名字開始,不是從開頭也不是從末尾,這是理解複雜指標的關鍵! 

對於初學者,有幾種運算子的優先順序非常容易混淆,它們的優先順序從高到低依次是:

定義中被括號( )括起來的那部分。字尾操作符:括號( )表示這是一個函式,方括號[ ]表示這是一個數組。字首操作符:星號*表示“指向xxx的指標”。

  在本章中我們最多隻用到二級指標因此將對二級指標做下說明。比如int **p,是什麼意思?

首先看 *p 。 “*”表示P是一個指標。但是是指向什麼的指標呢?

在看前面的int*,int是一個整型型別後面加一個“*”表示整型型別的指標。

  *p就是指向整型型別指標的指標。p儲存的是整型型別指標的地址。

二、警惕指標丟失和記憶體洩漏

  不知道你有沒有這樣的感覺,寫連結串列程式碼的時候,指標指來指去,一會兒就不知道指到哪裡了。所以,我們在寫的時候,一定注意不要弄丟了指標。指標往往都是怎麼弄丟的呢?我拿單鏈表的插入操作為例來給你分析一下。

  指標往往都是怎麼弄丟的呢?我拿單鏈表的插入操作為例來給你分析一下。

C語言實現單鏈表反轉

  如圖所示,我們希望在結點 a 和相鄰的結點 b 之間插入結點 x,假設當前指標 p 指向結點 a。如果我們將程式碼實現變成下面這個樣子,就會發生指標丟失和記憶體洩露。

p->next = x; // 將p的next指標指向x結點;
x->next = p->next; // 將x的結點的next指標指向b結點;

  初學者經常會在這兒犯錯。p->next 指標在完成第一步操作之後,已經不再指向結點 b 了,而是指向結點 x。第 2 行程式碼相當於將 x 賦值給 x->next,自己指向自己。因此,整個連結串列也就斷成了兩半,從結點 b 往後的所有結點都無法訪問到了。

  對於有些語言來說,比如 C 語言,記憶體管理是由程式設計師負責的,如果沒有手動釋放結點對應的記憶體空間,就會產生記憶體洩露。所以,我們插入結點時,一定要注意操作的順序,要先將結點 x 的 next 指標指向結點 b,再把結點 a 的 next 指標指向結點 x,這樣才不會丟失指標,導致記憶體洩漏。所以,對於剛剛的插入程式碼,我們只需要把第 1 行和第 2 行程式碼的順序顛倒一下就可以了。同理,刪除連結串列結點時,也一定要記得手動釋放記憶體空間,否則,也會出現記憶體洩漏的問題。當然,對於像 Java 這種虛擬機器自動管理記憶體的程式語言來說,就不需要考慮這麼多了。

三、單鏈表反轉的C語言實現

C語言實現單鏈表反轉

  使用p指向第一個結點,cur指向當前結點,每次把cur->next結點摘掉放在p節點前面。然後更新p結點指向頭結點。具體實現程式碼如下所示

 void revers_list(list1 **l)
 {
   if(!(*l)||!l)
   {
     exit(-1);
   }
 
   list1 *start=*l;
   list1 *start_next=NULL;
 
   while (start->next)
   {
     // 獲取當前節點的後繼節點 
     start_next = start->next; 
     // 將後繼節點摘鏈 72   
      start->next = start_next->next; 
     // 將後繼節點提到最前面 
     start_next->next = *l; 
     // 更新頭節點 
     *l = start_next;
   }
 }

到此這篇關於C語言實現單鏈表反轉的文章就介紹到這了,更多相關C語言 單鏈表反轉內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!