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

【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn))

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。




前言

引入雙向鏈表:關(guān)于單鏈表的問題與討論


單鏈表存在的毛病:

  1. 因?yàn)閱捂湵?strong>只能單向遍歷鏈表,

  2. 對于前插這個操作,單鏈表必須得找到所需前插節(jié)點(diǎn)位置的前一個,那么這時就得從頭指針重新遍歷一次鏈表,會造成時間復(fù)雜度大大增加。

  3. 沒有頭節(jié)點(diǎn)(哨兵位)無法刪除首節(jié)點(diǎn)

這些都大大提高時間復(fù)雜度 [ 關(guān)于算法的時間復(fù)雜度與空間復(fù)雜度 這一專題,我在之前寫的一篇專題中有詳細(xì)的講解,有需要的可以點(diǎn)擊鏈接了解一下 算法的時間復(fù)雜度與空間復(fù)雜度 ]

【注意:不要下意識覺得鏈表就一定有哨兵位,可以有,也可以沒有!】

正是因?yàn)閱捂湵碇荒?單向遍歷 這一特性所帶來各種的麻煩,前人設(shè)計出了雙向鏈表。



一、雙向鏈表的特性簡概

  • 特性:
    1. 雙向
    2. 循環(huán)

正是因?yàn)橛羞@兩個特性,促成了雙向鏈表很多優(yōu)勢

  1. 不需要像單鏈表那樣從 頭節(jié)點(diǎn) 完整遍歷一邊鏈表,才能找到尾節(jié)點(diǎn)。
    雙向鏈表:直接 phead->prev 找到尾節(jié)點(diǎn)雙向、循環(huán) 的特性)。
  2. 且找到需要處理的節(jié)點(diǎn),還需要從頭節(jié)點(diǎn)再遍歷一次鏈表,只為找到該節(jié)點(diǎn)的前一個節(jié)點(diǎn),才能對該節(jié)點(diǎn)進(jìn)行處理。
    雙向鏈表:pos->prev 前一節(jié)點(diǎn)


雙向鏈表 邏輯樣例圖
【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言,數(shù)據(jù)結(jié)構(gòu),c#

代碼實(shí)現(xiàn)

//類型聲明 
typedef int LTDataType;      //數(shù)據(jù)類型重命名
typedef struct ListNode      //結(jié)構(gòu)體類型聲明
{                            //兩頭的指針變量 儲存雙向兩旁結(jié)構(gòu)體的地址
	struct ListNode* prev;   //保存前一個節(jié)點(diǎn)的指針
	LTDataType data;
	struct ListNode* next;   //保存后一個節(jié)點(diǎn)的指針
}ListNode;


二、雙鏈表的增刪查改【C 代碼實(shí)現(xiàn)】

(一)創(chuàng)建文件

  1. List.h (雙向鏈表雙向鏈表的類型定義、接口函數(shù)聲明、引用的頭文件)
  2. List.c (雙向鏈表接口函數(shù)的實(shí)現(xiàn))
  3. test.c (主函數(shù)、測試順序表各個接口功能)

【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言,數(shù)據(jù)結(jié)構(gòu),c#



(二)List.h

1. 頭文件聲明

#pragma once  //防止頭文件重復(fù)包含

//頭文件
#include<stdio.h> 
#include<stdlib.h>
#include<assert.h>

2. 雙向結(jié)構(gòu)體類型聲明

//類型聲明 
typedef int LTDataType;      //數(shù)據(jù)類型重命名
typedef struct ListNode      //結(jié)構(gòu)體類型聲明
{   
	struct ListNode* prev;   //兩頭的指針變量 儲存雙向兩旁結(jié)構(gòu)體的地址
	LTDataType data;
	struct ListNode* next;

}ListNode;


(三)List.c

1.創(chuàng)建返回雙向鏈表的頭結(jié)點(diǎn).


圖解
phead 的含義 = pointer to head
【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言,數(shù)據(jù)結(jié)構(gòu),c#

// 創(chuàng)建返回鏈表的頭結(jié)點(diǎn).
ListNode* ListCreate() {
	ListNode* phead = (ListNode*)malloc(sizeof(ListNode));  
    //結(jié)構(gòu)體指針phead 存的是malloc為新結(jié)構(gòu)體開辟內(nèi)存后 的返回的該新節(jié)點(diǎn)的指針 
	assert(malloc);
	return phead; //phead傳的是phead指針的內(nèi)容=head地址 =>返回結(jié)構(gòu)體地址 
}



