在单向链表的开头添加一个节点 (C)

Adding a node at the beginning of a Singly Linked List (C)

代码没有错误,但我似乎不知道为什么新节点没有插入到列表的开头。它可能与第一个函数 (insertNode) 中的 else 语句有关,但我不确定,这是怎么回事?

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

struct node {
    int data;
    struct node *link;
};

void insertNode(struct node *head, int x) {
    //Create node to be added and add the input integer to it
    struct node *temp;
    temp = (struct node *)malloc(sizeof(struct node));
    temp->data = x;

    //Check if there are any existing nodes in the list, if not, the let the head be equal to the new temp pointer
    if (head == NULL) {
        head = temp;
    } else {
        //If not, then we need to add the node to the beginning
        temp->link = head;
        head = temp;        
        printf("Node was added successfully!\n");
    }
}

int findsize(struct node *head) {
    //Finds the size of the list

    struct node *temp = head;
    int count = 0;
    while (temp != NULL) {
        count++;
        temp = temp->link;
    }
    return count;
}

void printData(struct node *head) {
    //Prints the elements of the list
    struct node *temp = head;
    while (temp != NULL) {
        printf("Element: %d\n", temp->data);
        temp = temp->link;
    }
}

void main() {
    //Created a node and allocated memory
    struct node *head;
    head = (struct node *)malloc(sizeof(struct node));
    //Added data to the node and created another one linked to it
    head->data = 15;
    head->link = (struct node *)malloc(sizeof(struct node));
    head->link->data = 30;
    head->link->link = NULL;
    //Used the above function to add a new node at the beginning of the list
    insertNode(head, 5);
    //Print the size of the list    
    printf("The size of the list you gave is: %d\n", findsize(head));
    //Print the elements of the list
    printData(head);
}

当您在列表的开头插入一个节点时,您实际上改变了列表的开头,因此这个新的初始节点必须 returned 给调用者。 insertNode() 的原型必须更改为 return 列表头或获取指向列表头的指针。

这是第一种方法的修改版本:

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

struct node {
    int data;
    struct node *link;
};

struct node *insertNode(struct node *head, int x) {
    //Create node to be added and add the input integer to it
    struct node *temp;
    temp = (struct node *)malloc(sizeof(struct node));
    if (temp != NULL) {
        temp->data = x;
        temp->link = head;
    }
    return temp;
}

int findsize(struct node *head) {
    //Find the size of the list
    struct node *temp = head;
    int count = 0;
    while (temp != NULL) {
        count++;
        temp = temp->link;
    }
    return count;
}

void printData(struct node *head) {
    //Prints the elements of the list
    struct node *temp = head;
    while (temp != NULL) {
        printf("Element: %d\n", temp->data);
        temp = temp->link;
    }
}

void main() {
    //Created a node and allocated memory
    struct node *head = NULL;
    //Insert 3 nodes with values 30, 15 and 5
    head = insertNode(head, 30);
    head = insertNode(head, 15);
    head = insertNode(head, 5);
    //Print the size of the list    
    printf("The size of the list you gave is: %d\n", findsize(head));
    //Print the elements of the list
    printData(head);
    //Should free the nodes
    return 0;
}