在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

雙向循環鏈表的創建

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程學習基地 ? 2022-05-24 16:27 ? 次閱讀

雙向循環鏈表和它名字的表意一樣,就是把雙向鏈表的兩頭連接,使其成為了一個環狀鏈表。只需要將表中最后一個節點的next指針指向頭節點,頭節點的prior指針指向尾節點,鏈表就能成環兒,如圖所示:

c0a72b46-db39-11ec-ba43-dac502259ad0.jpg

需要注意的是,雖然雙向循環鏈表成環狀,但本質上還是雙向鏈表,因此在雙向循環鏈表中,依然能夠找到頭指針和頭節點等。雙向循環鏈表和雙向鏈表相比,唯一的不同就是雙向循環鏈表首尾相連,其他都完全一樣。

注意:因為我上面已經講了雙向鏈表,所以這里只注重講他們的實現差異。另因為帶頭節點會更好操作,所以我的代碼都有頭節點。

1、雙向循環鏈表的創建

初始化時需要將頭節點的next和prior都指向自己。

c0be579e-db39-11ec-ba43-dac502259ad0.jpg

//1、初始化雙向循環鏈表(帶頭節點)

Status initLinkList(LinkList *list){

//創建頭節點

*list = malloc(sizeof(Node));

if (*list == NULL) {

return ERROR;

}

//前驅和后繼都指向自己

(*list)->prior = *list;

(*list)->data = -1;

(*list)->next = *list;

printf("已初始化鏈表~ ");

return OK;

}

2、遍歷雙向循環鏈表

注意它的尾節點的next不再是Null,而是頭節點

//2、遍歷雙向循環鏈表

void printfLinkLisk(LinkList list){

printf("遍歷鏈表: ");

if (list == NULL || list->next == list) {

printf("這是一個空鏈表 ");

return;

}

LinkList p = list;

//判斷next是否全部正確

printf("根據next從前往后遍歷:");

while (p->next != list) {

printf("%d ",p->next->data);

p = p->next;

}

printf(" ");

//判斷prior是否全部正確

printf("根據prior從后往前遍歷:");

while (p != list) {

printf("%d ",p->data);

p = p->prior;

}

printf(" ");

}

3、根據索引位置添加節點

這里不需要判斷尾節點的next是否為Null,因為它會指向頭節點。

//3、根據索引位置插入數據至鏈表中

Status insertLinkList(LinkList *list, int index, ElemType data){

if (list == NULL || index < 0) {

return ERROR;

}

int i = 0;

LinkList priorNode = *list;

//判斷插入的位置,這里開始位置是0,index超過鏈表長度則插入末尾

while (i < index && priorNode->next != *list) {

priorNode = priorNode->next;

i++;

}

LinkList newNode = malloc(sizeof(Node));

if (newNode == NULL) {

return ERROR;

}

newNode->data = data;

//插入操作共四步,看好了,別眨眼

//1.將priorNode->next節點的前驅指向新節點

priorNode->next->prior = newNode;

//2.將新節點->next指向原來的priorNode->next

newNode->next = priorNode->next;

//3.將priorNode->next指向新節點

priorNode->next = newNode;

//4.新節點的前驅指向priorNode

newNode->prior = priorNode;

return OK;

}

4、根據索引位置刪除節點

這里不需要判斷尾節點的next是否為Null,因為它會指向頭節點。

//4、根據索引位置刪除節點

Status deleteLinkListByIndex(LinkList *list, int index, ElemType *data){

if (*list == NULL || index < 0) {

return ERROR;

}

LinkList locaNode = *list;

int i = 0;

//注意別刪了頭節點

while (i <= index) {

locaNode = locaNode->next;

if (locaNode == *list) {

printf("沒有這個你想要刪除的節點 ");

return ERROR;

}

i++;

}

//開始刪除,只需要做兩步

locaNode->prior->next = locaNode->next;

locaNode->next->prior = locaNode->prior;

*data = locaNode->data;

free(locaNode);

return OK;

}

5、根據存儲的值刪除節點

這里不需要判斷尾節點的next是否為Null,因為它會指向頭節點。

//5、根據存儲的值刪除節點

Status deleteLinkListByData(LinkList *list, ElemType data){

if (*list == NULL) {

return ERROR;

}

LinkList locaNode = (*list)->next;

while (locaNode != *list) {

if (locaNode->data == data) {

break;

}

locaNode = locaNode->next;

}

if (locaNode == *list) {

printf("沒有這個你想要刪除的節點 ");

return ERROR;

}

//開始刪除,只需要做兩步

locaNode->prior->next = locaNode->next;

locaNode->next->prior = locaNode->prior;

free(locaNode);

return OK;

}

