日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

詳解C語(yǔ)言中雙向循環(huán)鏈表的實(shí)現(xiàn)_C 語(yǔ)言

作者:MT_125 ? 更新時(shí)間: 2022-08-10 編程語(yǔ)言

實(shí)現(xiàn)細(xì)節(jié)

1、帶一個(gè)哨兵位(哨兵節(jié)點(diǎn),初始節(jié)點(diǎn),不存儲(chǔ)有效數(shù)據(jù),用來(lái)方便后期數(shù)據(jù)的存儲(chǔ)與查找)

2、與單向鏈表不同的是,雙向鏈表中每個(gè)數(shù)據(jù)節(jié)點(diǎn)包含兩個(gè)指針,分別指向前后兩個(gè)節(jié)點(diǎn)

3、雙向鏈表是循環(huán)的,其尾節(jié)點(diǎn)后不是空指針,而是與頭部的哨兵節(jié)點(diǎn)通過(guò)指針相連

輔助理解圖

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

1、對(duì)鏈表進(jìn)行初始化

初始化:哨兵位的前后指針均指向哨兵節(jié)點(diǎn)本身

void ListInit(ListNode** pphead)
{
    *pphead = (ListNode*)malloc(sizeof(ListNode));
    if (*pphead == NULL)
    {
        perror("ListInit");
        exit(-1);
    }
    (*pphead)->date = -1;
    (*pphead)->next = *pphead;
    (*pphead)->prev = *pphead;
}

2、任意位置前的插入

注意:插入位置前后節(jié)點(diǎn)中的前后指針要進(jìn)行相應(yīng)的更換

void Any_insert(ListNode* pos,Listtype date)
{
    ListNode* Prev = pos->prev;
//建立新節(jié)點(diǎn)
    ListNode* NewNode = (ListNode*)malloc(sizeof(ListNode));
    if (NewNode == NULL)
    {
        perror("Any_insert");
        exit(-1);
    }
    NewNode->date = date;
    NewNode->next = pos;
    pos->prev = NewNode;
    Prev->next = NewNode;
    NewNode->prev = Prev;
}

3、任意位置的刪除

細(xì)節(jié)點(diǎn):當(dāng)鏈表中沒(méi)有數(shù)據(jù)時(shí),就不用刪除,因此需要建立一個(gè)函數(shù)進(jìn)行判斷

bool Determine(ListNode* pphead)
{//判斷鏈表中有無(wú)元素
    assert(pphead);
    return pphead == pphead->next; 
}
 
void Any_delet(ListNode* pos)
{
    assert(!Determine(pos));
    ListNode* Next = pos->next;
    ListNode* Prev = pos->prev;
    Next->prev = Prev;
    Prev->next = Next;
    free(pos);
}

4、頭插和尾刪

此處的插入和刪除,十分方便,即:對(duì)上面的任插和任刪進(jìn)行套用

頭插如下:

void Head_insert(ListNode* pphead, Listtype date)
{
    ListNode* NewNode = (ListNode*)malloc(sizeof(ListNode));
    if (NewNode == NULL)
    {
        perror("Head_insert");
        exit(-1);
    }
 
    //單獨(dú)實(shí)現(xiàn)
    //NewNode->date = date;
    //NewNode->prev = pphead;
    //NewNode->next = pphead->next;
    //pphead->next->prev = NewNode;
    //pphead->next = NewNode;
    
    //進(jìn)行任插的復(fù)用
    Any_insert(pphead->next ,date);
 
}

尾刪如下:

void Tail_delet(ListNode* pphead)
{
    assert(pphead);
 
    //單獨(dú)實(shí)現(xiàn)
    //assert(Determine(pphead));
    /*ListNode* tail = pphead->prev;
    if (tail != pphead)
    {
        ListNode* tailprev = tail->prev;
        tailprev->next = pphead;
        pphead->prev = tailprev;
        free(tail);
    }*/
 
    //尾刪的復(fù)用
    Any_delet(pphead->prev);
}

完整代碼

頭文件

#pragma once
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
 
typedef int Listtype;
 
typedef struct ListNode
{
	struct ListNode* prev;
    Listtype date;
	struct ListNode* next;
}ListNode;
 
void ListInit(ListNode** pphead);                      //鏈表初始化
void ListNode_ADD(ListNode* pphead, Listtype date);    //尾插
void Head_insert(ListNode* pphead, Listtype date);     //頭插
void ListNode_Print(ListNode* pphead);                 //鏈表打印
void Tail_delet(ListNode* pphead);                     //尾刪
bool Determine(ListNode* pphead);                      //判斷表中有無(wú)數(shù)據(jù)
void Any_insert(ListNode* pos, Listtype date);         //任插
void Any_delet(ListNode* pos);                         //任刪
void List_Destory(ListNode* pos);                      //鏈表清空

