我正在编写一个简单的链接列表添加代码。 如果我再次添加相同的节点...我会遇到无限循环问题。
代码如下:
#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/