亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言實現(xiàn)單鏈表反轉(zhuǎn)

 更新時間:2020年07月24日 16:29:44   作者:一碼&當先  
這篇文章主要介紹了C語言實現(xiàn)單鏈表反轉(zhuǎn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、理解指針

看懂鏈表的結構并不是很難,但是一旦把它和指針混在一起,就很容易讓人摸不著頭腦。所以,要想寫對鏈表代碼,首先就要理解好指針。

  有些語言有“指針”的概念,比如 C 語言;有些語言沒有指針,取而代之的是“引用”,比如 Java、Python。不管是“指針”還是“引用”,實際上,它們的意思都是一樣的,都是存儲所指對象的內(nèi)存地址。

  將某個變量賦值給指針,實際上就是將這個變量的地址賦值給指針,或者反過來說,指針中存儲了這個變量的內(nèi)存地址,指向了這個變量,通過指針就能找到這個變量。

  p->next=q。這行代碼是說,p 結點中的 next 指針存儲了 q 結點的內(nèi)存地址。p->next=p->next->next。這行代碼表示,p 結點的 next 指針存儲了 p 結點的下下一個結點的內(nèi)存地址。

C語言標準規(guī)定,對于一個符號的定義,編譯器總是從它的名字開始讀取,然后按照優(yōu)先級順序依次解析。對,從名字開始,不是從開頭也不是從末尾,這是理解復雜指針的關鍵! 

 對于初學者,有幾種運算符的優(yōu)先級非常容易混淆,它們的優(yōu)先級從高到低依次是:

定義中被括號( )括起來的那部分。后綴操作符:括號( )表示這是一個函數(shù),方括號[ ]表示這是一個數(shù)組。前綴操作符:星號*表示“指向xxx的指針”。

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

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

在看前面的int* ,int是一個整型類型后面加一個“*”表示整型類型的指針。

  *p就是指向整型類型指針的指針。p保存的是整型類型指針的地址。

二、警惕指針丟失和內(nèi)存泄漏

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

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

  如圖所示,我們希望在結點 a 和相鄰的結點 b 之間插入結點 x,假設當前指針 p 指向結點 a。如果我們將代碼實現(xiàn)變成下面這個樣子,就會發(fā)生指針丟失和內(nèi)存泄露。

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

  初學者經(jīng)常會在這兒犯錯。p->next 指針在完成第一步操作之后,已經(jīng)不再指向結點 b 了,而是指向結點 x。第 2 行代碼相當于將 x 賦值給 x->next,自己指向自己。因此,整個鏈表也就斷成了兩半,從結點 b 往后的所有結點都無法訪問到了。

  對于有些語言來說,比如 C 語言,內(nèi)存管理是由程序員負責的,如果沒有手動釋放結點對應的內(nèi)存空間,就會產(chǎn)生內(nèi)存泄露。所以,我們插入結點時,一定要注意操作的順序,要先將結點 x 的 next 指針指向結點 b,再把結點 a 的 next 指針指向結點 x,這樣才不會丟失指針,導致內(nèi)存泄漏。所以,對于剛剛的插入代碼,我們只需要把第 1 行和第 2 行代碼的順序顛倒一下就可以了。同理,刪除鏈表結點時,也一定要記得手動釋放內(nèi)存空間,否則,也會出現(xiàn)內(nèi)存泄漏的問題。當然,對于像 Java 這種虛擬機自動管理內(nèi)存的編程語言來說,就不需要考慮這么多了。

三、單鏈表反轉(zhuǎn)的C語言實現(xiàn)

  使用p指向第一個結點,cur指向當前結點,每次把cur->next結點摘掉放在p節(jié)點前面。然后更新p結點指向頭結點。具體實現(xiàn)代碼如下所示

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

到此這篇關于C語言實現(xiàn)單鏈表反轉(zhuǎn)的文章就介紹到這了,更多相關C語言 單鏈表反轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于Qt開發(fā)獲取CTP量化交易接口測試數(shù)據(jù)工具

    基于Qt開發(fā)獲取CTP量化交易接口測試數(shù)據(jù)工具

    這篇文章主要為大家詳細介紹了如何使用Qt軟件開發(fā)K線股P相關軟件,先開發(fā)一個通過CTP量化交易的sdk獲取相關推送數(shù)據(jù)的工具,需要的可以參考下
    2024-04-04
  • C語言中進行大小寫字母轉(zhuǎn)化的示例代碼

    C語言中進行大小寫字母轉(zhuǎn)化的示例代碼

    C語言標準庫中提供了用于大小寫轉(zhuǎn)換的函數(shù),使得這一操作變得簡單而高效,本文將詳細介紹如何在C語言中進行大小寫字母的轉(zhuǎn)換,包括相關的函數(shù)和示例代碼,需要的朋友可以參考下
    2024-03-03
  • 淺談 C++17 里的 Visitor 模式

    淺談 C++17 里的 Visitor 模式

    Visitor模式經(jīng)常用于將更新的設計封裝在一個類中,并且由待更改的類提供一個接受接口,其關鍵技術在于雙分派技術,本文主要介紹 C++17 里的 Visitor 模式的相關資料,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C++編程面向?qū)ο笕腴T全面詳解

    C++編程面向?qū)ο笕腴T全面詳解

    這篇文章主要為大家介紹了C++面向?qū)ο笕腴T的全面詳解,文章較長非常全面建議收藏閱讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • 關于C語言strlen與sizeof區(qū)別詳情

    關于C語言strlen與sizeof區(qū)別詳情

    對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別,今天得這篇文章我們就來學習C語言strlen與sizeof區(qū)別的相關資料,需要的朋友可以參考一下
    2021-10-10
  • C++中new與delete、malloc與free應用分析

    C++中new與delete、malloc與free應用分析

    這篇文章主要介紹了C++中new與delete、malloc與free應用分析,很重要的概念,需要的朋友可以參考下
    2014-08-08
  • C++ 數(shù)據(jù)結構完全二叉樹的判斷

    C++ 數(shù)據(jù)結構完全二叉樹的判斷

    這篇文章主要介紹了C++ 數(shù)據(jù)結構完全二叉樹的判斷的相關資料,需要的朋友可以參考下
    2017-06-06
  • 淺談c++11線程的互斥量

    淺談c++11線程的互斥量

    互斥量是個類對象,理解成一把鎖(保護共享數(shù)據(jù),其他想操作共享數(shù)據(jù)的線程必須等待解鎖),互斥量使用要小心,保護數(shù)據(jù)不多也不少,少了則沒達到保護效果,多了則影響效率。本文將介紹c++11線程的互斥量,感興趣的同學,可以參考下。
    2021-06-06
  • 深入理解strcpy與memcpy的區(qū)別

    深入理解strcpy與memcpy的區(qū)別

    本篇文章是對strcpy與memcpy的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 深入理解C語言的new[]和delete[]

    深入理解C語言的new[]和delete[]

    new和delete既是C++中的關鍵字也是一種特殊的運算符。這篇文章主要介紹了C++的new和delete詳解,需要的朋友可以參考下
    2021-09-09

最新評論