基本数据结构----循环双链表
在循环链表中提到了,将循环链表的头尾指针相连就形成了双向循环链表
代码:
#include<iostream> #include<malloc.h> using namespace std; typedef char ElemType; typedef struct DNode { ElemType data; struct DNode *pre; struct DNode *next; } DLinkList; void InitList(DLinkList *&L) { L = (DLinkList *)malloc(sizeof(DLinkList)); L->pre = NULL; L->next= NULL; } void DestroyList(DLinkList *&L) { DLinkList *p = L,*q = p->next; while(q != NULL) { free(p); p = q; q = p->next; } free(p); } int ListEmpty(DLinkList *L) { return (L->next==L); } int ListLength(DLinkList *L) { DLinkList *p=L; int i = 0; while(p->next != NULL) { i++; p = p->next; } return i; } void DisplayList(DLinkList *L) { DLinkList *p = L->next; while(p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } int GetElem(DLinkList *L,int i,ElemType &e) //得到第i个元素 { int j = 0; DLinkList *p; if(L->next != L) { if(i==1) { e = L->next->data; return 1; } else { p = L->next; while(j<i-1&&p!=L) { j++; p = p->next; } if(p==L) return 0; else { e = p->data; return 1; } } } else return 0; } int LocateElem(DLinkList *L,ElemType e) //确定元素e的位置 { int n = 1; DLinkList *p = L->next; while(p!=NULL && p->data != e) { n++; p = p->next; } if (p==NULL) return 0; else return n; } int ListInsert(DLinkList *L,int i,ElemType e) { int j = 0; DLinkList *p = L,*s; if(p->next ==L) { s = (DLinkList *)malloc(sizeof(DLinkList)); s->data = e; p->next=s; s->next=p; p->pre=s; s->pre=p; return 1; } else if(i==1) { s = (DLinkList *)malloc(sizeof(DLinkList)); s->data=e; s->next=p->next; p->next=s; s->next->pre=s; //产生段异常!!!肿么办!!! s->pre=p; return 1; } else { p=L->next; while(j<i-2&&p!=L) { j++; p=p->next; } if(p==L) return 0; else { s=(DLinkList *)malloc(sizeof(DLinkList)); s->data=e; s->next=p->next; if(p->next!=NULL) p->next->pre=s; s->pre=p; p->next=s; return 1; } } } int ListDelete(DLinkList *&L,int i,ElemType &e) { int j = 0; DLinkList *p = L, *q; if(L->next != L) { if(i==1) { q = L->next; L->next = q->next; q->next->pre=L; free(q); return 1; } else { p = L->next; while(j<i-2&&p!=NULL) { j++; p = p->next; } if(p==L) return 0; else { q = p->next; if(q==NULL) return 0; p->next = q->next; if(p->next!=NULL) p->next->pre=p; free(q); return 1; } } } else return 0; } int main() { DLinkList *L; ElemType e; cout << " (1):初始化双链表L:\n "; InitList(L); cout << "(2):依次采用插入法插入元素abcde\n"; ListInsert(L,1,'a'); ListInsert(L,2,'b'); ListInsert(L,3,'c'); ListInsert(L,4,'d'); ListInsert(L,5,'e'); cout << " (3)输出双链表L: "; DisplayList(L); cout << " (4)双链表的长度:"; cout << ListLength(L) << endl; cout << " (5)双链表为: " << (ListEmpty(L)?"空":"非空"); GetElem(L,3,e); cout << " (6)双链表第3个元素为:" << e << endl; cout << " (7)元素a的位置是: " << LocateElem(L,'a') <<endl; cout << " (8)在第四个位置上插入元素f"; ListInsert(L,4,'f'); cout << " (9)输出双链表L"; DisplayList(L); cout << " (10)删除第三个元素:\n"; ListDelete(L,3,e); cout << " (11)输出双链表L: "; DisplayList(L); cout << " (12)释放双链表L:"; }