参考王道《2023年数据结构考研复习指导》
#include <iostream>
typedef int ElemType;
// 循环双链表
typedef struct DNode {
ElemType data;
struct DNode* prior, * next;
} DNode, *DLinklist;
// 初始化为空的循环双链表
bool InitDLinkList(DLinklist& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) // 内存不足,分配失败
return false;
L->prior = L;
L->next = L;
return true;
}
// 判断结点p是否为循环双链表的表尾结点
bool isTail(DLinklist L, DNode* p) {
if (p->next == L)
return true;
else
return false;
}
// 判断循环双链表是否为空
bool Empty(DLinklist L) {
if (L->next == L)
return true;
else
return false;
}
// 双链表的插入
// 在p结点之后插入s结点
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL)
return false;
s->next = p->next;
p->next->prior = s; // 因为是循环单链表,所以不需要判断p->next == NULL;
p->next = s;
s->prior = p;
return true;
}
// 双链表的删除
// 删除p的后继结点
bool DeleteNextDNode(DNode* p) {
if (p == NULL)
return false;
DNode* q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);
return true;
}
/// 头插法建立循环双链表
bool List_HeadInsert(DLinklist& L) {
if (!InitDLinkList(L)) { // 初始化单链表
return false;
}
ElemType x;
std::cin >> x;
while (x != 9999) {
DNode* s = (DNode*)malloc(sizeof(DNode));
if (s == NULL) // 内存分配失败
return false;
s->data = x;
s->next = L->next;
L->next->prior = s;
s->prior = L;
L->next = s;
std::cin >> x;
}
return true;
}
// 输出双链表
void PrintDLink(DLinklist L) {
DNode* p = L->next;
while (p != L) {
std::cout << p->data << " ";
p = p->next;
}
std::cout << std::endl;
}
// 销毁循环双链表
void DestroyList(DLinklist& L) {
DNode* p = L->next;
DNode* q;
while (p != L) {
q = p;
p = p->next;
free(q);
}
free(L);
L = NULL;
}
int main() {
DLinklist L;
List_HeadInsert(L);
PrintDLink(L);
DeleteNextDNode(L);
PrintDLink(L);
DestroyList(L);
system("pause");
return 0;
}
1913

被折叠的 条评论
为什么被折叠?