2. 雙向鏈表的初始化

// 雙向鏈表的初始化
void ListInit(ListNode* phead) {       //也用phead接受傳過來的head的地址
	assert(phead);

	phead->prev = phead->next;
	phead->data = 0;                  //加深對指針的理解
	phead->next = phead->prev;    //直接用head【記?。?. **名 直接用的是內(nèi)容** 明白這點(diǎn) 對于指針的理解就輕松很多】
		                          //2. -> 只能對指針使用 且不支持二級指針解引用*后得到一級指針的形式
	                              // (如:ListNode** pphead  **pphead->data (x)好像不行 去試一下 ) 
	                               【關(guān)于指針注意的點(diǎn)的講解】
}

【關(guān)于指針注意的點(diǎn)的講解】 :加深對指針的理解

  1. 直接用head => 名 直接用的是內(nèi)容 明白這點(diǎn) 對于指針的理解就輕松很多
  2. -> 只能對指針使用 且不支持二級指針解引用后得到一級指針的形式
    (如:ListNode
    * pphead
    **pphead->data (x) 好像不行 去試一下 )


3.創(chuàng)建返回新節(jié)點(diǎn)

// 創(chuàng)建返回新節(jié)點(diǎn)
ListNode* BuynewNode(x) {
	ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
	newNode->data = x;
	return newNode;

}


4.雙向鏈表尾插

// 雙向鏈表尾插
void ListPushBack(ListNode* phead,LTDataType x) {
	ListNode* newNode = BuynewNode(x);             //1M的空間可創(chuàng)建出一千多萬個指針變量
	
	ListNode* tail = phead->prev;                  //多創(chuàng)建指針變量 自己也標(biāo)的看的清楚 增加代碼的可讀性
	
	tail->next = newNode;
	newNode->prev = tail;

	newNode->next = phead;
	phead->prev = newNode;

}


5.雙向鏈表頭插

// 雙向鏈表頭插
void ListPushFront(ListNode* phead, LTDataType x) { 
	ListNode* newNode = BuynewNode(x);

	ListNode* first = phead->next;        //第一個節(jié)點(diǎn)

	newNode->next = first;
	first->prev = newNode;

	phead->next = newNode;
	newNode->prev = phead;
}

6.雙向鏈表尾刪

// 雙向鏈表尾刪
void ListPopBack(ListNode* phead) {
	assert(phead);
	assert(phead->next != phead);        //確保鏈表不為空,有東西可刪,及時報錯

	ListNode* tailPrev = phead->prev->prev;
	ListNode* tail = phead->prev;
	free(tail);
	tail = NULL;

	tailPrev->next = phead;
	phead->prev = tailPrev;

}


7.雙向鏈表頭刪

// 雙向鏈表頭刪
void ListPopFront(ListNode* phead) {
	assert(phead);
	assert(phead->next != phead);    

	ListNode* newNext = phead->next->next;
	ListNode* Next = phead->next;          //新建指針變量 保存好要free掉的節(jié)點(diǎn)的地址
	free(Next);                            //就不用怕后續(xù)改變各節(jié)點(diǎn)之間的指針關(guān)系時把該節(jié)點(diǎn)的地址弄丟了
	Next = NULL;

	phead->next = newNext;
	newNext->prev = phead;
}


8.雙向鏈表查找

// 雙向鏈表查找
ListNode* ListFind(ListNode* phead, LTDataType x) {
	ListNode* Head = phead->next;         //設(shè)置兩個指針變量,一個從頭開始遍歷,一個從后遍歷
	ListNode* Back = phead->prev;

	while (Head!=Back) {
		if (Head->data = x)
			return Head;
		else if (Back->data = x)
			return Back;
		Head = Head->next;
		Back = Back->prev;
	}
	return NULL;
}


9.雙向鏈表在pos的前面進(jìn)行插入

// 雙向鏈表在pos的前面進(jìn)行插入
void ListInsert(ListNode* pos, LTDataType x) {
	ListNode* posPrev = pos->prev;
	
	ListNode* newNode = BuynewNode(x);

	posPrev->next = newNode;
	newNode->prev = posPrev;

	newNode->next = pos;
	pos->prev = newNode;
}


★10. 雙向鏈表刪除pos位置的節(jié)點(diǎn)