具體函數(shù)

#define _CRT_SECURE_NO_WARNINGS 1
#include "List.h" 
 
//鏈表打印
void ListNode_Print(ListNode* pphead)
{
	assert(pphead);
	ListNode* phead = pphead;
	pphead = pphead->next;
	for (; pphead != phead; pphead = pphead->next)
	{
		printf("%d ", pphead->date);
	}
	printf("\n");
}
 
bool Determine(ListNode* pphead)
{//判斷鏈表中有無(wú)元素
	assert(pphead);
	return pphead == pphead->next; 
}
 
//鏈表初始化
void ListInit(ListNode** pphead)
{
	*pphead = (ListNode*)malloc(sizeof(ListNode));
	if (*pphead == NULL)
	{
		perror("ListInit");
		exit(-1);
	}
	(*pphead)->date = -1;
	(*pphead)->next = *pphead;
	(*pphead)->prev = *pphead;
}
 
//尾插
void ListNode_ADD(ListNode* pphead,Listtype date)
{
	//ListNode* NewNode = (ListNode*)malloc(sizeof(ListNode));
	//if (NewNode == NULL)
	//{
	//	perror("ADD_malloc");
	//	exit(-1);
	//}
	//NewNode->date = date;
	//NewNode->prev = pphead->prev;
	//pphead->prev->next = NewNode;
	//pphead->prev = NewNode;
	//NewNode->next = pphead;
 
	//任插的復(fù)用
	Any_insert(pphead, date);
 
}
void Head_insert(ListNode* pphead, Listtype date)
{
	ListNode* NewNode = (ListNode*)malloc(sizeof(ListNode));
	if (NewNode == NULL)
	{
		perror("Head_insert");
		exit(-1);
	}
	//NewNode->date = date;
	//NewNode->prev = pphead;
	//NewNode->next = pphead->next;
	//pphead->next->prev = NewNode;
	//pphead->next = NewNode;
    
	//進(jìn)行任插的復(fù)用
	Any_insert(pphead->next ,date);
 
}
 
void Tail_delet(ListNode* pphead)
{
	assert(pphead);
	//assert(Determine(pphead));
	
	/*ListNode* tail = pphead->prev;
	if (tail != pphead)
	{
		ListNode* tailprev = tail->prev;
		tailprev->next = pphead;
		pphead->prev = tailprev;
		free(tail);
	}*/
 
	//尾刪的復(fù)用
	Any_delet(pphead->prev);
}
 
//在任意位置前插入
void Any_insert(ListNode* pos,Listtype date)
{
	ListNode* Prev = pos->prev;
	ListNode* NewNode = (ListNode*)malloc(sizeof(ListNode));
	if (NewNode == NULL)
	{
		perror("Any_insert");
		exit(-1);
	}
	NewNode->date = date;
	NewNode->next = pos;
	pos->prev = NewNode;
	Prev->next = NewNode;
	NewNode->prev = Prev;
}
 
//任意位置刪除
void Any_delet(ListNode* pos)
{
	assert(!Determine(pos));
	ListNode* Next = pos->next;
	ListNode* Prev = pos->prev;
	Next->prev = Prev;
	Prev->next = Next;
	free(pos);
}
 
//鏈表清空
void List_Destory(ListNode* pos)
{
	ListNode* head = pos,*Prev = pos->prev;
	for (pos = pos->prev; head != pos;pos = Prev)
	{
		Prev = pos->prev;
		Any_delet(pos);
	}
	printf("\n清空完成\n");
}

測(cè)試

#define _CRT_SECURE_NO_WARNINGS 1
#include "List.h"
 
void ListTest(ListNode** pphead)
{
	ListInit(pphead);
	Head_insert(*pphead, 60);
	Head_insert(*pphead, 100);
	Head_insert(*pphead, 60);
	Head_insert(*pphead, 50);
	ListNode_Print(*pphead);
 
	Tail_delet(*pphead);
	Tail_delet(*pphead);
	Tail_delet(*pphead);
 
	ListNode_Print(*pphead);
}
 
int main()
{
	ListNode* pphead = NULL;
	ListTest(&pphead);
 
	return 0 ;
}

原文鏈接:https://blog.csdn.net/MT_125/article/details/125309201

欄目分類(lèi)
最近更新