总结归纳
- 在 InsertPriorNode 函数(前插操作)中,如果想在表尾处插入结点,则无法进行,需要特殊处理,比较简单,这里没有写出;同时,也可以使用 InsertNextNode 函数(后插操作)来实现。
- 循环双链表的实现与循环单链表大同小异,甚至还更为简洁。由于可以快速找到指定结点的前驱结点,所以很多对头结点、尾节点的插入和删除操作就不用特殊处理。
- 当然,循环双链表要付出一定的内存代价。
代码实现
#include <iostream>
#include <string>
using namespace std;
struct DNode {
int data;
DNode *prior;
DNode *next;
};
typedef DNode DNode;
typedef DNode *DLinkList;
void InitList(DLinkList &L) {
L = new DNode;
L->next = L;
L->prior = L;
}
bool Empty(DLinkList &L) {
if (L->next == L) {
return true;
} else {
return false;
}
}
int GetLength(DLinkList &L) {
DNode *p = L->next;
int length = 0;
while (p != L) {
p = p->next;
length++;
}
return length;
}
DLinkList DList_HeadInsert(DLinkList &L) {
int e;
cin >> e;
while (e != 9999) {
if (L->next == L) {
DNode *s = new DNode;
s->data = e;
s->next = L->next;
L->next = s;
s->prior = L;
L->prior = s;
cin >> e;
} else {
DNode *s = new DNode;
s->data = e;
s->next = L->next;
L->next->prior = s;
L->next = s;
s->prior = L;
cin >> e;
}
}
return L;
}
DLinkList DList_TailInsert(DLinkList &L) {
DNode *r = L;
int e;
cin >> e;
while (e != 9999) {
DNode *s = new DNode;
s->next = r->next;
s->prior = r;
s->data = e;
r->next = s;
L->prior = s;
r = s;
cin >> e;
}
return L;
}
DNode *GetElem(DLinkList &L, int i) {
if (i < 0) {
return NULL;
}
DNode *p = L;
int j = 0;
while (p->next != L && j != i) {
p = p->next;
j++;
}
return p;
}
DNode *GetLNode(DLinkList &L, int e) {
DNode *p = L->next;
while (p != L && p->data != e) {
p = p->next;
}
return p;
}
bool InsertPriorNode(DLinkList &L, DNode *p, int e) {
if (p == L) {
return false;
}
DNode *s = new DNode;
s->next = p;
s->prior = p->prior;
s->data = e;
p->prior->next = s;
p->prior = s;
return true;
}
bool InsertNextNode(DLinkList &L, DNode *p, int e) {
if (p == L) {
return false;
}
DNode *s = new DNode;
s->next = p->next;
p->next->prior = s;
s->data = e;
p->next = s;
s->prior = p;
return true;
}
bool DListInsert(DLinkList &L, int i, int e) {
if (i < 1) {
return false;
}
DNode *p = GetElem(L, i - 1);
InsertNextNode(L, p, e);
return true;
}
bool DeleteNextDNode(DLinkList &L, DNode *p) {
if (p->next == L) {
return false;
}
DNode *s = new DNode;
s = p->next;
p->next = s->next;
s->next->prior = p;
delete s;
return true;
}
bool DeleteNode(DLinkList &L, DNode *p) {
if (p == L) {
return false;
}
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
return true;
}
bool DListDelte(DLinkList &L, int i, int &e) {
if (i < 1) {
return false;
}
DNode *p = new DNode;
p = GetElem(L, i);
e = p->data;
DeleteNode(L, p);
return true;
}
void TraverseDList(DLinkList &L) {
DNode *p = L->next;
while (p != L) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
DLinkList L;
InitList(L);
cout << Empty(L) << endl;
L = DList_TailInsert(L);
TraverseDList(L);
DListInsert(L, 3, 5244);
TraverseDList(L);
int e = -1;
DListDelte(L, 1, e);
cout << "被删除的值:" << e << endl;
TraverseDList(L);
cout << "尾节点:" << L->prior->data << endl;
cout << "头结点的后继结点:" << L->next->next->data << endl;
}