国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言雙向鏈表的增刪操作

這篇具有很好參考價(jià)值的文章主要介紹了C語言雙向鏈表的增刪操作。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

/********************************************************************************************************

*

*

* 設(shè)計(jì)雙向鏈表的接口

*

*

*

* Copyright (c) ?2023-2024 ? a1583839363@163.com ? All right Reserved

* ******************************************************************************************************/


//指的是雙向鏈表中的結(jié)點(diǎn)有效數(shù)據(jù)類型,用戶可以根據(jù)需要進(jìn)行修改
typedef int DataType_t;

//構(gòu)造雙向鏈表的結(jié)點(diǎn),鏈表中所有結(jié)點(diǎn)的數(shù)據(jù)類型應(yīng)該是相同的
typedef struct DoubleLinkedList
{
? ? DataType_t ? ? ? ? ? ? ? data; //結(jié)點(diǎn)的數(shù)據(jù)域
? ? struct DoubleLinkedList *prev; //直接前驅(qū)的指針域
? ? struct DoubleLinkedList *next; //直接后繼的指針域

}DoubleLList_t;

//創(chuàng)建一個(gè)空雙向鏈表,空鏈表應(yīng)該有一個(gè)頭結(jié)點(diǎn),對鏈表進(jìn)行初始化
DoubleLList_t * DoubleLList_Create(void)
{
? ? //1.創(chuàng)建一個(gè)頭結(jié)點(diǎn)并對頭結(jié)點(diǎn)申請內(nèi)存
? ? DoubleLList_t *Head = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
? ? if (NULL == Head)
? ? {
? ? ? ? perror("Calloc memory for Head is Failed");
? ? ? ? exit(-1);
? ? }

? ? //2.對頭結(jié)點(diǎn)進(jìn)行初始化,頭結(jié)點(diǎn)是不存儲(chǔ)數(shù)據(jù)域,指針域指向NULL
? ? Head->prev = NULL;
? ? Head->next = NULL;

? ? //3.把頭結(jié)點(diǎn)的地址返回即可
? ? return Head;
}

//創(chuàng)建新的結(jié)點(diǎn),并對新結(jié)點(diǎn)進(jìn)行初始化(數(shù)據(jù)域 + 指針域)
DoubleLList_t * DoubleLList_NewNode(DataType_t data)
{
? ? //1.創(chuàng)建一個(gè)新結(jié)點(diǎn)并對新結(jié)點(diǎn)申請內(nèi)存
? ? DoubleLList_t *New = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
? ? if (NULL == New)
? ? {
? ? ? ? perror("Calloc memory for NewNode is Failed");
? ? ? ? return NULL;
? ? }

? ? //2.對新結(jié)點(diǎn)的數(shù)據(jù)域和指針域(2個(gè))進(jìn)行初始化
? ? New->data = data;
? ? New->prev = NULL;
? ? New->next = NULL;

? ? return New;
}

//頭插
bool DoubleLList_HeadInsert(DoubleLList_t *Head,DataType_t data)
{
? ? // 1.創(chuàng)建新的結(jié)點(diǎn),并對新結(jié)點(diǎn)進(jìn)行初始化
? ? DoubleLList_t *New = DoubleLList_NewNode(data);
? ? if (NULL == New)
? ? {
? ? ? ? printf("can not insert new node\n");
? ? ? ? return false;
? ? }

? ? // 2.判斷雙向鏈表是否為空,如果為空,則直接插入即可
? ? if (NULL == Head->next)
? ? {
? ? ? ? Head->next = New;
? ? ? ? return true;
? ? }

? ? // 3.如果雙向鏈表為非空,把新結(jié)點(diǎn)插入到鏈表的頭部\
? ? New->next = Head->next;
? ? Head->next->prev = New;
? ? Head->next = New;

? ? return true;
}