// 雙向鏈表刪除pos位置的節(jié)點(diǎn)                 //若傳過來的pos=phead->next  =>作頭刪作用
void ListErase(ListNode* pos) { 
	ListNode* posPrev = pos->prev;        //若傳過來的pos=phead(由于雙向鏈表具有循環(huán)的特性) =>作尾刪作用
	ListNode* posNext = pos->next;
	                                      //也正是由于雙向鏈表具有循環(huán)的特性,即使鏈表中只有一個節(jié)點(diǎn)也能很好的運(yùn)行
	posPrev->next = posNext;              //圖解
	posNext->prev = posPrev;

	free(pos);
	pos = NULL;
}

Erase函數(shù)以后 頭刪和尾刪也可以這樣寫

10.1 雙向鏈表尾刪【ListErase版本】
void ListPopBack(ListNode* phead) {

	assert(phead);
	assert(phead->next != phead);     //確保鏈表不為空,有東西可刪,及時報錯

	ListErase(phead);
	}
10.2 雙向鏈表頭刪【ListErase版本】
// 雙向鏈表頭刪【ListErase版本】
void ListPopFront(ListNode* phead) {
	assert(phead);
	assert(phead->next != phead);     //確保鏈表不為空,有東西可刪,及時報錯

	ListErase(phead->next);
}


11.雙向鏈表打印

11.1 遞歸實(shí)現(xiàn)
// 雙向鏈表打印  遞歸實(shí)現(xiàn)
void ListPrint(ListNode* phead) {
	assert(phead);
    ListNode* cur = phead->next;
	while (cur!=phead) {
	printf("%d <=>", cur->data);
	cur = cur->next;
	ListPrint(cur);
	}

	printf("\n");
}

11.2 非遞歸實(shí)現(xiàn)
// 雙向鏈表打印  非遞歸實(shí)現(xiàn)
void ListPrint(ListNode* phead) {
	assert(phead);
	ListNode* cur = phead->next;

	while (cur!=phead) {
	cur = phead->next;
	printf("%d <=>", cur->data);
	}
}


12. 雙向鏈表銷毀

// 雙向鏈表銷毀
void ListDestory(ListNode* phead) {
	ListNode* cur = phead->next;
	while (cur!=phead) {
	ListNode* curNext = cur->next;
	free(cur);
	cur = curNext;
	}
	free(phead);
	phead = NULL;
	
}


三、完整代碼

碼源 我已上傳至gitee 有需要的可點(diǎn)擊后方鏈接 雙向鏈表的增刪查改 碼源 文章來源地址http://www.zghlxwxcb.cn/news/detail-719938.html

1.List.h

#pragma once         //防止頭文件重復(fù)包含

#include<stdio.h>    //頭文件
#include<stdlib.h>
#include<assert.h>


// 帶頭+雙向+循環(huán)鏈表增刪查改實(shí)現(xiàn)

//類型聲明 
typedef int LTDataType;      //數(shù)據(jù)類型重命名
typedef struct ListNode      //結(jié)構(gòu)體類型聲明
{
	struct ListNode* prev;   //兩頭的指針變量 儲存雙向兩旁結(jié)構(gòu)體的地址
	LTDataType data;
	struct ListNode* next;

}ListNode;

// 創(chuàng)建返回雙向鏈表的頭結(jié)點(diǎn).
ListNode* ListCreate();

// 雙向鏈表的初始化
void ListInit(ListNode* phead);

// 創(chuàng)建返回新節(jié)點(diǎn)
ListNode* BuynewNode(LTDataType x);

// 雙向鏈表尾插
void ListPushBack(ListNode* phead, LTDataType x);

// 雙向鏈表頭插
void ListPushFront(ListNode* phead, LTDataType x);

// 雙向鏈表尾刪
void ListPopBack(ListNode* phead);

// 雙向鏈表頭刪
void ListPopFront(ListNode* phead);

// 雙向鏈表查找
ListNode* ListFind(ListNode* phead, LTDataType x);

// 雙向鏈表在pos的前面進(jìn)行插入
void ListInsert(ListNode* pos, LTDataType x);

// 雙向鏈表刪除pos位置的節(jié)點(diǎn)
void ListErase(ListNode* pos);

// 雙向鏈表打印
void ListPrint(ListNode* phead);

// 雙向鏈表銷毀
void ListDestory(ListNode* phead);

2.List.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"


// 創(chuàng)建返回鏈表的頭結(jié)點(diǎn).
ListNode* ListCreate() {
	ListNode* phead = (ListNode*)malloc(sizeof(ListNode));  //結(jié)構(gòu)體指針phead 存的是malloc為新結(jié)構(gòu)體開辟內(nèi)存后 的返回的該新節(jié)點(diǎn)的指針 
	assert(malloc);
	return phead; //phead傳的是phead指針的內(nèi)容=head地址 =>返回結(jié)構(gòu)體地址 
}


