在单链表和双链表上加上一点小小的改进–循环链表
循环单链表
最后一个结点的next指针指向头结点
初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| typedef struct LNode { ElemType data; struct LNode* next; }LNode,*LinkList; bool InitList(LinList &L){ L= (LNode*)malloc(sizeof(LNode)); if(L==NULL) return false; L->next=L; return true; } bool isEmpty(LinList L){ return L->next==L; } void test(){ LinkList L; InitList(L); }
|
循环双链表
表头结点的prior指向表尾结点
表尾结点的next指针指向头结点
初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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; } void testDLinklist() { DLinklist L; InitDLinklist(L); }
bool Empty(DLinklist L){ if(L->next==L) return true; else return false; }
|
对于添加(和删除)操作的时候
直接抢p(尾)结点 的next指针的prior指向下(删除反过来)一个结点