C编程Listnode插入节点导致死循环
C Programming Listnode insert node resulting in infinite loop
我在将节点插入 ListNode
时尝试进行双重引用时遇到了一些问题。这是代码:
#include "stdafx.h"
#include <stdlib.h>
typedef struct _listnode {
int num;
struct _listnode *next;
}ListNode;
void insertNode(ListNode **ptrHead, int index, int value);
ListNode *findNode(ListNode *head, int index);
int main()
{
int index, value, i;
ListNode **ptrHead, *head = NULL;
ptrHead = &head;
for (i = 0; i < 5; i++){
printf("Enter value: ");
scanf("%d", &value);
printf("Enter index: ");
scanf("%d", &index);
insertNode(ptrHead, index, value);
}
ptrHead = head;
while (ptrHead != NULL) {
printf("%d", head->num);
ptrHead = head->next;
}
return 0;
}
void insertNode(ListNode **ptrHead, int index, int value) {
ListNode *cur, *newNode;
if (*ptrHead == NULL || index == 0) {
newNode = malloc(sizeof(ListNode));
newNode->num = value;
newNode->next = *ptrHead;
*ptrHead = newNode;
}
else if ((cur = findNode(*ptrHead, index - 1)) != NULL) {
newNode = malloc(sizeof(ListNode));
newNode->num = value;
newNode->next = cur->next;
cur->next = newNode;
}
else printf("Cannot insert the new item at index %d!\n", index);
}
ListNode *findNode(ListNode *head, int index) {
ListNode *cur = head;
if (head == NULL || index < 0)
return NULL;
while (index > 0) {
cur = cur->next;
if (cur == NULL) return NULL;
index--;
}
return cur;
}
所以基本上我从用户那里获取了 5 个值和索引输入。然后,我将它们插入 ListNode
。在 insertNode()
中,有一个名为 findNode
的函数试图找到 cur,以便我可以将我的 cur
指向下一个 newNode
。
但是,使用这些代码,当我尝试打印出 ListNode
时,它会无限地打印出第一个输入值。所以我在想哪一部分是我的错误?
提前致谢。
在您的 main
函数中,以下代码行:
ptrHead = head;
while (ptrHead != NULL) {
printf("%d", head->num);
ptrHead = head->next;
}
应为:
ListNode *cur = head;
while (cur != NULL) {
printf("%d", cur->num);
cur = cur->next;
}
已编辑:
But can I know why it does not work when I assign head to ptrHead. Is it because I am double deferencing the ptrHead?
它们属于不同的类型。 ptrHead
是 ListNode**
而 head
是 ListNode*
。因此,赋值 ptrHead = head;
不会做你真正想要的。现代编译器也应该在这一行发出一些警告。
我在将节点插入 ListNode
时尝试进行双重引用时遇到了一些问题。这是代码:
#include "stdafx.h"
#include <stdlib.h>
typedef struct _listnode {
int num;
struct _listnode *next;
}ListNode;
void insertNode(ListNode **ptrHead, int index, int value);
ListNode *findNode(ListNode *head, int index);
int main()
{
int index, value, i;
ListNode **ptrHead, *head = NULL;
ptrHead = &head;
for (i = 0; i < 5; i++){
printf("Enter value: ");
scanf("%d", &value);
printf("Enter index: ");
scanf("%d", &index);
insertNode(ptrHead, index, value);
}
ptrHead = head;
while (ptrHead != NULL) {
printf("%d", head->num);
ptrHead = head->next;
}
return 0;
}
void insertNode(ListNode **ptrHead, int index, int value) {
ListNode *cur, *newNode;
if (*ptrHead == NULL || index == 0) {
newNode = malloc(sizeof(ListNode));
newNode->num = value;
newNode->next = *ptrHead;
*ptrHead = newNode;
}
else if ((cur = findNode(*ptrHead, index - 1)) != NULL) {
newNode = malloc(sizeof(ListNode));
newNode->num = value;
newNode->next = cur->next;
cur->next = newNode;
}
else printf("Cannot insert the new item at index %d!\n", index);
}
ListNode *findNode(ListNode *head, int index) {
ListNode *cur = head;
if (head == NULL || index < 0)
return NULL;
while (index > 0) {
cur = cur->next;
if (cur == NULL) return NULL;
index--;
}
return cur;
}
所以基本上我从用户那里获取了 5 个值和索引输入。然后,我将它们插入 ListNode
。在 insertNode()
中,有一个名为 findNode
的函数试图找到 cur,以便我可以将我的 cur
指向下一个 newNode
。
但是,使用这些代码,当我尝试打印出 ListNode
时,它会无限地打印出第一个输入值。所以我在想哪一部分是我的错误?
提前致谢。
在您的 main
函数中,以下代码行:
ptrHead = head;
while (ptrHead != NULL) {
printf("%d", head->num);
ptrHead = head->next;
}
应为:
ListNode *cur = head;
while (cur != NULL) {
printf("%d", cur->num);
cur = cur->next;
}
已编辑:
But can I know why it does not work when I assign head to ptrHead. Is it because I am double deferencing the ptrHead?
它们属于不同的类型。 ptrHead
是 ListNode**
而 head
是 ListNode*
。因此,赋值 ptrHead = head;
不会做你真正想要的。现代编译器也应该在这一行发出一些警告。