为什么我不能在此链接列表的索引0(头部)插入新节点?

时间:2013-04-22 00:17:05

标签: c singly-linked-list

守则:

/*
 * File: problem5.c
 * Author: levihackwith
 * Description: Write a Pop() function that is the inverse of Push(). Pop() takes a non-empty list, deletes the head node, and returns the head node's data.
 */

#include <stdio.h>
#include <stdlib.h>

struct node { // Our custom node data type
    int data;
    struct node *next;
};

/*
 * Adds a node to a linked list.
 *
 * This method was taken from the Appendix of the LinkedListProblems.pdf file from Stanford University.
 */
void Push(struct node** headRef, int newData) {
    struct node* newNode = malloc(sizeof (struct node)); // allocate node
    newNode->data = newData;
    newNode->next = (*headRef);
    (*headRef) = newNode;
};

void InsertNth(struct node** headRef, int insertAt, int newData) {
    struct node* newNode = malloc(sizeof (struct node)); // allocate node
    struct node* current = *headRef;
    int index = 0;

    newNode->data = newData;

    while (current != NULL) {
        if (insertAt == 0 && index == 0) {
            newNode->next = (*headRef);
            (*headRef) = newNode;
            current = *headRef;
            printf("Current's data is now %d at index %d \n\n", current->data, index);
        } else {
            if (index == (insertAt - 1)) {
                printf("I inserted %d at index %d \n", newData, insertAt);
                newNode->next = current->next;
                current->next = newNode;
            }
        }
        current = current->next;
        index++;
    }
}

/*
 * Builds a linked list of a given size.
 */
struct node* BuildList(int numNodes) {
    struct node* head = NULL; // Start with the empty list
    int i;

    for (i = numNodes; i >= 1; i--) {
        Push(&head, i); // Use Push() to add all the data
    }
    return (head);
};

int main(void) {

    struct node* myLinkedList;
    struct node* current;
    int currentIndex = 0;
    int valToInsert = 45;
    int insertIndex = 0;

    myLinkedList = BuildList(5);
    current = myLinkedList;

    InsertNth(&myLinkedList, insertIndex, valToInsert);
    while (current != NULL) {
        printf("The value at index %d is %d \n", currentIndex, current->data);
        currentIndex++;
        current = current->next;
    }

    return 0;
};

输出

Current's data is now 45 at index 0

The value at index 0 is 1
The value at index 1 is 2
The value at index 2 is 3
The value at index 3 is 4
The value at index 4 is 5

以上输出用于当插入新值的索引为零时。这是在索引1处插入时的输出。

I inserted 45 at index 1

The value at index 0 is 1
The value at index 1 is 45
The value at index 2 is 2
The value at index 3 is 3
The value at index 4 is 4
The value at index 5 is 5

正如您所看到的,0在1时没有按预期工作。我做错了什么?

2 个答案:

答案 0 :(得分:2)

  

我做错了什么?

您在调用current之前设置了InsertNth。当您致电InsertNth以在0处插入时,myLinkedList会发生变化,因此current将指向第二个节点。

current = myLinkedList;来电之后移动InsertNth以解决问题:

myLinkedList = BuildList(5);
InsertNth(&myLinkedList, insertIndex, valToInsert);
current = myLinkedList;

答案 1 :(得分:1)

切换这两行:

current = myLinkedList;
InsertNth(&myLinkedList, insertIndex, valToInsert);

按此顺序,您将current设置为列表第一部分的头部,然后向头部添加更多内容。这会改变头部,但current仍有其原始值。