// 雙向鏈表的初始化
void ListInit(ListNode* phead) {            //也用phead接受傳過來的head的地址
	assert(phead);

	phead->prev = phead->next;
	phead->data = 0;                                             //加深對指針的理解
	phead->next = phead->prev;                                   //直接用head【記住:1. 名 直接用的是內(nèi)容 明白這點(diǎn) 對于指針的理解就輕松很多】
		                               //2. -> 只能對指針使用 且不支持二級指針解引用*后得到一級指針的形式
	                                   // (如:ListNode** pphead  **pphead->data (x)好像不行 去試一下 ) 【關(guān)于指針注意的點(diǎn)的講解】
}


// 創(chuàng)建返回新節(jié)點(diǎn)
ListNode* BuynewNode(x) {
	ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
	newNode->data = x;
	return newNode;

}


// 雙向鏈表尾插
void ListPushBack(ListNode* phead,LTDataType x) {
	ListNode* newNode = BuynewNode(x);             //1M的空間可創(chuàng)建出一千多萬個指針變量
	
	ListNode* tail = phead->prev;                  //多創(chuàng)建指針變量 自己也標(biāo)的看的清楚 增加代碼的可讀性
	
	tail->next = newNode;
	newNode->prev = tail;

	newNode->next = phead;
	phead->prev = newNode;

}


// 雙向鏈表頭插
void ListPushFront(ListNode* phead, LTDataType x) { 
	ListNode* newNode = BuynewNode(x);

	ListNode* first = phead->next;        //第一個節(jié)點(diǎn)

	newNode->next = first;
	first->prev = newNode;

	phead->next = newNode;
	newNode->prev = phead;
}


// 雙向鏈表尾刪
void ListPopBack(ListNode* phead) {
	assert(phead);
	assert(phead->next != phead);        //確保鏈表不為空,有東西可刪,及時報錯

	ListNode* tailPrev = phead->prev->prev;
	ListNode* tail = phead->prev;
	free(tail);
	tail = NULL;

	tailPrev->next = phead;
	phead->prev = tailPrev;

}


// 雙向鏈表頭刪
void ListPopFront(ListNode* phead) {
	assert(phead);
	assert(phead->next != phead);    

	ListNode* newNext = phead->next->next;
	ListNode* Next = phead->next;           //新建指針變量 保存好要free掉的節(jié)點(diǎn)的地址
	free(Next);                             //就不用怕后續(xù)改變各節(jié)點(diǎn)之間的指針關(guān)系時把該節(jié)點(diǎn)的地址弄丟了
	Next = NULL;

	phead->next = newNext;
	newNext->prev = phead;
}



// 雙向鏈表查找
ListNode* ListFind(ListNode* phead, LTDataType x) {
	ListNode* Head = phead->next;                       //設(shè)置兩個指針變量,一個從頭開始遍歷,一個從后遍歷
	ListNode* Back = phead->prev;

	while (Head!=Back) {
		if (Head->data = x)
			return Head;
		else if (Back->data = x)
			return Back;
		Head = Head->next;
		Back = Back->prev;
	}
	return NULL;
}



// 雙向鏈表在pos的前面進(jìn)行插入
void ListInsert(ListNode* pos, LTDataType x) {
	ListNode* posPrev = pos->prev;
	
	ListNode* newNode = BuynewNode(x);

	posPrev->next = newNode;
	newNode->prev = posPrev;

	newNode->next = pos;
	pos->prev = newNode;
}



// 雙向鏈表刪除pos位置的節(jié)點(diǎn)                 //若傳過來的pos=phead->next  =>作頭刪作用
void ListErase(ListNode* pos) { 
	ListNode* posPrev = pos->prev;        //若傳過來的pos=phead(由于雙向鏈表具有循環(huán)的特性) =>作尾刪作用
	ListNode* posNext = pos->next;
	                                      //也正是由于雙向鏈表具有循環(huán)的特性,即使鏈表中只有一個節(jié)點(diǎn)也能很好的運(yùn)行
	posPrev->next = posNext;              //圖解
	posNext->prev = posPrev;

	free(pos);
	pos = NULL;
}



//Erase函數(shù)以后 頭刪和尾刪也可以這樣寫

