【问题标题】:Inserting node at beginning of singly linked list在单链表的开头插入节点
【发布时间】:2018-04-05 09:46:05
【问题描述】:

我的add_to_list 函数有问题。

我正在使用这个函数向列表指针引用的单链表的乞求添加一个节点。

问题是:添加了第一个节点,如果再添​​加,就会丢失列表的踪迹。

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

struct node {
    int value;
    struct node* next;
};

struct node *add_to_list(struct node *list , int n){
     struct node *new_node ;
     new_node = malloc( sizeof(struct node) ); //create new node
     if(new_node == NULL){
         printf("Error ,malloc failed to allocate memory\n");
         exit(EXIT_FAILURE);
     }
     new_node->value = n; //initiate value field
     new_node->next = list;
     return new_node;
}

int main(){
    struct node * first = NULL;
    struct node * temp = first;
    first = add_to_list(first,10);
    if(first != NULL)
        printf("node added\n");
    else
        printf("add failed\n");
    first = add_to_list(first,20);
    if(first == NULL)
        printf("node added\n");
    else
        printf("add failed\n");
    first = add_to_list(first,30);
    if(first == NULL)
        printf("node added\n");
    else
        printf("add failed\n");

    while(temp!=NULL){
        printf("%d-->",(temp->value));
        temp = temp ->next;
    }

    return 0;
}

【问题讨论】:

  • 您对first 是否为空的测试被反转(第一个除外)。
  • main() 的开头,有struct node * temp = first; 语句将NULL 分配给temp。由于在while 循环中,您正在打印列表,因此在while 循环之前您应该将first 分配给temp

标签: c linked-list singly-linked-list


【解决方案1】:

所以在main 的开头你有这两行...

struct node * first = NULL;
struct node * temp = first;

...将NULL 分配给first,然后将first 的值分配给temp,这意味着它们都是NULL。这是一次性分配 - temp 不会随着 first 的变化而更新。

当你到达函数的底部时,你有这个循环,但是自从第一次分配 NULL 以来,没有任何东西更新 temp 的值。

while(temp!=NULL){
    printf("%d-->",(temp->value));
    temp = temp ->next;
}

解决方案是在循环之前将first 的当前值分配给temp,如下所示:

temp = first;
while(temp!=NULL){
    printf("%d-->",(temp->value));
    temp = temp ->next;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多