【C語言|數據結構】雙向鏈表

文章目錄

    • 前言
    • 1、初步認識雙向鏈表
        • 1.1 定義:
        • 1.2 結構
        • 1.3 節點的存儲
    • 2、雙向鏈表的接口函數
        • 2.1 鏈表的節點的動態申請
        • 2.2 鏈表的初始化
        • 2.3 尾插
        • 2.4 頭插
        • 2.5 頭刪
        • 2.5 尾刪
        • 2.6 在pos節點后面添加數據
        • 2.6 刪除pos節點
    • 3、雙向鏈表的實現:

前言

各位小伙伴大家好,即上回的單向鏈表之后,雙向鏈表來了,他和單向鏈表的主要區別就是,他有兩個指針,同時指向前面一個節點,和后面一個節點,簡直是完美,幾乎解決的單向鏈表的大多數難題

1、初步認識雙向鏈表

1.1 定義:

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向前面一個節點和后面一個節點。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。

1.2 結構

在這里插入圖片描述

這是帶頭的雙向循環鏈表。

1.3 節點的存儲
typedef int DLDataType;typedef struct LinkNode
{DLDataType data;struct LinkNode* next;struct LinkNode* prv;
}LNode;

2、雙向鏈表的接口函數

2.1 鏈表的節點的動態申請
LTNode* LTFound(DLDataType x)
{LTNode* newNode = (LTNode*)malloc(sizeof(LTNode));if (newNode == NULL){perror("LTInit()::malloc()");return;}newNode->next = newNode->prv = newNode;newNode->data = x;return newNode;
}
2.2 鏈表的初始化
// 法一:
LTNode* LTInit()
{LTNode* newhead = LTFound(-1);return newhead;
}
法二:
void LTInit(LTNode** pphead)
{LTNode* newhead = LTFound(-1);*phead = newhead;
}
2.3 尾插
void LTPushBack(LTNode* phead, DLDataType x)
{assert(phead);LTNode* cmp = LTFound(x);// phead phead->prv cmpcmp->next = phead;cmp->prv = phead->prv;phead->prv->next = cmp;phead->prv = cmp;
}

尾插這個節點不管是插入在頭節點的前面還是尾節點后面都是一樣的

2.4 頭插
//頭插
void LTPushFront(LTNode* phead, DLDataType x)
{assert(phead);LTNode* tmp = LTFound(x);// phead tmp phead->nexttmp->next = phead->next;tmp->prv = phead;phead->next = tmp;phead->next->prv = tmp;
}

頭插必須插入在頭節點的后面才是頭插,頭節點就是哨兵衛,鏈表進行操作的時候不能操作哨兵衛,否則就不帶頭了。

2.5 頭刪
//頭刪
void LTPopFront(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* cur = phead->next;// phead  cur cur->nextphead->next = cur->next;cur->next = phead;free(cur);cur = NULL;
}
2.5 尾刪
//尾刪
void LTPopBack(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* cur = phead->prv;// phead cur->prv curphead->prv = cur->prv;cur->prv->next = phead;free(cur);cur = NULL;
}
2.6 在pos節點后面添加數據
//在pos位置之后插入數據
void LTInsert(LTNode* pos, DLDataType x)
{assert(pos);LTNode* cur = LTCreate(x);// pos cur pos->nextcur->next = pos->next;cur->prv = pos;pos->next = cur;pos->next->prv = cur;}
2.6 刪除pos節點
//刪除pos節點
void LTErase(LTNode* pos)
{assert(pos);// pos->prv pos pos->nextpos->prv->next = pos->next;pos->next->prv = pos->prv;free(pos);pos = NULL;
}

3、雙向鏈表的實現:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>typedef int DLDataType;typedef struct LinkNode
{DLDataType data;struct LinkNode* next;struct LinkNode* prv;
}LTNode;//雙鏈表的節點創建
LTNode* LTCreate(DLDataType x)
{LTNode* newNode = (LTNode*)malloc(sizeof(LTNode));if (newNode == NULL){perror("LTInit()::malloc()");exit(-1);}newNode->next = newNode;newNode->prv = newNode;newNode->data = x;return newNode;
}//初始化
//void LTInit(LTNode** pphead)
//{
//	LTNode* newhead = LTFound(-1);
//}LTNode* LTInit()
{LTNode* newhead = LTCreate(-1);return newhead;
}//銷毀鏈表
void LTDesTroy(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;free(cur);cur = next;}free(phead);phead = NULL;
}//鏈表的打印
void LTPrint(LTNode* phead)
{LTNode* cur = phead->next;while (cur != phead){printf("%d->", cur->data);cur = cur->next;}printf("NULL\n");
}//查找pos節點
LTNode* LTFind(LTNode* phead, DLDataType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}//插入數據之前,鏈表必須初始化到只有一個頭結點的情況
//不改變哨兵位的地址,因此傳一級即可
//尾插
void LTPushBack(LTNode* phead, DLDataType x)
{assert(phead);LTNode* cmp = LTCreate(x);// phead phead->prv cmpcmp->next = phead;cmp->prv = phead->prv;phead->prv->next = cmp;phead->prv = cmp;
}//頭插
void LTPushFront(LTNode* phead, DLDataType x)
{assert(phead);LTNode* tmp = LTCreate(x);// phead tmp phead->nexttmp->next = phead->next;tmp->prv = phead;phead->next = tmp;phead->next->prv = tmp;
}//尾刪
void LTPopBack(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* cur = phead->prv;// phead cur->prv curphead->prv = cur->prv;cur->prv->next = phead;free(cur);cur = NULL;
}//頭刪
void LTPopFront(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* cur = phead->next;// phead  cur cur->nextphead->next = cur->next;cur->next = phead;free(cur);cur = NULL;
}//在pos位置之后插入數據
void LTInsert(LTNode* pos, DLDataType x)
{assert(pos);LTNode* cur = LTCreate(x);// pos cur pos->nextcur->next = pos->next;cur->prv = pos;pos->next = cur;pos->next->prv = cur;}//刪除pos節點
void LTErase(LTNode* pos)
{assert(pos);// pos->prv pos pos->nextpos->prv->next = pos->next;pos->next->prv = pos->prv;free(pos);pos = NULL;
}void DLinkListText()
{LTNode* phead = LTInit();LTPushBack(phead, 1);LTPushBack(phead, 2);LTPushBack(phead, 3);LTPrint(phead);LTPushFront(phead, 0);LTPushFront(phead, 999);LTPrint(phead);// LTPopFront(phead);// LTPrint(phead);LTPopBack(phead);LTPrint(phead);LTDesTroy(phead);
}int main()
{DLinkListText();return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11136.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11136.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11136.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C控制語句:分支和跳轉

1.1if語句 //colddays.c --找出0攝氏度以下的天數占總天數的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

電子學會C/C++編程等級考試2024年03月(八級)真題解析

C/C編程&#xff08;1~8級&#xff09;全部真題?點這里 第1題&#xff1a;道路 N個以 1 … N 標號的城市通過單向的道路相連:。每條道路包含兩個參數&#xff1a;道路的長度和需要為該路付的通行費&#xff08;以金幣的數目來表示&#xff09; Bob and Alice 過去住在城市 1.在…

藍海創業商機小吃配方項目,日入200+ ,小白可上手,圖文創作轉現快

小吃技術銷售&#xff0c;一單價格從幾元到幾百元不等&#xff0c;行業競爭相對較小&#xff0c;是一個相對冷門的領域。只需一部手機&#xff0c;就可以發布圖文并茂的內容&#xff0c;配上背景音樂&#xff08;BGM&#xff09;&#xff0c;即使是對視頻剪輯不熟悉的新手&…

面試中算法(金礦)

有一位國王擁有5座金礦&#xff0c;每座金礦的黃金儲量不同&#xff0c;需要參與挖掘的工人人數也不同。 例如&#xff0c;有的金礦儲量是5ookg黃金&#xff0c;需要5個工人來挖掘;有的金礦儲量是2ookg黃金&#xff0c;需要3個工人來挖掘...... 如果參與挖礦的工人的總數是10。…

【Oracle impdp導入dmp文件(windows)】

Oracle impdp導入dmp文件&#xff08;windows&#xff09; 1、連接數據庫2、創建與導出的模式相同名稱的用戶WIRELESS2&#xff0c;并賦予權限3、創建directory 的物理目錄f:\radio\dmp&#xff0c;并把.dmp文件放進去4、連接新用戶WIRELESS25、創建表空間的物理目錄F:\radio\t…

試衣不再有界:Tunnel Try-on開啟視頻試衣應用新紀元

論文&#xff1a;https://arxiv.org/pdf/2404.17571 主頁&#xff1a;https://mengtingchen.github.io/tunnel-try-on-page/ 一、摘要總結 隨著虛擬試衣技術的發展&#xff0c;消費者和時尚行業對于能夠在視頻中實現高質量虛擬試衣的需求日益增長。這項技術允許用戶在不實際穿…

目標檢測——印度車輛數據集

引言 親愛的讀者們&#xff0c;您是否在尋找某個特定的數據集&#xff0c;用于研究或項目實踐&#xff1f;歡迎您在評論區留言&#xff0c;或者通過公眾號私信告訴我&#xff0c;您想要的數據集的類型主題。小編會竭盡全力為您尋找&#xff0c;并在找到后第一時間與您分享。 …

弱監督語義分割學習筆記

目錄 partial cross entropy loss GitHub - LiheYoung/UniMatch: [CVPR 2023] Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation partial cross entropy loss import torch import torch.nn.functional as Fdef partial_cross_entropy_loss…

區塊鏈中的APP與傳統APP的區別

一、技術 區塊鏈中的APP是基于區塊鏈技術開發的&#xff0c;而傳統APP則基于傳統的應用程序商店或網頁。區塊鏈中的APP利用區塊鏈技術的去中心化、數據不可篡改等特點&#xff0c;使得應用程序的開發和分發更加安全、透明和可信。與傳統APP相比&#xff0c;區塊鏈中的APP無需中…

如何實現嵌套路由

實現步驟 1. 新建子頁面 2. 在router/index.js中的父路由節點添加children數組 3. 在children中添加子路由 {path: /,name: home,component: HomeView,children: [ {path: /pageA,name: pageA,component: pageA},{path: /pageB,name: pageB,component: pageB}] }, 5.在父路…

Web安全:SQL注入之布爾盲注原理+步驟+實戰操作

「作者簡介」&#xff1a;2022年北京冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎對安全知識體系進行總結與歸納&#xff0c;著作適用于快速入門的 《網絡安全自學教程》&#xff0c;內容涵蓋系統安全、信息收集等…

前端VUE基礎之創建腳手架

創建腳手架 第一步&#xff08;僅第一次執行&#xff09;&#xff1a;全局安裝vue/cli。 npm install -g vue/cli 到你要創建項目的目錄&#xff0c;然后使用命令創建項目 vue create xxxx 第三步&#xff1a;啟動項目 npm run serv 備注&#xff1a; 1. 如出現下載緩慢請…

PHP流程控制

PHP 流程控制主要是 if 和 switch 流程控制。 當您編寫代碼時&#xff0c;您常常需要為不同的判斷執行不同的動作。您可以在代碼中使用條件語句來完成此任務。 在 PHP 中&#xff0c;提供了下列條件語句&#xff1a; if 語句 - 在條件成立時執行代碼if...else 語句 - 在條件…

訪客管理系統對于校園安全的重要性

校園訪客辦理計劃是針對校園安全需求規劃的安全辦理體系&#xff0c;主要用于對校園外來人員的科學辦理。要做好校園安全作業&#xff0c;把風險分子拒之門外尤為要害。校園訪客辦理計劃實現訪客實名制&#xff0c;并結合公安網、黑名單功用&#xff0c;對風險人員進行提前預警…

沒有公網ip,如何實現外網訪問內網?

目前撥號上網是最廣泛的上網方式&#xff0c;這種方式優點是價格便宜&#xff0c;缺點是沒有固定公網ip&#xff0c;每次重新您撥號ip地址都會變。如果有一臺服務器&#xff0c;需要實現外網訪問&#xff0c;在沒有固定公網ip的環境下&#xff0c;該如何實現呢&#xff1f;使用…

【CTF Web】QSNCTF 文章管理系統 Writeup(SQL注入+Linux命令+RCE)

文章管理系統 題目描述 這是我們的文章管理系統&#xff0c;快來看看有什么漏洞可以拿到FLAG吧&#xff1f;注意&#xff1a;可能有個假FLAG哦 解法 SQL 注入。 ?id1 or 11 --取得假 flag。 爆庫名。 ?id1 union select 1,group_concat(schema_name) from information_sch…

華為OD機試【統一限載貨物數最小值】(java)(200分)

1、題目描述 火車站附近的貨物中轉站負責將到站貨物運往倉庫&#xff0c;小明在中轉站負責調度 2K 輛中轉車(K輛干貨中轉車&#xff0c;K 輛濕貨中轉車)貨物由不同供貨商從各地發來&#xff0c;各地的貨物是依次進站&#xff0c;然后小明按照卸貨順序依次裝貨到中轉車&#xf…

二維數組 和 變長數組

在上一期的內容中&#xff0c;為諸君講解到了一維數組&#xff0c;在一維數組的基礎上&#xff0c;C語言中還有著多維數組&#xff0c;其中&#xff0c;比較典型且運用較為廣泛的就是我們今天的主角——二維數組 一 . 二維數組的概念 我們把單個或者多個元素組成的數組定義為一…

VScode 修改 Markdown Preview Enhanced 主題與字體

VScode 修改 Markdown Preview Enhanced 主題與字體 1. 修改前后效果對比2. 修改主題2.1 更改默認主題2.2 修改背景色 3. 修改字體 VS Code基礎入門使用可查看&#xff1a; VS Code 基礎入門使用&#xff08;配置&#xff09;教程 其他Vs Code 配置可關注查看&#xff1a; Vs C…

2024年如何選什么版本FL Studio才適合自己編曲?

fl studio是什么軟件 水果編曲軟件 FL Studio&#xff0c;全稱為Fruity Loops Studio&#xff0c;是一款全能音樂制作環境或數字音頻工作站&#xff08;DAW&#xff09;&#xff0c;集編曲、錄音、剪輯、混音等多種功能于一身。 FL Studio最初名為Fruity Loops&#xff0c;因…