6、根據值查找節點

尾節點的next可是頭節點哦,找到它就是最后一個了。

//6、查找元素

Status selectNode(LinkList list, ElemType data, LinkList *locaNode){

if (list == NULL) {

return ERROR;

}

LinkList p = list->next;

while (p != list) {

if (p->data == data) {

*locaNode = p;

break;

}

p = p->next;

}

if (*locaNode == NULL) {

printf("沒有這個你想要的節點 ");

return ERROR;

}

else {

return OK;

}

}

其它代碼

#include "stdlib.h"

#define OK 1

#define ERROR 0

//元素類型

typedef int ElemType;

//狀態類型

typedef int Status;

//定義節點結構體

typedef struct Node {

struct Node *prior;

ElemType data;

struct Node *next;

} Node;

typedef Node *LinkList;

int main(int argc, const char * argv[]) {

LinkList list;

initLinkList(&list);

for (int i = 0; i < 10; i ++) {

insertLinkList(&list, i, i);

}

printfLinkLisk(list);

int index, data;

printf("輸入你想插入的位置(從0開始)和存儲的值:");

scanf("%d %d",&index,&data);

insertLinkList(&list, index, data);

printfLinkLisk(list);

printf("輸入你想刪除的位置(從0開始):");

scanf("%d",&index);

deleteLinkListByIndex(&list, index, &data);

printfLinkLisk(list);

printf("輸入你想刪除的節點的值(只刪最前的那個):");

scanf("%d",&data);

deleteLinkListByData(&list, data);

printfLinkLisk(list);

printf(" ");

return 0;

}

輸出結果:

c0cf2b46-db39-11ec-ba43-dac502259ad0.jpg

—END—

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 節點
    +關注

    關注

    0

    文章

    218

    瀏覽量

    24431
  • 鏈表
    +關注

    關注

    0

    文章

    80

    瀏覽量

    10560