//尾插
bool DoubleLList_TailInsert(DoubleLList_t *Head,DataType_t data)
{
? ? // 1.創(chuàng)建新的結(jié)點(diǎn),并對新結(jié)點(diǎn)進(jìn)行初始化
? ? DoubleLList_t *New = DoubleLList_NewNode(data);
? ? if (NULL == New)
? ? {
? ? ? ? printf("can not insert new node\n");
? ? ? ? return false;
? ? }

? ? // 2.判斷雙向鏈表是否為空,如果為空,則直接插入即可
? ? if (NULL == Head->next)
? ? {
? ? ? ? Head->next = New;
? ? ? ? return true;
? ? }

? ? // 3.如果雙向鏈表為非空,遍歷鏈表,找到尾結(jié)點(diǎn)
? ? DoubleLList_t *Tail = Head;
? ? while(Tail->next != NULL)
? ? {
? ? ? ? Tail = Tail->next;
? ? }

? ? // 4.把新結(jié)點(diǎn)插入到鏈表的尾部
? ? Tail->next = New;
? ? New->prev = Tail;

? ? return true;
}

//指定插
bool DoubleLList_DestInsert(DoubleLList_t *Head,DataType_t destval,DataType_t data)
{
? ? // 1.創(chuàng)建新的結(jié)點(diǎn),并對新結(jié)點(diǎn)進(jìn)行初始化
? ? DoubleLList_t *New = DoubleLList_NewNode(data);
? ? if (NULL == New)
? ? {
? ? ? ? printf("can not insert new node\n");
? ? ? ? return false;
? ? }

? ? // 2.判斷雙向鏈表是否為空,如果為空,則直接插入即可
? ? if (NULL == Head->next)
? ? {
? ? ? ? Head->next = New;
? ? ? ? return true;
? ? }

? ? // 3.如果雙向鏈表為非空,遍歷鏈表,找到插入位置
? ? DoubleLList_t *Dest = Head->next;
? ? while (Dest->data != destval && Dest != NULL)
? ? {
? ? ? ? Dest = Dest->next;
? ? }
? ? if (NULL == Dest)
? ? {
? ? ? ? return false;
? ? }

? ? // 4.說明找到目標(biāo)結(jié)點(diǎn),則把新結(jié)點(diǎn)插入到目標(biāo)結(jié)點(diǎn)的后面
? ? New->next = Dest->next;
? ? Dest->next->prev = New;
? ? New->prev = Dest;
? ? Dest->next = New;

? ? return true;
}

//頭刪
bool DoubleLList_HeadDel(DoubleLList_t *Head)
{
? ? // 1.判斷鏈表是否為空,如果為空,則直接退出
? ? if (NULL == Head->next)
? ? {
? ? ? ? return false;
? ? }

? ? // 2.對鏈表的首結(jié)點(diǎn)的地址進(jìn)行備份
? ? DoubleLList_t *Temp = Head->next;

? ? // 3.鏈表是非空的,則直接刪除首結(jié)點(diǎn)
? ? Head->next = Temp->next;
? ? Temp->next = NULL;
? ? Temp->next->prev = NULL;
? ? free(Temp);

? ? return true;
}

// 尾刪
bool DoubleLList_TailDel(DoubleLList_t *Head)
{
? ? // 1.判斷鏈表是否為空,如果為空,則直接退出
? ? if (NULL == Head->next)
? ? {
? ? ? ? return false;
? ? }

? ? // 2.遍歷鏈表,找到尾結(jié)點(diǎn)
? ? DoubleLList_t *Tail = Head;
? ? while (Tail->next != NULL)
? ? {
? ? ? ? Tail = Tail->next;
? ? }

? ? // 3.刪除尾結(jié)點(diǎn)
? ? Tail->prev->next = NULL;
? ? Tail->prev = NULL;
? ? free(Tail);

? ? return true;
}

// 指定刪
bool DoubleLList_DestDel(DoubleLList_t *Head, DataType_t destval, DataType_t data)
{
? ? // 1.判斷鏈表是否為空,如果為空,則直接退出
? ? if (NULL == Head->next)
? ? {
? ? ? ? return false;
? ? }

? ? // 2.鏈表是非空的,遍歷鏈表,找到待刪除結(jié)點(diǎn)
? ? DoubleLList_t *Dest = Head;
? ? while (Dest->data != destval && Dest != NULL)
? ? {
? ? ? ? Dest = Dest->next;
? ? }
? ? if (NULL == Dest)
? ? {
? ? ? ? return false;
? ? }

? ? // 3.刪除指定結(jié)點(diǎn)
? ? Dest->prev->next = Dest->next;
? ? Dest->next->prev = Dest->prev;
? ? Dest->prev = NULL;
? ? Dest->next = NULL;
? ? free(Dest);

    return true;
}

