#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct DNode
{
int data;
struct DNode* prior, * next;
}DNode, * DLinklist;
//初始化循环双链表
bool InitDLinkList(DLinklist& L)
{
L = (DNode*)malloc(sizeof(DNode)); //分配一个头结点
if (L == NULL) //内存不足,分配失败
return false;
L->prior = L; //头结点的prior永远指向NULL
L->next = L; //头结点之后暂时还没有节点
return true;
}
//正向建立循环双链表,尾插法
DLinklist List_TailInsert(DLinklist& L)
{
int x;
L = (DLinklist)malloc(sizeof(DNode));//建立头结点
if (L)
{
DNode* s, * r = L; //r为表尾指针
std::cin >> x; //输入结点的值
while (x != -1) //输入-1表示结束
{
s = (DNode*)malloc(sizeof(DNode));
if (s)
{
s->data = x;
r->next = s; //在r结点之后插入元素x
s->prior = r;
r = s; //r指向新的表尾结点,永远指向最后一个结点
std::cin >> x;
}
}
r->next = L; //尾结点指针指向头结点
}
return L;
}
//逆向建立循环双链表,头插法;重要应用: 链表的逆置
DLinklist List_HeadInsert(DLinklist& L)
{
DNode* s;
int x;
L = (DNode*)malloc(sizeof(DNode));
if (L)
{
int i = 1;
L->next = L;
std::cin >> x;
while (x != -1)
{
s = (DNode*)malloc(sizeof(DNode));
if (s)
{
s->data = x;
s->next = L->next;
L->next = s;
s->prior = L;
if (i-->0)L->prior = s;
std::cin >> x;
}
}
}
return L;
}
//判断循环双链表是否为空
bool Empty(DLinklist L)
{
return L->next == L;
}
//判断结点p是否为循环双链表的表尾结点
bool isTail(DLinklist L, DNode* p)
{
return p->next == L;
}
//在p结点之后插入s结点
bool InsertNextDNode(DNode* p, DNode* s)
{
if (p == NULL || s == NULL)
return false;
s->next = p->next; //将结点*s插入到结点*p之后
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
//删除p结点的后继结点
bool DeleteNextDNode(DLinklist &L, DNode* p)
{
if (p->next == L) //最后的结点
return false;
DNode* q = p->next; //找到 p 的后继结点 q
p->next = q->next; //p 的 next 指针指向要删除结点的后继结点
q->next->prior = p; //q 的后继结点的前指针指向 p
free(q);
return true; //释放结点空间
}
//销毁循环双链表
void DestoryList(DLinklist& L)
{
//释放各个数据结点
while (L->next != L)
DeleteNextDNode(L, L);
free(L); //释放头结点
L = NULL; //头指针指向NULL
}
int main()
{
DLinklist L;
List_HeadInsert(L);
DNode* p = L;
while (p->next != L)
{
p = p->next;
std::cout << p->data << std::endl;
}
return 0;
}
王道数据结构(循环双链表)
于 2023-05-03 18:14:38 首次发布