循环双链表
由循环单链表的定义不难推出循环双链表。不同的是在循环双链表中,头结点的prior指针还要指向尾结点。
循环双链表中结点类型的描述如下:
typedef struct CDNode {
ElemType data;
CDNode* next, * prior;
}CDNode,*CDLinkList;
初始化:
CDLinkList InitList(CDLinkList& L) {
if (L == NULL) {
return NULL;
}
L = new CDNode;
L->next = L;
L->prior = L;
return L;
}
头插法:
CDLinkList HeadInsert(CDLinkList& L) {
cout << "采用头插法创建链表:" << endl;
int x;
cin >> x;
while (x != 9999) {
CDNode* s = new CDNode;
s->data = x;
s->next = L->next;
L->next->prior = s;
L->next = s;
s->prior = L;
cin >> x;
}
return L;
}
尾插法:
CDLinkList TailInsert(CDLinkList& L) {
cout << "采用尾插法创建链表:" << endl;
int x;
cin >> x;
while (x != 9999) {
CDNode* s = new CDNode;
s->data = x;
s->prior = L->prior;
L->prior->next = s;
L->prior = s;
s->next = L;
cin >> x;
}
return L;
}
元素个数:
int length(CDLinkList L) {
int i = 0;
CDNode* s = L;
while (s->prior != L) {
s = s->prior;
i++;
}
return i;
}
按位插入:
bool ListInsert(CDLinkList& L, int i, ElemType e) {
if (i < 1 || i - 1>length(L)) {
return false;
}
int j = 1;
CDNode* s = L->next;
CDNode* p = new CDNode;
p->data = e;
while (j < i - 1 && s != L) {
s = s->next;
j++;
}
p->next = s->next;
s->next->prior = p;
s->next = p;
p->prior = s;
return true;
}
按值查找:
bool LocateElem(CDLinkList L, ElemType e) {
int i = 1;
CDNode* s = L->next;
while (s->data != e && s != L) {
s = s->next;
i++;
}
if (s == L) {
return false;
}
cout << i << endl;
return true;
}
按位查找:
bool GetElem(CDLinkList L, int i) {
if (i<1 || i>length(L)) {
return false;
}
int j = 0;
CDNode* s = L;
while (j < i - 1 && s->next != L) {
s = s->next;
j++;
}
cout << s->next->data << endl;
return true;
}
按位删除:
bool DeleteList(CDLinkList& L, int i, ElemType& e) {
if (i<1 || i>length(L)) {
return false;
}
int j = 0;
CDNode* s = L;
while (j < i - 1 && s->next != L) {
s = s->next;
j++;
}
CDNode* p = s->next;
e = p->data;
s->next = p->next;
s->next->prior = s;
free(p);
return true;
}
按值删除:
bool DeleteElem(CDLinkList& L, ElemType e, ElemType& i) {
CDNode* s = L;
while (s->data != e && s->next != L) {
s = s->next;
}
if (L->prior->data == e) {
CDNode* q = L->prior;
i = q->data;
L->prior = q->prior;
L->prior->next = L;
return true;
}
else {
return false;
}
i = s->data;
CDNode* r = s->prior;
r->next = s->next;
r->next->prior = r;
free(s);
return true;
}
判空操作:
bool Empty(CDLinkList L){
if (L->prior == L) {
return true;
}
else {
return false;
}
}
输出操作:
void PrintList(CDLinkList L) {
CDNode* s = L->next;
while (s != L) {
cout << s->data << "\t";
s = s->next;
}
cout << endl;
}
销毁操作:
void DestoryList(CDLinkList& L) {
while (L->next != L) {
CDNode* s = L->next;
L->next = s->next;
L->next->prior = L;
free(s);
}
}