91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

雙向循環(huán)鏈表的創(chuàng)建

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程學(xué)習(xí)基地 ? 2022-05-24 16:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

1、雙向循環(huán)鏈表的創(chuàng)建

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

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

//1、初始化雙向循環(huán)鏈表(帶頭節(jié)點)

Status initLinkList(LinkList *list){

//創(chuàng)建頭節(jié)點

*list = malloc(sizeof(Node));

if (*list == NULL) {

return ERROR;

}

//前驅(qū)和后繼都指向自己

(*list)->prior = *list;

(*list)->data = -1;

(*list)->next = *list;

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

return OK;

}

2、遍歷雙向循環(huán)鏈表

注意它的尾節(jié)點的next不再是Null,而是頭節(jié)點

//2、遍歷雙向循環(huán)鏈表

void printfLinkLisk(LinkList list){

printf("遍歷鏈表: ");

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

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

return;

}

LinkList p = list;

//判斷next是否全部正確

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

while (p->next != list) {

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

p = p->next;

}

printf(" ");

//判斷prior是否全部正確

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

while (p != list) {

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

p = p->prior;

}

printf(" ");

}

3、根據(jù)索引位置添加節(jié)點

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

//3、根據(jù)索引位置插入數(shù)據(jù)至鏈表中

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節(jié)點的前驅(qū)指向新節(jié)點

priorNode->next->prior = newNode;

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

newNode->next = priorNode->next;

//3.將priorNode->next指向新節(jié)點

priorNode->next = newNode;

//4.新節(jié)點的前驅(qū)指向priorNode

newNode->prior = priorNode;

return OK;

}

4、根據(jù)索引位置刪除節(jié)點

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

//4、根據(jù)索引位置刪除節(jié)點

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

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

return ERROR;

}

LinkList locaNode = *list;

int i = 0;

//注意別刪了頭節(jié)點

while (i <= index) {

locaNode = locaNode->next;

if (locaNode == *list) {

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

return ERROR;

}

i++;

}

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

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

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

*data = locaNode->data;

free(locaNode);

return OK;

}

5、根據(jù)存儲的值刪除節(jié)點

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

//5、根據(jù)存儲的值刪除節(jié)點

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("沒有這個你想要刪除的節(jié)點 ");

return ERROR;

}

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

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

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

free(locaNode);

return OK;

}

6、根據(jù)值查找節(jié)點

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

//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("沒有這個你想要的節(jié)點 ");

return ERROR;

}

else {

return OK;

}

}

其它代碼

#include "stdlib.h"

#define OK 1

#define ERROR 0

//元素類型

typedef int ElemType;

//狀態(tài)類型

typedef int Status;

//定義節(jié)點結(jié)構(gòu)體

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("輸入你想刪除的節(jié)點的值(只刪最前的那個):");

scanf("%d",&data);

deleteLinkListByData(&list, data);

printfLinkLisk(list);

printf(" ");

return 0;

}

輸出結(jié)果:

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

—END—

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 節(jié)點
    +關(guān)注

    關(guān)注

    0

    文章

    229

    瀏覽量

    25573
  • 鏈表
    +關(guān)注

    關(guān)注

    0

    文章

    80

    瀏覽量

    11064

