《數(shù)據(jù)結(jié)構(gòu)》第十一篇闭专、線性表中的鏈式存儲結(jié)構(gòu)--循環(huán)鏈表

頭文字D.jpg

引言

鏈表還有一種常用的形式,那就是循環(huán)鏈表旧烧,看到循環(huán)兩個字影钉,相比都已經(jīng)知道他是怎樣的鏈表了吧,是的掘剪,他就是一種首尾相連的鏈表平委,這樣的鏈表形成了一個環(huán)的形狀。

什么是循環(huán)鏈表杖小?

上文已經(jīng)說了肆汹,循環(huán)鏈表是首尾相接的一種鏈表,他的尾結(jié)點的后繼指針又指向鏈表的第一個結(jié)點予权,這樣形成了一個環(huán)昂勉。對于循環(huán)鏈表,從表中的任何一個結(jié)點出發(fā)扫腺,都能找到其他所有的結(jié)點岗照。
下圖展示的就是一個單向的循環(huán)鏈表


單項循環(huán)鏈表.png

循環(huán)鏈表的形式有很多種,如雙向循環(huán)鏈表笆环,多重循環(huán)鏈表(將表中結(jié)點鏈在多個環(huán)上)等攒至。
我們來看下多重循環(huán)鏈表的示意圖:


多重循環(huán)鏈表.png

上面的多重循環(huán)鏈表中的14元素,他所在的結(jié)點既在左邊的循環(huán)表中躁劣,也在右邊的循環(huán)表中迫吐。
多重循環(huán)鏈表并不常用,本篇文章主要講解單鏈的循環(huán)鏈表账忘。

循環(huán)鏈表既有單鏈表的優(yōu)點又有雙鏈表的優(yōu)點志膀,相對于單鏈表,雙鏈表需要為每個結(jié)點增加部分存儲空間從而保存前驅(qū)指針的信息鳖擒,而循環(huán)鏈表無須增加存儲空間溉浙,只是改變了尾節(jié)點中后繼指針的指向,就使操作更加靈活多變蒋荚。

需要注意的是戳稽,循環(huán)鏈表中沒有NULL指針,涉及遍歷操作時期升,其終止條件就不再是非循環(huán)鏈表中判別pNode->next是否為空了惊奇,而是判別他們是否等于某一指定指針互躬,如頭指針或尾指針等
我們用代碼表示一下:

  //判斷是否與頭結(jié)點的指針指向相同,相同則表示已經(jīng)遍歷到最后的位置了
  if(pNode->next==pHead->next){
        ...  
  }

2赊时、循環(huán)鏈表的實現(xiàn)

在單鏈表中吨铸,從一個已知結(jié)點觸發(fā),只能訪問到該結(jié)點機器后繼結(jié)點祖秒,無法找到該結(jié)點之前的其他結(jié)點诞吱。而在單循環(huán)鏈表中,從任一結(jié)點出發(fā)竭缝,都可以訪問到表中的所有結(jié)點房维,這一優(yōu)點使某些運算更容易實現(xiàn)。
由于單循環(huán)鏈表的創(chuàng)建抬纸、查找元素等基本操作相同咙俩,所以這里主要介紹插入、刪除元素時與單鏈表的差別湿故。

1阿趁、插入元素

在循環(huán)鏈表中插入元素,如果是插入到第一個位置坛猪,即頭結(jié)點之后的位置脖阵,則稍微有點麻煩,因為這里需要處理3個指針墅茉,這3個指針分別是:

頭結(jié)點中的指針

尾結(jié)點中的指針

插入元素的結(jié)點指針

我們看下面圖來理解一下


插入第一個位置示意圖1.png
插入第一個位置示意圖2.png

我們看到命黔,當我們把元素插入到第一個位置時,需要將插入結(jié)點分別于頭結(jié)點就斤、尾結(jié)點悍募、原來的第一個元素結(jié)點相連接

這樣一來,單循環(huán)鏈表的插入操作 比 單鏈表處理多了一個尾結(jié)點指針的處理洋机。

在尾部插入元素時坠宴,也有所不同,p->next 不再指向NULL,而是指向head->next绷旗。

