#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;
}
双向链表的代码实现
最新推荐文章于 2023-08-04 07:49:25 发布