原文標(biāo)題:【C語言教程】“雙向循環(huán)鏈表”學(xué)習(xí)總結(jié)及其代碼實現(xiàn)!

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    功率循環(huán)基礎(chǔ)篇(二) —— 功率循環(huán)壽命曲線解讀

    功率循環(huán)壽命曲線是評估功率半導(dǎo)體器件(如 ?IGBT?模塊)在溫度交變應(yīng)力下長期可靠性的核心工具。該曲線通常以 結(jié)溫波動幅度?ΔTj 為橫坐標(biāo),以器件達(dá)到指定失效判據(jù)前所經(jīng)歷的 循環(huán)次數(shù)?Nf 為
    的頭像 發(fā)表于 03-02 11:55 ?88次閱讀
    功率<b class='flag-5'>循環(huán)</b>基礎(chǔ)篇(二) —— 功率<b class='flag-5'>循環(huán)</b>壽命曲線解讀

    汽車熱管理循環(huán)泵車規(guī)電容:-55℃~150℃寬溫+1000次溫度循環(huán)

    在汽車熱管理循環(huán)泵中,采用 -55℃~150℃ 寬溫工作能力 + 1000次溫度循環(huán) 的車規(guī)電容,是保障系統(tǒng)在極端環(huán)境下穩(wěn)定運行的核心元件。
    的頭像 發(fā)表于 02-25 17:14 ?430次閱讀

    雙向保護(hù)開關(guān)評估套件使用指南

    雙向保護(hù)開關(guān)評估套件使用指南 在鋰離子電池的應(yīng)用中,電池管理系統(tǒng)(BMS)起著至關(guān)重要的作用,它能監(jiān)測電池狀態(tài)并確保電池安全運行。其中,電子開關(guān)是BMS的重要組成部分,在關(guān)鍵條件下能將電池與充電器或
    的頭像 發(fā)表于 12-20 20:35 ?1095次閱讀

    雙向保護(hù)開關(guān)評估套件使用指南

    雙向保護(hù)開關(guān)評估套件使用指南 在鋰電池應(yīng)用中,電池管理系統(tǒng)(BMS)至關(guān)重要,它能監(jiān)測電池狀態(tài)并確保安全運行。BMS通常配備電子開關(guān),在關(guān)鍵條件下將電池與充電器或負(fù)載斷開。今天要介紹的雙向開關(guān)評估
    的頭像 發(fā)表于 12-20 11:10 ?986次閱讀

    無數(shù)據(jù)域雙向鏈表的代碼

    下面是一個簡單的示例,演示了如何使用無數(shù)據(jù)域雙向鏈表進(jìn)行插入和訪問操作: #include #include// 包含offsetof宏 // 定義節(jié)點結(jié)構(gòu)體 struct Node
    發(fā)表于 12-11 06:56

    SMDJ28CA雙向 TVS瞬態(tài)抑制二極管:28V 雙向反向電壓 + 3000W峰值功率中壓雙向瞬態(tài)防護(hù)核心

    SMDJ28CA雙向 TVS瞬態(tài)抑制二極管:28V 雙向反向電壓 + 3000W峰值功率中壓雙向瞬態(tài)防護(hù)核心
    的頭像 發(fā)表于 11-19 13:57 ?997次閱讀
    SMDJ28CA<b class='flag-5'>雙向</b> TVS瞬態(tài)抑制二極管:28V <b class='flag-5'>雙向</b>反向電壓 + 3000W峰值功率中壓<b class='flag-5'>雙向</b>瞬態(tài)防護(hù)核心

    雙向創(chuàng)“芯” — 云鎵半導(dǎo)體國內(nèi)首發(fā)高壓 GaN 雙向器件 (GaN BDS)

    云鎵半導(dǎo)體雙向創(chuàng)“芯”—云鎵半導(dǎo)體國內(nèi)首發(fā)高壓GaN雙向器件MBDS1.前言長期以來,器件工程師都在追求一種可雙向導(dǎo)通且雙向耐壓的開關(guān)元件,該類器件在AC/DC、DC/AC及AC/AC
    的頭像 發(fā)表于 11-11 13:43 ?1194次閱讀
    <b class='flag-5'>雙向</b>創(chuàng)“芯” — 云鎵半導(dǎo)體國內(nèi)首發(fā)高壓 GaN <b class='flag-5'>雙向</b>器件 (GaN BDS)

    高低溫循環(huán)測試對電子元件壽命有什么影響

    在電子產(chǎn)品無處不在的今天,微小元件的可靠性直接關(guān)系整個系統(tǒng)的成敗。小到手機(jī),大到汽車、醫(yī)療及工業(yè)設(shè)備,任何元件的失效都可能造成設(shè)備癱瘓。要預(yù)知元件壽命,高低溫循環(huán)測試是關(guān)鍵所在。什么是高低溫循環(huán)測試
    的頭像 發(fā)表于 10-16 15:00 ?636次閱讀
    高低溫<b class='flag-5'>循環(huán)</b>測試對電子元件壽命有什么影響

    rt_object_get_information獲取到的鏈表為空怎么解決?

    rtt啟動過程,在初始化堆的時候,進(jìn)入rt_object_init,調(diào)用rt_object_get_information獲取到的鏈表為空,導(dǎo)致系統(tǒng)起不來。
    發(fā)表于 10-11 11:44

    Kawaii mqtt 如何使用mbedtls雙向驗證?

    Kawaiimqtt如何使用mbedtls雙向驗證
    發(fā)表于 09-24 06:36

    人工智能行業(yè)如何使用for循環(huán)語句進(jìn)行循環(huán)

    人工智能行業(yè)可以使用以下是關(guān)于for循環(huán)在不同編程語言中的基本用法說明: Python中的for循環(huán): 主要用于遍歷序列(列表、元組、字符串等) 典型結(jié)構(gòu):for item in sequence
    的頭像 發(fā)表于 09-10 12:55 ?575次閱讀

    如何實現(xiàn)高效雙向電能變換

    隨著電動汽車、家庭和工商業(yè)儲能產(chǎn)品快速普及,雙向電能變換系統(tǒng)的熱度也在不斷攀升。作為電網(wǎng)與電池的功率橋梁,雙向電能變換系統(tǒng)基于一套硬件電路就能控制電池充放電,實現(xiàn)能量雙向流動,相比傳統(tǒng)單向變換器可大幅降低硬件成本,減小設(shè)備體積。
    的頭像 發(fā)表于 07-23 11:40 ?1564次閱讀

    Kawaiimqtt如何使用mbedtls雙向驗證?

    Kawaiimqtt如何使用mbedtls雙向驗證
    發(fā)表于 06-13 08:23

    什么是光伏雙向電表?雙向電表有哪些應(yīng)用?

    光伏雙向計量電表(Bi-directional Energy Meter) 是分布式能源系統(tǒng)的核心計量裝置,專為光伏發(fā)電并網(wǎng)場景設(shè)計。與傳統(tǒng)單向計量設(shè)備不同,該設(shè)備采用雙向矢量計量技術(shù),可精確記錄
    的頭像 發(fā)表于 05-12 09:42 ?2225次閱讀
    什么是光伏<b class='flag-5'>雙向</b>電表?<b class='flag-5'>雙向</b>電表有哪些應(yīng)用?

    深入理解C語言:C語言循環(huán)控制

    在C語言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無限循環(huán),C語言提供了多種循環(huán)控制語句,如break、continue和goto,用于
    的頭像 發(fā)表于 04-29 18:49 ?2058次閱讀
    深入理解C語言:C語言<b class='flag-5'>循環(huán)</b>控制