判斷單鏈線性表是否為迴圈連結串列
阿新 • • 發佈:2019-01-23
普通連結串列的尾指標為空,迴圈單鏈表的尾指標為頭結點。故可以寫出如下演算法:
節點資料結構:
/*
*定義鏈式儲存線性表的結構
*/
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; }///注意:我這裡的寫法中最後一個節點並不指向頭節點,頭節點的資料域也並沒有存放值 ///只是為了方便找到連結串列才設定的頭節點,也可把第一個節點當做頭節點處理 }