一.循環單連結清單:
- 定義循環單連結清單
和普通單連結清單一樣:
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
- 初始化循環單連結清單:
bool InitList(LinkList &L){
L=(LNode*)malloc(sizeof(LNode)); //配置設定一個單連結清單
if(L==NULL);
return false;
L->next=L; //頭結點指向自己
return true;
}
- 判斷循環單連結清單是否為空:
bool Empty(LinkList L){
return (L->next==L);
}
- 判斷指定結點是否為尾結點:
bool IsTail(LinkList L,LNode *p){
return (p->next==L);
}
二.循環雙連結清單:
- 循環雙連結清單的定義:
typedef struct DNode{
Elemtype data;
struct DNode *next,*prior;
}DNode,*DLinkList;
- 循環雙連結清單的初始化:
bool InitDLinkList(DLinkList &L){
L=(DNode*)malloc(sizeof(DNode));
if(L==NULL)
return false;
L->next=L;
L->prior=L;
return true;
}
- 判斷循環雙連結清單是否為空:(與單連結清單相同)
bool Empty(DLinkList L){
return (L->next==L); //&&L->prior==L可以省略
}
- 指定結點是否為尾結點:(與單連結清單相同 )
bool IsTail(DNode *p,DLinkList L){
return (p->next==L);
}
- 循環雙連結清單的插入:
之前雙連結清單的插入雖然也是如此,但是在最後一個結點插入時會出現問題。因為p->next->prior會傳回空指針錯誤。
//p結點後插入s結點
bool InsertNextDNode(DNode *p,DNode *s){
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
return true;
}
- 循環雙連結清單的删除:
//在p結點後删除s
bool DeletDNode(DNode *p,DNode *s){
p->next=s->next;
s->next->prior=p;
free(s);
return true;
}
以上許多操作少寫了異常判斷,應該加入判斷傳入指針是否為空指針的語句。(作業太多了,偷懶ing。。。)
總結一下,循環連結清單主要是可以友善操作頭結點尾結點(尤其尾結點)
,尾結點的下一個結點是頭結點。