循環鏈表(單雙鏈表)

循環鏈表就是將尾結點的指針指向頭結點形成一個循環的鏈表。循環單鏈表的初始化就是使頭結點自己指向自己,而循環雙鏈表的初始化是頭結點的前後驅結點都是指向自己。循環鏈表的好處就是可以在插入或者刪除表尾元素的操作時,不用再判斷結點爲空的可能,大大的減少了代碼的複雜性。詳情請看代碼:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//定義循環單鏈表
typedef struct Node{
    int data;
    struct Node *next;
}Node,*RepeatSimpleList;

//定義循環雙鏈表
typedef struct DNode{
    int data;
    struct DNode *prior,*next;
}DNode,*RepeatDoubleList;

//初始化一個循環雙鏈表 
bool InitRepeatDoubleList(RepeatDoubleList &L){
    L = (DNode*)malloc(sizeof(DNode));
    if(L==NULL){
        return false;
    }
    L->prior = L;//頭結點的前驅指針指向頭結點 
    L->next = L;//頭結點的後驅指針指向頭結點 
}

//初始化一個循環單鏈表
bool InitRepeatSimpleList(RepeatSimpleList &L){
    L = (Node*)malloc(sizeof(Node));
    if(L==NULL){
        return false;
    }
    L->next = L;//頭結點指向頭結點 
    return true;
} 

//判斷循環雙鏈表是否爲空
bool Empty(RepeatDoubleList L){
    if(L->next==L){
        return true;
    }else{
        return false;
    }
}

//判斷循環單鏈表是否爲空
bool isEmpty(RepeatSimpleList L){
    if(L->next==L){
        return true;
    }else{
        return false;
    }
}

//在p結點之後插入s結點(循環雙鏈表)
bool InsertNextDNode(DNode *p,DNode *s){
    s->next = p->next;
    p->next->prior = s;
    s->prior = p;
    p->next = s;
} 

//刪除p結點後的後繼結點(循環雙鏈表) 
bool DeleteNextDNode(DNode *p){
    DNode *q = p->next;//q指針指向目標結點 
    p->next = q->next;
    q->next->prior = p; 
    free(q);//釋放目標結點 
}

//判斷結點p是否爲循環雙鏈表尾結點
bool Finish(RepeatDoubleList L,DNode *p){
    if(p->next==L){
        return true;
    }else{
        return false;
    }
} 

//判斷結點p是否爲循環單鏈表尾結點
bool isFinish(RepeatSimpleList L,Node *p){
    if(p->next==L){
        return true;
    }else{
        return false;
    }
} 

int main(int argc, char** argv) {
    RepeatSimpleList L;//聲明一個循環單鏈表
    RepeatDoubleList L;//聲明一個循環雙鏈表
    InitRepeatSimpleList(L);//初始化循環單鏈表 
    InitRepeatDoubleList(L);//初始化循環雙鏈表 
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章