单链接列表添加 - 无限循环

时间:2014-05-22 13:27:53

标签: c linked-list singly-linked-list

我正在编写一个简单的链接列表添加代码。 如果我再次添加相同的节点...我正在获得无限循环问题。

代码如下:

#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()有问题吗?

谢谢奥拉夫,奥加和伊曼...... 修改后的工作代码:

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();

3 个答案:

答案 0 :(得分:3)

AddNode将新节点附加到列表的末尾。在您追加pNode1之前,您已经拥有

pNode1 -> pNode2 -> pNode3 -> NULL

现在您将pNode1添加到列表的末尾并获取

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

当您遍历printNode

中的列表时,这会导致无限循环

答案 1 :(得分:2)

您无法将完全相同的节点放入列表中的两个位置。如果您想要节点数据的另一个副本,请复制(确保pNextNodeNULL)并添加。

答案 2 :(得分:1)

你进入无限循环的原因是因为你的链接列表是无限的! enter image description here

当您进入打印功能时,它会进入链接列表 1个打印节点1 2 - 然后看下一个节点是节点2 3打印节点2 4 - 然后看下一个节点是节点3 5-打印节点3 6-然后看下一个节点是节点1 转到1等等......