原文標題:【C語言教程】“雙向循環鏈表”學習總結及其代碼實現!

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    雙向變流器的工作原理是什么

    雙向變流器(Bidirectional Converter)是一種電力電子設備,它能夠實現交流(AC)和直流(DC)之間的能量雙向轉換。這種設備在許多應用中都非常有用,比如電動汽車的充電和放電
    的頭像 發表于 09-21 09:49 ?1037次閱讀

    智能電表雙向計量是什么意思?

    智能電表雙向計量是指智能電表能夠同時記錄電力的輸入和輸出數據,即不僅能夠計量用戶消耗的電力,還能計量用戶向電網輸送的電力。本文將詳細探討智能電表雙向計量的功能、技術實現及其應用場景。一、雙向計量
    的頭像 發表于 09-13 17:28 ?647次閱讀
    智能電表<b class='flag-5'>雙向</b>計量是什么意思?

    雙向tvs有正負極嗎安全嗎

    有正負極,是安全的。雙向TVS(Transient Voltage Suppressor,瞬態電壓抑制器)是一種用于保護電子設備免受電壓瞬變影響的半導體器件。它具有雙向導電特性,可以同時抑制正向
    的頭像 發表于 08-01 10:07 ?655次閱讀

    雙向tvs管怎么測量好壞

    雙向TVS(Transient Voltage Suppressor)是一種用于保護電子設備免受瞬態電壓沖擊的半導體器件。雙向TVS管具有雙向導電特性,可以同時對正向和負向的瞬態電壓進行保護。本文將
    的頭像 發表于 08-01 09:45 ?1586次閱讀

    循環神經網絡的基本概念

    循環神經網絡(Recurrent Neural Network,簡稱RNN)是一種具有循環結構的神經網絡,其核心思想是將前一個時間步的輸出作為下一個時間步的輸入,從而實現對序列數據的建模。本文將從
    的頭像 發表于 07-04 14:31 ?689次閱讀

    ESP32-S3的LCD接口可以用DMA鏈表來觸發發送數據嗎?

    因為是用來驅動LED顯示屏,用原來的I2S那樣并行,通過鏈接自己組織數據列表,還是比較方便的,現在S3的I2S好像已經不能并行發數據了,只能用LCD的接口了,所以想知道LCD接口的DMA能不能用鏈表來組織數據。
    發表于 06-17 07:25

    CRC(循環冗余校驗)應用舉例

    CRC(循環冗余校驗)應用舉例
    的頭像 發表于 05-16 16:12 ?1211次閱讀

    OpenHarmony語言基礎類庫【@ohos.util.LinkedList (線性容器LinkedList)】

    LinkedList底層通過雙向鏈表實現,雙向鏈表的每個節點都包含對前一個元素和后一個元素的引用。當需要查詢元素時,可以從頭遍歷,也可以從尾部遍歷,插入、刪除效率高,查詢效率低。Lin
    的頭像 發表于 05-11 16:16 ?537次閱讀
    OpenHarmony語言基礎類庫【@ohos.util.LinkedList (線性容器LinkedList)】

    什么是PLC循環移位指令 PLC循環移位的特點

    PLC循環移位指令包括循環左移指令和循環右移指令。在循環移位過程中,移出的位并不會丟失,而是會放回空出的位上,形成一個環形移位。
    的頭像 發表于 03-07 16:57 ?2148次閱讀
    什么是PLC<b class='flag-5'>循環</b>移位指令 PLC<b class='flag-5'>循環</b>移位的特點

    verilog雙向端口的使用

    在Verilog硬件描述語言中,端口是指連接模塊(Module)與其他模塊、寄存器或是物理設備的輸入或輸出接口。單向端口可以作為輸入或輸出使用,而雙向端口具有雙重作用,既可以接收輸入信號,又可以輸出
    的頭像 發表于 02-23 10:18 ?1412次閱讀

    數組和鏈表在內存中的區別 數組和鏈表的優缺點

    數組和鏈表在內存中的區別 數組和鏈表的優缺點? 數組和鏈表是常見的數據結構,用于組織和存儲數據。它們在內存中的存儲方式以及優缺點方面存在一些顯著的差異。本文將詳細探討這些差異以及它們的優缺點。 1.
    的頭像 發表于 02-21 11:30 ?1041次閱讀

    數組和鏈表有何區別

    數組和鏈表的區別,這個問題,不僅面試中經常遇到,考研的同學也得掌握才行。
    的頭像 發表于 02-19 15:33 ?512次閱讀
    數組和<b class='flag-5'>鏈表</b>有何區別

    arduino如何停止loop循環

    Arduino的loop循環是其主要的程序執行部分,該循環將在Arduino開發板上持續運行,并且只有在程序被重新上傳或開發板斷電重啟時才會停止。然而,在某些情況下,你可能需要在程序執行過程中停止或
    的頭像 發表于 02-14 16:24 ?4545次閱讀

    arduino中while循環怎么跳出

    Arduino 是一款開源的硬件平臺,廣泛應用于各種物聯網和嵌入式系統項目。在 Arduino 上編寫代碼時,循環結構起到了至關重要的作用。而其中的 while 循環更是常用于需要根據特定條件重復
    的頭像 發表于 02-14 16:22 ?2592次閱讀

    循環指令loop規定循環次數

    循環指令是計算機編程中非常重要的概念,它允許程序重復執行一段代碼塊,使得程序可以更有效地處理大量數據和重復性任務。在本文中,我們將詳盡、詳實、細致地介紹循環指令的相關概念、語法和應用場
    的頭像 發表于 02-14 16:10 ?1675次閱讀
    主站蜘蛛池模板: 五月天婷婷电影| 福利视频999| 午夜免费毛片| 天天网综合| 成人男女啪啪免费观看网站| 午夜精品网| 国产成人91青青草原精品| 天天色综| 国产福利午夜自产拍视频在线| 毛片基地在线| 免费一级毛片| www.av123| 加勒比日本道| 一级毛片在线| 国产农村一级特黄α真人毛片| 午夜精品视频在线| 干干操| 亚洲swag精品自拍一区| 欧美午夜电影| 亚洲网站大全| 91在线播放免费不卡无毒| 性色在线视频| 97综合色| 日韩高清成人毛片不卡| 四虎永久在线日韩精品观看| 久久精品国产6699国产精| 一级视频在线观看免费| 成人牲交一极毛片| 69精品在线观看| 国产女人18毛片水真多18精品| jiucao在线观看精品| 四虎影视入口| 俺来也俺去啦久久综合网| videosxxoo18欧美| 欧美成人精品一级高清片| 久久夜夜视频| 九九九国产在线| 国产精品久久久久网站| 在线看av网址| 久久这里只有精品免费视频| 欧美三级成人|