DS_4_29(带头节点双向循环链表增,删,改,查的实现)

如果让别人来决定你的人生,你的内心永远不会感到踏实!–拿破仑

在这里插入图片描述
1. DList.h

#pragma once

typedef int DLDataType;                        //双向循环链表结构体名称

typedef struct DListNode{
	struct DListNode* _pNext;                  //指向当前结点的下一个  
	struct DListNode* _pPre;
	DLDataType _data;                          //当前节点的值域
	//结构体别名; struct DListNode的别名
}DLNode, *PDLNode;

void DListInit(PDLNode* pHead);
void DListPushBack(PDLNode pHead, DLDataType data);
void DListPopBack(PDLNode pHead);
void DListPushFront(PDLNode pHead, DLDataType data);
void DListPopFront(PDLNode pHead);
void DListInsert(PDLNode pos, DLDataType data);
void DListErase(PDLNode pos);
void DListClear(PDLNode pHead);
void DListDestroy(PDLNode* pHead);
void TestDList();

2.DList.c

#include "DList.h"
#include <malloc.h>
#include <assert.h>
#include <stdio.h>

//初始化

void DListInit(PDLNode* pHead){
	assert(pHead);
	*pHead = (PDLNode)malloc(sizeof(DLNode));
	if (NULL == *pHead){
		assert(0);
		return;
	}
	(*pHead)->_pNext = *pHead;
	(*pHead)->_pPre = *pHead;
}

//获取结点

PDLNode BuyDListNode(DLDataType data){
	PDLNode pNewNode = (PDLNode)malloc(sizeof(DLNode));
	if (NULL == pNewNode){
		assert(0);
		return;
	}
	pNewNode->_pNext = NULL;
	pNewNode->_pPre = NULL;
}

//插入的原则:在不破坏链表结构的前提下进行操作
//尾插

在这里插入图片描述

void DListPushBack(PDLNode pHead, DLDataType data){
	PDLNode pNewNode = BuyDListNode(data);    //获取一个新结点
	pNewNode->_pNext = pHead;
	pNewNode->_pPre = pHead->_pPre;
	pHead->_pPre->_pNext = pNewNode;
	pHead->_pPre = pNewNode;
}

//尾删
在这里插入图片描述

void DListPopBack(PDLNode pHead){
	assert(pHead);
	if (pHead == pHead->_pNext){
		return;
	}
	PDLNode pDelNode = pHead->_pPre;
	pDelNode->_pPre->_pNext = pHead;
	pHead->_pPre = pDelNode->_pPre;
	free(pDelNode);
}

//头插
在这里插入图片描述

void DListPushFront(PDLNode pHead, DLDataType data){
	PDLNode pNewNode = BuyDListNode(data);
	pNewNode->_pNext = pHead->_pNext;
	pNewNode->_pPre = pHead;
	pHead->_pNext = pNewNode;
	pNewNode->_pNext->_pPre = pNewNode;
}

//头删

void DListPopFront(PDLNode pHead){
	assert(pHead);
	if (pHead->_pNext == pHead){
		return;
	}
	PDLNode pDelNode = pHead->_pNext;
	pHead->_pNext = pDelNode->_pNext;
	pDelNode->_pNext->_pPre = pHead;
	free(pDelNode);
}

//任意插入
在这里插入图片描述

void DListInsert(PDLNode pos, DLDataType data){
	if (NULL == pos){
		return;
	}
	PDLNode pNewNode = BuyDListNode(data);
	pNewNode->_pNext = pos;
	pNewNode->_pPre = pos->_pPre;
	pos->_pPre = pNewNode;
	pNewNode->_pPre->_pNext = pNewNode;
}

//任意删除
在这里插入图片描述

void DListErase(PDLNode pos){
	if (NULL == pos){
		return;
	}
	pos->_pNext->_pPre = pos->_pPre;
	pos->_pPre->_pNext = pos->_pNext;
	free(pos);
}

//清空

void DListClear(PDLNode pHead){
	PDLNode pCur = pHead->_pNext;
	while (pCur != pHead){
		pHead->_pNext = pCur->_pNext;
		free(pCur);
		pCur = pHead->_pNext;
	}
	pHead->_pNext = pHead;
	pHead->_pPre = pHead;
}

//销毁

void DListDestroy(PDLNode* pHead){
	DListClear(*pHead);
	free(*pHead);
	*pHead = NULL;
}

//测试

void TestDList(){
	PDLNode pHead = NULL;
	DListInit(&pHead);
}

3.test.c

int main(){
	TestDList();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值