欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、理解指針

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

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

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

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

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

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

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

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

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

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

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

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

  不知道你有沒有這樣的感覺,寫鏈表代碼的時(shí)候,指針指來(lái)指去,一會(huì)兒就不知道指到哪里了。所以,我們?cè)趯懙臅r(shí)候,一定注意不要弄丟了指針。指針往往都是怎么弄丟的呢?我拿單鏈表的插入操作為例來(lái)給你分析一下。

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

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

p->next = x; // 將p的next指針指向x結(jié)點(diǎn);
x->next = p->next; // 將x的結(jié)點(diǎn)的next指針指向b結(jié)點(diǎn);

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

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

    淺談 C++17 里的 Visitor 模式

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

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

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

    關(guān)于C語(yǔ)言strlen與sizeof區(qū)別詳情

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

    C++中new與delete、malloc與free應(yīng)用分析

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

    C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷

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

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

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

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

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

    深入理解C語(yǔ)言的new[]和delete[]

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

最新評(píng)論