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?

它们属于不同的类型。 ptrHeadListNode**headListNode*。因此,赋值 ptrHead = head; 不会做你真正想要的。现代编译器也应该在这一行发出一些警告。