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

标签 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()有什么问题吗?

感谢 Olaf、ooga 和 Iman... 修改后的工作代码:

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

最佳答案

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

pNode1 -> pNode2 -> pNode3 -> NULL

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

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

当你在 printNode 中遍历列表时,这会导致无限循环

关于c - 单链接列表添加 - 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23808278/

相关文章:

java - 不使用 previous 的 ListIterator 解决方案

c++ - C++中不同对象的多个链表

c - 将指针分配给指针后,为什么左值变为零

c - C 中的指针数组

java - 无法将 String 转换为双向链表节点

c - 函数只能运行一次 - C

c - 在链表中排序插入程序

c++ - 使用重载赋值运算符克隆单向链表

c - ARM 皮质 M4 : test from unpriviledged mode if inside interrupt

c - C 中的文件描述符