// 雙向鏈表尾刪【ListErase版本】
void ListPopBack(ListNode* phead) {
	//assert(phead);
	//assert(phead->next != phead);

	//ListNode* tailPrev = phead->prev->prev;
	//ListNode* tail = phead->prev;
	//free(tail);
	//tail = NULL;

	//tailPrev->next = phead;
	//phead->prev = tailPrev;

	assert(phead);
	assert(phead->next != phead);     //確保鏈表不為空,有東西可刪,及時報錯

	ListErase(phead);
}


// 雙向鏈表頭刪【ListErase版本】
void ListPopFront(ListNode* phead) {
	//assert(phead);
	//assert(phead->next != phead);

	//ListNode* newNext = phead->next->next;
	//ListNode* Next = phead->next;
	//free(Next);                             
	//Next = NULL;

	//phead->next = newNext;
	//newNext->prev = phead;

	assert(phead);
	assert(phead->next != phead);     //確保鏈表不為空,有東西可刪,及時報錯

	ListErase(phead->next);
}



// 雙向鏈表打印  遞歸實(shí)現(xiàn)
void ListPrint(ListNode* phead) {
	assert(phead);
    ListNode* cur = phead->next;
	while (cur!=phead) {
	printf("%d <=>", cur->data);
	cur = cur->next;
	ListPrint(cur);
	}

	printf("\n");
}


// 雙向鏈表打印  非遞歸實(shí)現(xiàn)
void ListPrint(ListNode* phead) {
	assert(phead);
	ListNode* cur = phead->next;

	while (cur!=phead) {
	cur = phead->next;
	printf("%d <=>", cur->data);
	}
}



// 雙向鏈表銷毀
void ListDestory(ListNode* phead) {
	ListNode* cur = phead->next;
	while (cur!=phead) {
	ListNode* curNext = cur->next;
	free(cur);
	cur = curNext;
	}
	free(phead);
	phead = NULL;
	
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"

//測試ListPushBack 、ListPrint 的功能
void test1() {
	ListNode* phead = ListCreate();  //返回head的地址
	
	ListInit(phead);

	ListPushBack(phead,1);   //測試ListPushBack
	ListPushBack(phead, 2);
	ListPushBack(phead, 3);

	ListPrint(phead);   //測試ListPrint
	
}



void test2() {
	ListNode* phead = ListCreate();    //返回head的地址

	ListInit(phead);

	ListPushBack(phead, 1);
	ListPushBack(phead, 2);
	ListPushBack(phead, 3);
	ListPushBack(phead, 4);
	ListPushBack(phead, 5);
	ListPushBack(phead, 6);

	ListPrint(phead);

	ListNode* pos = ListFind(phead,3);    //測試ListFind
	ListErase(pos);     //測試ListErase
	ListPopFront(phead);   //測試ListPopFront
	ListPopBack(phead);   //測試ListPopBack

	ListPrint(phead);

	pos = ListFind(phead, 2);
	ListInsert(pos,8);

	ListPrint(phead);
}



//測試ListDestory
void test3() {
	ListNode* phead = ListCreate();    //返回head的地址

	ListInit(phead);

	ListPushBack(phead, 1);
	ListPushBack(phead, 2);
	ListPushBack(phead, 3);
	ListPushBack(phead, 4);
	ListPushBack(phead, 5);
	ListPushBack(phead, 6);

	ListPrint(phead);

	ListNode* pos = ListFind(phead, 3); 
	ListErase(pos);     
	ListPopFront(phead);   
	ListPopBack(phead);   

	ListPrint(phead);

	pos = ListFind(phead, 2);
	ListInsert(pos, 8);

	ListPrint(phead);

	ListDestory(phead);
}

int main() {
	test1();//測試ListPushBack 、ListPrint
	test2();//測試
	test3();//測試ListDestory
}```

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

    數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

    本章會用C語言來描述數(shù)據(jù)結(jié)構(gòu)中的順序表,實(shí)現(xiàn)簡單的增刪查改操作,其中頭文件包含在新建的頭文件SeqList.h內(nèi),順序表的實(shí)現(xiàn)在新建的Seqlist.c內(nèi),主函數(shù)Text.c將會實(shí)現(xiàn)菜單,方便我們進(jìn)行功能的選擇。 順序表是用一段物理地址 連續(xù) 的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu)

    2024年02月03日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C語言實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C語言實(shí)現(xiàn))

    在上一節(jié)中我們提到了順序表有如下缺陷: 在頭部/中間的插入與刪除需要挪動數(shù)據(jù),時間復(fù)雜度為O(N),效率低; 增容需要申請新空間,可能會拷貝數(shù)據(jù),釋放舊空間,會有不小的消耗; 增容一般是呈2倍的增長,勢必會有一定的空間浪費(fèi)。例如當(dāng)前容量為100,滿了以后增容

    2024年02月06日
    瀏覽(89)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的增刪查改(附源碼)

    【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的增刪查改(附源碼)

    ? 這么可愛的貓貓不值得點(diǎn)個贊嗎 ???? 目錄 一.鏈表的概念和結(jié)構(gòu) 二.單鏈表的邏輯結(jié)構(gòu)和物理結(jié)構(gòu) 1.邏輯結(jié)構(gòu) ?2.物理結(jié)構(gòu) 三.結(jié)構(gòu)體的定義 四.增加 1.尾插? ?SListpushback 2.頭插? SListpushfront 五.刪除 1.尾刪? SListpopback 2.頭刪? SListpopfront 六.查找? 插入? 釋放? ?打印 1.查找

    2024年02月02日
    瀏覽(89)
  • 【數(shù)據(jù)結(jié)構(gòu).C】順序表和單鏈表的增刪查改

    【數(shù)據(jù)結(jié)構(gòu).C】順序表和單鏈表的增刪查改

    寶子,你不點(diǎn)個贊嗎?不評個論嗎?不收個藏嗎? 最后的最后,關(guān)注我,關(guān)注我,關(guān)注我,你會看到更多有趣的博客哦?。?! 喵喵喵,你對我真的很重要。 目錄 單鏈表增刪查改 c1.h sqlist.c number.c 單鏈表的增刪查改 ?c1.h stuscore.c c1.h sqlist.c number.c ?c1.h stuscore.c ? 寶子,你不點(diǎn)

    2024年02月11日
    瀏覽(91)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈表的分類和雙向鏈表

    【數(shù)據(jù)結(jié)構(gòu)】鏈表的分類和雙向鏈表

    本篇是基于上篇單鏈表所作,推薦與上篇配合閱讀,效果更加 http://t.csdnimg.cn/UhXEj 鏈表的結(jié)構(gòu)非常多樣,以下情況組合起來就有8種(2 x 2 x 2)鏈表結(jié)構(gòu): 我們一般叫這個頭為哨兵位 我們上回講的單鏈表就是不帶頭單項不循環(huán)鏈表。 今天我們要講帶頭雙向循環(huán)的鏈表。 不過

    2024年01月25日
    瀏覽(26)
  • 【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】

    【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】

    注意: 這里的 “帶頭” 跟前面我們說的 “頭節(jié)點(diǎn)” 是兩個概念,實(shí)際前面的在單鏈表階段稱呼不嚴(yán) 謹(jǐn),但是為了同學(xué)們更好的理解就直接稱為單鏈表的頭節(jié)點(diǎn)。 帶頭鏈表里的頭節(jié)點(diǎn),實(shí)際為 “哨兵位” ,哨兵位節(jié)點(diǎn)不存儲任何有效元素,只是站在這里“放哨 的” “哨

    2024年02月06日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)——雙向鏈表的實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)——雙向鏈表的實(shí)現(xiàn)

    注意: 雙向鏈表又稱帶頭雙向循環(huán)鏈表 這?的“帶頭”跟前?我們說的“頭節(jié)點(diǎn)”是兩個概念,實(shí)際前?的在單鏈表階段稱呼不嚴(yán) 謹(jǐn),但是為了同學(xué)們更好的理解就直接稱為單鏈表的頭節(jié)點(diǎn)。 帶頭鏈表?的頭節(jié)點(diǎn),實(shí)際為“ 哨兵位 ”,哨兵位節(jié)點(diǎn)不存儲任何有效元素,只

    2024年02月06日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的實(shí)現(xiàn)

    我要扼住命運(yùn)的咽喉,他卻不能使我完全屈服。? ? ? ? ? ? ? ? ? ? ? --貝多芬 目錄 一.帶頭循環(huán)的雙向鏈表的特點(diǎn) 二.不帶頭不循環(huán)單向鏈表和帶頭循環(huán)的雙向鏈表的對比 三.初始化鏈表,創(chuàng)建哨兵結(jié)點(diǎn) 四.雙向鏈表的各種功能的實(shí)現(xiàn) 1.雙向鏈表的尾插 2.雙向鏈表的打印?

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

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

    2024年02月22日
    瀏覽(96)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包