双向链表的代码实现

#include <corecrt_malloc.h>
constexpr auto OK = 1;
constexpr auto Error = 0;
constexpr auto True = 1;
constexpr auto False = 0;

typedef int Status;
typedef int ElemType;
//定义双链表结构体
typedef struct Temp
{
	ElemType data;			//数据
	struct Temp* Next;
	struct Temp* prior;
}DoubleLinkList;

//初始化双链表
Status InitList(DoubleLinkList *head,DoubleLinkList *end)
{
	head = (DoubleLinkList*)malloc(sizeof(Temp));
	end = (DoubleLinkList*)malloc(sizeof(Temp));

	if (!head || !end)
	{
		return Error;
	}

	head->Next = end;
	end->prior = head;
	head->prior = NULL;
	end->Next = NULL;
}
//判断双链表是否为空
Status IsEmpty(DoubleLinkList* head, DoubleLinkList* end)
{
	if (head->Next == end)
	{
		return True;
	}
	return False;
}

//计算双链表长度
Status DoubleLinkListLength(DoubleLinkList* head, DoubleLinkList* end)
{
	DoubleLinkList* node = head;
	int n = 0;
	while (node->Next->Next)
	{
		node = node->Next;
		n++;
	}
	return n;
}

//第i个位置插入元素e
Status InsertDoubleLinkList(DoubleLinkList* head, DoubleLinkList* end,int i, ElemType e)
{
	if (i < 1 || DoubleLinkListLength(head, end) + 1 < i)
	{
		return Error;
	}
	DoubleLinkList* newNode = (DoubleLinkList*)malloc(sizeof(Temp));
	if (!newNode)
	{
		return Error;
	}
	DoubleLinkList* node = head;
	for (int j = 1;j < i;j++)
	{
		node = node->Next;
	}
	newNode->Next = node->Next;
	newNode->prior = node;
	node->Next->prior = newNode;
	node->Next = newNode;
	newNode->data = e;

	return OK;
}

//尾插法插入创建列表
Status CreatListByEnd(DoubleLinkList* head, DoubleLinkList* end, ElemType e)
{
	DoubleLinkList* newNode = (DoubleLinkList*)malloc(sizeof(Temp));
	if (!newNode)
	{
		return Error;
	}
	newNode->data = e;
	newNode->prior = NULL;						//个人认为可省略
	newNode->Next = NULL;						//个人认为可省略
	end->prior->Next = newNode;
	newNode->prior = end->prior;
	newNode->Next = end;
	end->prior = newNode;
	return OK;
}

//头插法创建双链表
Status CreatListByHead(DoubleLinkList* head, DoubleLinkList* end, ElemType e)
{
	DoubleLinkList* newNode = (DoubleLinkList*)malloc(sizeof(Temp));
	if (!newNode)
	{
		return Error;
	}
	newNode->data = e;
	newNode->prior = NULL;						//个人认为可省略
	newNode->Next = NULL;						//个人认为可省略

	head->Next->prior = newNode;
	newNode->Next = head->Next;
	newNode->prior = head;
	head->Next = newNode;

	return OK;
}

//删除第i个元素
Status DeleteDoubleLinkList(DoubleLinkList* head, DoubleLinkList* end, int i)
{
	if (i < 1 || DoubleLinkListLength(head, end) < i)
	{
		return Error;
	}

	DoubleLinkList* node = head;
	for (int j = 0;j < i;j++)
	{
		node = node->Next;
	}
	node->Next->prior = node->prior;
	node->prior->Next = node->Next;
	free(node);

	return OK;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值