除此兩處外啄踊,在其他位置插入元素,則與單鏈表處理相同刁标。
我們來看下代碼實現(xiàn):

    int ClistInsert(pHead ph,int pos,int val){

          if(ph==NULL||pos<0||pos>ph->length)
           {
                  printf("插入元素時,參數(shù)傳入有誤!");
            }
            pNode pval=NULL;
            pval=(pNode)malloc(sizeof(struc Node));
            pval->data=val;
            //如果表為空址晕,直接將結(jié)點插入到頭結(jié)點之后膀懈,然后自己的next指向自己
            if(IsEmpty(ph)){
                    ph->next=pval;
                    pval->next=pval;
            }
            else{
                  //表不為空,則主要分為在頭部插入和在其他部分插入
                  pNode pRear=ph->next;
                  if(pos==0){
                      //在0號位置插入谨垃,需要先找到尾結(jié)點
                      while(pRear->next!=ph->next){
                              pRear=pRear->next;//指針向后移動
                      }
                      //while結(jié)束之后 pRear指向尾結(jié)點
                      //此時再插入元素
                      pval->next=ph->next;
                      ph->next=pval;
                      pRear->next=pval;//注意启搂,這三個步驟順序不能更改
                      }
                else{
                        //說明不是從0的位置插入硼控,這個時候只需要斷開指針,重新指定指針即可
                        pNode pCur=ph->next;
                        for(int i=1;i<pos;i++){
                            pCur=pCur->next;
                          }
                        //循環(huán)結(jié)束時就是說明此時pCur指向要插入位置
                        pval->next=pCur->next;
                        pCur->next=pval;//指針斷開又鏈接的過程

                        }
                  }
                  ph->length++;
                  return 1;
    }

ok胳赌,總結(jié)一下的話牢撼,就是:在插入新元素時,先判斷鏈表是否為空疑苫,如果為空熏版,則將元素插入到頭結(jié)點后,然后將其指針指向自身捍掺;如果不為空撼短,則根據(jù)插入的位置做出相應(yīng)的操作。代碼的注釋應(yīng)該能夠幫助大家看懂了~~~

2挺勿、刪除元素

在刪除元素時曲横,也要考慮刪除的是否是頭結(jié)點后的第一個結(jié)點,如果是不瓶,則需要將頭結(jié)點和尾結(jié)點的指針指向待刪除結(jié)點的后繼結(jié)點:
如圖所示

單循環(huán)鏈表刪除元素1.png
單循環(huán)鏈表刪除元素2.png
單循環(huán)鏈表刪除元素后.png

如果是刪除其他位置的元素禾嫉,則和單鏈表處理方式相同,其代碼實現(xiàn)如下:

pNode ClistDelete(pHead ph,int val){
        if(ph==NULL||ph->lenght==0){
        printf("參數(shù)傳入有誤蚊丐!")熙参;
        }
        //先找到鏈表的尾結(jié)點
        pNode pRear=ph->next;
        while(pRear!=ph->next){
           pRear=pRear->next;   
       }
        //查找要刪除的元素
        pNode pval=ClistFind(ph,val);//ClistFind方法跟第七篇的單鏈表查找元素方法相同
        if(pval==NULL){
            return NULL;
        }
        if(pval==ph->next){
            ph->next=pval->next;
            //讓尾結(jié)點指向要刪除元素后邊的結(jié)點
            pRear->next=pval->next;
        }else{
                    //找到pval的前驅(qū)結(jié)點
                  pNode pRe=ph->next;
                  for(int i=0;i<ph->length;i++){
                      //這樣pRe就是pval的前驅(qū)結(jié)點
                      if(val==pRe->data){
                             //更改指向就可以了
                              pRe->next=pval->next;
                              //返回刪除的結(jié)點
                               return pval; 
                              }
                        //讓指針后移
                        pRe=pRe->next;
                       }
                }
    //如果上方?jīng)]有返回值,則返回空
    return NULL;
}  

一句話總結(jié)

在循環(huán)鏈表中吠撮,處理插入和刪除操作與單鏈表稍有不同之外尊惰,其他操作與單鏈表都是一樣的。

大家加油哦~
多謝關(guān)注~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泥兰,一起剝皮案震驚了整個濱河市弄屡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鞋诗,老刑警劉巖膀捷,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異削彬,居然都是意外死亡全庸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門融痛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壶笼,“玉大人,你說我怎么就攤上這事雁刷「才” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長责语。 經(jīng)常有香客問我炮障,道長,這世上最難降的妖魔是什么坤候? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任胁赢,我火速辦了婚禮,結(jié)果婚禮上白筹,老公的妹妹穿的比我還像新娘智末。我一直安慰自己,他們只是感情好遍蟋,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布吹害。 她就那樣靜靜地躺著,像睡著了一般虚青。 火紅的嫁衣襯著肌膚如雪它呀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天棒厘,我揣著相機與錄音纵穿,去河邊找鬼。 笑死奢人,一個胖子當著我的面吹牛谓媒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播何乎,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼句惯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了支救?” 一聲冷哼從身側(cè)響起抢野,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎各墨,沒想到半個月后指孤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贬堵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年恃轩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黎做。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡叉跛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒸殿,到底是詐尸還是另有隱情昧互,我是刑警寧澤挽铁,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站敞掘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏楣铁。R本人自食惡果不足惜玖雁,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盖腕。 院中可真熱鬧赫冬,春花似錦、人聲如沸溃列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽听隐。三九已至补鼻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雅任,已是汗流浹背风范。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沪么,地道東北人硼婿。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像禽车,于是被迫代替她去往敵國和親寇漫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容