程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 判斷一個單鏈表是否是環,找到環的結合處

判斷一個單鏈表是否是環,找到環的結合處

編輯:關於C語言

Linknode * createLink( int n )
{
    int xValue;
    Linknode *head,*p,*pre;
    cout<<"請輸入第1個數字: ";
    cin>>xValue;
    p=(Linknode*)malloc(sizeof(Linknode));
    //p=new Linknode;
    p->data=xValue;
    p->next=NULL;
    head=p;
    pre=p;
    for(int i=1;i<n;i++)
    {
        cout<<"請輸入第"<<i+1<<"個數字: ";
        cin>>xValue;
        p=(Linknode*)malloc(sizeof(Linknode));
        p->data=xValue;
        if(i==n-1)
        {
            /*cout<<"已經組成一個環了!"<<endl;*/
            p->next=head->next;
        }
        else
        {
            p->next=NULL;
        }
                                
        pre->next=p;
        pre=p;
    }
    //printLink(head);
    return head;
}



Linknode * findFirstCycleNode( Linknode *head )
{
    assert(head!=NULL&&head->next!=NULL);
    Linknode *pStart,*pCur;
    pCur=head;
    int nCur=0,nStart;
    //檢查每一個結點,若是 null退出,不是一個環。
    while(pCur!=NULL)
    {
        pStart=head;
        nStart=0;
        while(pStart!=NULL)
        {
            if(pStart==pCur)
            {
                if(nStart==nCur)
                {
                    break;
                }
                else            //找到環的入口處了。
                {
                    cout<<"找到了,在第"<<nStart+1<<"節點處"<<endl;
                    return pStart;
                }
            }
            nStart++;
            pStart=pStart->next;
        }
        nCur++;
        pCur=pCur->next;
    }
                  
    cout<<"該鏈表不是一個環!"<<endl;
    return NULL;
}



Linknode * findFirstCycleNode2( Linknode *head )
{
    assert(head!=NULL&&head->next!=NULL);
    set<Linknode*>  addLinkNode;
    Linknode *pCur=head;
    while(pCur!=NULL)
    {
        if(addLinkNode.find(pCur)==addLinkNode.end())
        {
            addLinkNode.insert(pCur);
            pCur=pCur->next;
        }
        else
        {
            cout<<"該鏈表是一個環!"<<endl;
            return pCur;
        }
    }
    cout<<"該鏈表不是一個環!"<<endl;
    return NULL;
}


測試代碼

Linknode *headNode;
    int n;
    cout<<"請輸入創建的鏈表的長度"<<endl;
    cin>>n;
    headNode=createLink(n);
    //findFirstCycleNode(headNode);
    findFirstCycleNode2(headNode);


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved