参考王道《2023年数据结构考研复习指导》
#include <iostream>
#define MaxSize 20
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 = NULL;
L->next = NULL;
return true;
}
// 双链表的插入(在p结点之后插入s结点)
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
if (p->next != NULL) {
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
// 双链表的删除(删除p结点的后继结点)
bool DeleteNextDNode(DNode* p) {
if (p == NULL)
return false;
DNode* q = p->next;
if (q == NULL)
return false;
p->next = q->next;
if (q->next != NULL) {
q->next->prior = p;
}
free(q);
return true;
}
// 销毁双链表
void DestoryList(DLinklist& L) {
while (L->next != NULL) {
DeleteNextDNode(L); // 每次删除头结点的后继结点
}
free(L);
L = NULL;
}
// 尾插法建立双链表
bool DList_TailInsert(DLinklist& L) {
if (!InitDLinkList(L)) { // 初始化单链表
return false;
}
DNode* r = L; // r为表尾指针
ElemType x;
std::cin >> x;
while (x != 9999) {
DNode* s = (DNode*)malloc(sizeof(DNode));
if (s == NULL) // 内存分配失败
return false;
s->data = x;
r->next = s;
s->prior = r;
r = s;
std::cin >> x;
}
r->next = NULL;
return true;
}
// 输出双链表
void PrintDLink(DLinklist L) {
DNode* p = L->next;
while (p != NULL) {
std::cout << p->data << " ";
p = p->next;
}
std::cout << std::endl;
}
int main() {
DLinklist L;
InitDLinkList(L);
DList_TailInsert(L);
PrintDLink(L);
system("pause");
return 0;
}