1. 程式人生 > >判斷單鏈線性表是否為迴圈連結串列

判斷單鏈線性表是否為迴圈連結串列

 普通連結串列的尾指標為空,迴圈單鏈表的尾指標為頭結點。故可以寫出如下演算法:

節點資料結構:

/*
*定義鏈式儲存線性表的結構
*/
typedef struct LNode
{
    int data;     //資料域
    struct LNode * next; //指向下一個節點的指標
} LNode,*LinkList;
判定是否為迴圈連結串列:
/*
*fun:JudgeCircularList_L()
*desc:判斷單鏈線性表L是否為迴圈連結串列,若是則返回OK,否則返回ERROR
*@param: L LinkList 頭指標的引用
*@ret:OK/ERROR int
*/
Status JudgeCircularList_L(LinkList &L)
{
    if(!L||!L->next) return ERROR; //空指標或者單鏈表為空表
    LinkList tail,first;
    first=L->next;
    tail=first->next;
    while(tail&&tail!=first)
    {
        tail=tail->next;
    }
    if(!tail) return ERROR;
    else return OK;
}
建立迴圈連結串列:
/*
*fun:CreateCircularList_L()
*desc:順序輸入n個元素的值,建立帶表頭結點的迴圈單鏈線性表L
*@param: L LinkList型別(結構體指標型別)變數的引用
*@param:n int n n個元素
*@ret void
*/
void CreateCircularList_L(LinkList &L,int n)
{
    int m=n,value;
    L=(LinkList) malloc(sizeof(LNode));  //先建立一個帶頭結點的單鏈表
    L->next=L;     //為空表時,頭結點指向本身
    LinkList tail=L,current,first;  //指標tail指向當前連結串列的最後一個節點,current指向當前插入的節點
    for(int i=0; i<m; i++)
    {
        current=(LinkList)malloc(sizeof(LNode));
        if(!i)first=current; //first記錄第一個節點的地址
        scanf("%d",&value); //輸入節點的值
        current->data=value;
        tail->next=current; //將新節點新增到連結串列尾部
        current->next=first;
        tail=current;
    }///注意:我這裡的寫法中最後一個節點並不指向頭節點,頭節點的資料域也並沒有存放值
    ///只是為了方便找到連結串列才設定的頭節點,也可把第一個節點當做頭節點處理
}