2014-05-22 26 views
0

我正在寫一個簡單的鏈接列表附加代碼。 如果我再次添加相同的節點...我得到無限循環問題。Single Link List Addition - 無限循環

的代碼如下:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct _linklist 
{ 
    int    iNodeId; 
    struct _linklist *pNextNode; 
}LINKLIST; 

void printNode(LINKLIST **pNode) 
{ 
    LINKLIST *pCurNode = *pNode; 
    while(NULL != pCurNode) 
    { 
     printf("pCurNode->iNodeId %d\n", pCurNode->iNodeId); 
     pCurNode = pCurNode->pNextNode; 
    } 
    printf("\n"); 
} 

void AddNode(LINKLIST **pNode, LINKLIST *pNewNode) 
{ 
    LINKLIST *pHead = *pNode; 
    if (NULL == pHead) 
    { 
     *pNode = pNewNode; 
    } 
    else 
    { 
     while(NULL != pHead->pNextNode) 
     { 
      pHead = pHead->pNextNode; 
     } 
     pHead->pNextNode = pNewNode; 
    } 
} 

void main() 
{ 
    int iNodeCnt = 0; 
    LINKLIST *pNode1; 
    LINKLIST *pNode2; 
    LINKLIST *pNode3; 

    LINKLIST **pNode = (LINKLIST **)malloc(sizeof(LINKLIST *)); // Double pointer to hold the link list. 
    *pNode = NULL; 

    pNode1 = (LINKLIST *)malloc(sizeof(LINKLIST)); 
    pNode1->iNodeId = ++iNodeCnt; 
    pNode1->pNextNode = NULL; 

    pNode2 = (LINKLIST *)malloc(sizeof(LINKLIST)); 
    pNode2->iNodeId = ++iNodeCnt; 
    pNode2->pNextNode = NULL; 

    pNode3 = (LINKLIST *)malloc(sizeof(LINKLIST)); 
    pNode3->iNodeId = ++iNodeCnt; 
    pNode3->pNextNode = NULL; 

    AddNode(pNode, pNode1); 
    AddNode(pNode, pNode2); 
    AddNode(pNode, pNode3); 

    printNode(pNode); 

    AddNode(pNode, pNode1); 

    printNode(pNode); // goes into infinite loop. ???? 

    getchar(); 
} 

希望的代碼是可以理解的。

這裏,第二個printNode()進入無限循環。

AddNode()有什麼問題嗎?

謝謝奧拉夫,OOGA和伊曼...修改後 工作代碼:

LINKLIST *pNode4; 

AddNode(pNode, pNode1); 
AddNode(pNode, pNode2); 
AddNode(pNode, pNode3); 
printNode(pNode); 

// Copy the Node1 to Node4 and then call AddNode() 
pNode4 = (LINKLIST *)malloc(sizeof(LINKLIST)); 
pNode4->iNodeId = pNode1->iNodeId; 
pNode4->pNextNode = NULL; // Set the pNextNode to NULL 

AddNode(pNode, pNode4); 

printNode(pNode); 

getchar(); 
+0

你可以在你的問題中包含一些'printf'輸出嗎? –

回答

2

您不能將完全相同的節點放入列表中的兩個位置。如果您需要節點數據的另一個副本,請複製一份(確保pNextNodeNULL)並添加該副本。

3

AddNode附加在列表末尾的新節點。你追加pNode1之前,你已經有

pNode1 -> pNode2 -> pNode3 -> NULL 

現在,添加pNode1到列表的末尾,並得到

pNode1 -> pNode2 -> pNode3 -> pNode1 -+ 
      A       | 
      +-------------------------+ 

這是造成死循環,當你遍歷printNode

列表
1

你去無限循環的原因是因爲你的鏈接列表是無限的! enter image description here

當你進入打印功能,它進入鏈接列表 1打印節點1 2,然後看看下一個節點是節點2 3打印節點2 4再看看下一個節點爲節點3 5-打印節點3 6-然後看看下一個節點是節點1 去1等等......