//遍歷鏈表
bool DoubleLList_Print(DoubleLList_t *Head)
{
? ? //對雙向鏈表的頭結(jié)點(diǎn)的地址進(jìn)行備份
? ? DoubleLList_t *Phead = Head;
? ? //判斷當(dāng)前鏈表是否為空,為空則直接退出
? ? if (Head->next == Head)
? ? {
? ? ? ? printf("current linkeflist is empty!\n");
? ? ? ? return false;
? ? }

? ? //從首結(jié)點(diǎn)開始遍歷
? ? while(Phead->next)
? ? {
? ? ? ? //把頭結(jié)點(diǎn)的直接后繼作為新的頭結(jié)點(diǎn)
? ? ? ? Phead = Phead->next;

? ? ? ? //輸出頭結(jié)點(diǎn)的直接后繼的數(shù)據(jù)域
? ? ? ? printf("data = %d\n",Phead->data);

? ? ? ? //判斷是否到達(dá)尾結(jié)點(diǎn),尾結(jié)點(diǎn)的next指針是指向首結(jié)點(diǎn)的地址
? ? ? ? if (Phead->next == Head->next)
? ? ? ? {
? ? ? ? ? ? break;
? ? ? ? }
? ? }

? ? return true;
}

int main(int argc, char const *argv[])
{
? ? return 0;
}

文章來源地址http://www.zghlxwxcb.cn/news/detail-856749.html

