九、双链表

请添加图片描述

头文件:

typedef int Elemtype;//链表的头节点的pre指向尾节点,尾节点的next指向头节点
//如果只有一个头节点,则让头节点的next和pre都指向本身
typedef struct DuLinkNode
{
	struct DuLinkNode* prev;
	struct DuLinkNode* next;
	Elemtype data;
}DuLinkNode,*PDuLinkNode;
typedef struct DuLinkList
{
	PDuLinkNode head;
	Elemtype cursize;
}DuLinkList;
void INIT_Du(DuLinkList* plist);//初始化链表
PDuLinkNode BuyNode();//购买节点
void PrintDuList(const  DuLinkList* plist);//打印链表
DuLinkNode* FindValue(const DuLinkList* plist, Elemtype val);//在链表中寻找值为val的节点并返回其地址
bool Insert_Prev(DuLinkList* plist, DuLinkNode* ptr, int val);//在ptr之前插入节点
void Push_Front(DuLinkList* plist, Elemtype val);//头插
void Push_back(DuLinkList* plist, Elemtype val);//尾插
bool Erase(DuLinkList* plist, DuLinkNode* ptr);//删除ptr前一个结点

主函数:

#include<assert.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"DuLinkList.h"
void INIT_Du(DuLinkList*plist)//初始化链表
{
	assert(plist != NULL);
	plist->cursize = 0;
	plist->head = BuyNode();
	plist->head->next = plist->head;
	plist->head->prev = plist->head;
}
PDuLinkNode BuyNode()//购买节点
{
	PDuLinkNode s = (PDuLinkNode)malloc(sizeof(DuLinkNode));
	assert(s != NULL);
	memset(s, 0, sizeof(DuLinkNode));
	return s;
}
void PrintDuList(const  DuLinkList* plist)//打印链表
{
	assert(plist != nullptr);
	DuLinkNode* p = plist->head->next;
	while (p->next != plist->head)//当到达最后一个节点时,节点的next指向头节点
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}
DuLinkNode* FindValue(const DuLinkList* plist, Elemtype val)//在链表中寻找值为val的节点并返回其地址
{
	assert(plist != nullptr);
	DuLinkNode* p = plist->head->next;
	while (p!= plist->head&&p->data!=val)
	{
		p = p->next;
	}
	if (p == plist->head)
	{
		p = NULL;
	}
	return p;
}
bool Insert_Prev(DuLinkList* plist, DuLinkNode* ptr, int val)//在ptr之前插入节点
{
	assert(plist != NULL);
	if (ptr != NULL)
	{
		DuLinkNode* s = BuyNode();
		s->next = ptr;//将新节点的next赋值为ptr的地址
		s->prev = ptr->prev;//将新节点的prev赋值为ptr的前一个结点的地址
		ptr->prev->next = s;//将ptr前一个结点的next赋值为s
		ptr->prev = s;//将ptr前一个节点的地址赋值为s
		s->data = val;
		plist->cursize++;
		return true;
	}
	else
	{
		return false;
	}
}
void Push_Front(DuLinkList* plist, Elemtype val)//头插
{
	assert(plist != NULL);
	Insert_Prev(plist, plist->head->next, val);
}
void Push_back(DuLinkList* plist, Elemtype val)//尾插
{
	assert(plist != NULL);
	Insert_Prev(plist, plist->head, val);
}
bool Erase(DuLinkList*plist, DuLinkNode* ptr)//删除ptr前一个结点
{
	assert(plist != NULL);
	if (ptr == NULL)return false;
	ptr->next->prev = ptr->prev;
	ptr->prev->next = ptr->next;
	free(ptr);
	ptr = NULL;
	plist->cursize--;
	return true;
}
bool Clear(DuLinkList* plist)
{
	assert(plist != NULL);
	plist->cursize = 0;
	plist->head->next = plist->head;
	plist->head->prev = plist->head;
}
bool Destroy(DuLinkList* plist)
{
	Clear(plist);
	free(plist->head);
	plist->head = NULL;
	free(plist);
	plist = NULL;
}
int main()
{
	DuLinkList x = {};
	DuLinkList* p = &x;
	INIT_Du(p);
	
	
	for (int i = 0; i < 10; i++)
	{
		Insert_Prev(p, p->head,i+1);
		PrintDuList(p);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值