我正在编写一个简单的链接列表添加代码。 如果我再次添加相同的节点...我正在获得无限循环问题。
代码如下:
#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();
答案 0 :(得分:3)
AddNode
将新节点附加到列表的末尾。在您追加pNode1
之前,您已经拥有
pNode1 -> pNode2 -> pNode3 -> NULL
现在您将pNode1
添加到列表的末尾并获取
pNode1 -> pNode2 -> pNode3 -> pNode1 -+
A |
+-------------------------+
当您遍历printNode
答案 1 :(得分:2)
您无法将完全相同的节点放入列表中的两个位置。如果您想要节点数据的另一个副本,请复制(确保pNextNode
为NULL
)并添加。
答案 2 :(得分:1)
你进入无限循环的原因是因为你的链接列表是无限的!
当您进入打印功能时,它会进入链接列表 1个打印节点1 2 - 然后看下一个节点是节点2 3打印节点2 4 - 然后看下一个节点是节点3 5-打印节点3 6-然后看下一个节点是节点1 转到1等等......