到了這里,關(guān)于C語言雙向鏈表的增刪操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語言雙向鏈表的含義與鏈表數(shù)據(jù)操作代碼詳解!

    C語言雙向鏈表的含義與鏈表數(shù)據(jù)操作代碼詳解!

    引言: 于本文中,我們將講到C語言數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表的含義,以及對于雙向鏈表的增刪查改函數(shù)。該函數(shù)相比于單向鏈表,反而還更加的簡單。希望這篇文章可以對你有幫助,也希望同樣熱愛代碼編程的你能給我支持,您的支持就是我最大的動(dòng)力! 關(guān)于順序表以及單鏈

    2024年04月17日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)---雙向鏈表的基本操作

    頭插法 遍歷鏈表 尾插法 頭刪法 尾刪法 按位置插入數(shù)據(jù) 按位置刪除數(shù)據(jù) dooublelinklist.c doublelinklist.h doublemain.c

    2024年02月22日
    瀏覽(96)
  • 基于雙向鏈表的通訊錄C語言實(shí)現(xiàn)

    關(guān)于雙向鏈表的詳細(xì)了解請見博主的另一篇博客,本文旨在對單鏈表進(jìn)行應(yīng)用,采用C語言編寫。

    2024年04月17日
    瀏覽(645)
  • 數(shù)據(jù)結(jié)構(gòu):圖文詳解雙向鏈表的各種操作(頭插法,尾插法,任意位置插入,查詢節(jié)點(diǎn),刪除節(jié)點(diǎn),求鏈表的長度... ...)

    數(shù)據(jù)結(jié)構(gòu):圖文詳解雙向鏈表的各種操作(頭插法,尾插法,任意位置插入,查詢節(jié)點(diǎn),刪除節(jié)點(diǎn),求鏈表的長度... ...)

    目錄 一.雙向鏈表的概念 二.雙向鏈表的數(shù)據(jù)結(jié)構(gòu) 三.雙向鏈表的實(shí)現(xiàn) 節(jié)點(diǎn)的插入 頭插法 尾插法 任意位置插入 節(jié)點(diǎn)的刪除 刪除鏈表中第一次出現(xiàn)的目標(biāo)節(jié)點(diǎn) 刪除鏈表中所有與相同的節(jié)點(diǎn) 節(jié)點(diǎn)的查找 鏈表的清空 鏈表的長度 四.模擬實(shí)現(xiàn)鏈表的完整代碼 前言: 在上一

    2024年02月05日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)_鏈表_雙向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語言實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)_鏈表_雙向循環(huán)鏈表的初始化、插入、刪除、修改、查詢打?。ɑ贑語言實(shí)現(xiàn))

    版本: 2024年4月26日 V1.0 發(fā)布于博客園 目錄 目錄 雙向循環(huán)鏈表公式 初始化雙向循環(huán)鏈表 構(gòu)建雙向循環(huán)鏈表結(jié)點(diǎn) 創(chuàng)建一個(gè)空鏈表(僅頭結(jié)點(diǎn)) 創(chuàng)建一個(gè)新結(jié)點(diǎn) 插入數(shù)據(jù) 頭插 中插 尾插 刪除數(shù)據(jù) 頭刪 中刪 尾刪 查詢打印數(shù)據(jù) 遍歷打印 測試 測試結(jié)果: 完整代碼 DoubleCirLList.h

    2024年04月27日
    瀏覽(36)
  • 鏈表的基本操作(c語言)

    目錄 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu) 代碼實(shí)現(xiàn) 鏈表初始化 頭插法(前插法)創(chuàng)建含k個(gè)結(jié)點(diǎn)的單鏈表 尾插法(后插法)創(chuàng)建含k個(gè)結(jié)點(diǎn)的單鏈表 取第i個(gè)節(jié)點(diǎn)的數(shù)據(jù)域 尋找數(shù)據(jù)域等于e的結(jié)點(diǎn)返回該結(jié)點(diǎn)序號 在第i個(gè)結(jié)點(diǎn)插入數(shù)據(jù)域?yàn)閑的結(jié)點(diǎn) 刪除第i個(gè)結(jié)點(diǎn) 遍歷鏈表 求鏈表結(jié)點(diǎn)個(gè)數(shù)(鏈表長度) 銷毀

    2024年02月08日
    瀏覽(17)
  • C語言鏈表的含義與鏈表數(shù)據(jù)操作代碼詳解!

    C語言鏈表的含義與鏈表數(shù)據(jù)操作代碼詳解!

    ? ? ? ??在講解開始前,我們先來看一張圖片: ? ? ? ? 如圖我們可以看到一列火車,它由車頭和車廂組成,同時(shí)由鏈條連接,從整個(gè)火車我們可以看出,前一節(jié)的車廂尾總有著一個(gè)鏈條,讓它緊密與后一個(gè)車廂相連。這樣,如果我們找到了前一個(gè)車廂,那么我們就可以同

    2024年04月23日
    瀏覽(23)
  • 【從零開始寫博客】鏈表運(yùn)用:鏈表的增刪查改及反轉(zhuǎn)(day3)

    【從零開始寫博客】鏈表運(yùn)用:鏈表的增刪查改及反轉(zhuǎn)(day3)

    【數(shù)組】day2 【數(shù)組】day1 目錄 鏈表概述 一、鏈表增刪地初次理解 二、鏈表常見六個(gè)操作 三,鏈表的轉(zhuǎn)置 總結(jié) 鏈表是通過指針將一個(gè)個(gè)節(jié)點(diǎn)串起來的數(shù)據(jù)結(jié)構(gòu),其優(yōu)點(diǎn)是增刪方便,靈活性強(qiáng)。以下將結(jié)合leetcode上的一些例題介紹鏈表的一些功能和應(yīng)用。 相比數(shù)組依靠覆蓋來

    2024年02月15日
    瀏覽(19)
  • 【雙向鏈表的實(shí)現(xiàn)】

    【雙向鏈表的實(shí)現(xiàn)】

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 目錄 前言 1. 雙向鏈表的結(jié)構(gòu) 2. 雙向鏈表的實(shí)現(xiàn) 2.1 頭文件 ——雙向鏈表的創(chuàng)建及功能函數(shù)的定義 2.2 源文件 ——雙向鏈表的功能函數(shù)的實(shí)現(xiàn) 2.3 源文件 ——雙向鏈表功能的測試 4.雙向鏈表的操作示意圖

    2024年02月05日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包