Как отследить и вернуть заголовок связанного списка в C при добавлении узла в конец - PullRequest
1 голос
/ 12 февраля 2020

В настоящее время у меня есть структура узла, которая выглядит следующим образом:

struct Node { 
    int data; 
    Node* next; 
}; 

, и я хочу реализовать функцию, которая создаст связанный список с заданным списком элементов и вернет заголовок списка , В настоящее время у меня есть следующая структура:

struct Node *make_list(int values[10]) {
    struct Node *curr;
    head = (struct Node*) malloc(sizeof(struct Node));
    struct Node *head;

    head->value = values[0];
    head->next = NULL;
    curr = head;


    for (int i = 1; i < 10 i++) {
        struct Node *tmp;
        tmp->value=values[i];
        curr->next=tmp;
    }
    return head;
}

По какой-то причине этот код всегда возвращает NULL в качестве заголовка связанного списка, но после этого нулевого элемента 10 элементов расположены по порядку. Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Альтернатива ответу Влада (который, я думаю, будет проще понять):

struct Node *make_list(int values[10]) {

  struct Node* head = (struct Node*) malloc(sizeof(struct Node));
  head->value = values[0];
  head->next = NULL;

  struct Node *curr;
  curr = head;

  for (int i = 1; i < 10; i++) {
      struct Node* tmp = (struct Node*) malloc(sizeof(struct Node));
      tmp->value=values[i];
      tmp->next = NULL;
      curr->next=tmp;
      curr = tmp;
  }
  return head;
}

Вы должны всегда выделять новую память для нового узла

struct Node* tmp = (struct Node*) malloc(sizeof(struct Node));

в противном случае он будет потерян после завершения функции.

Затем вы должны убедиться, что новый узел получает правильные значения:

tmp->value=values[i];
tmp->next = NULL;

Наконец, вам нужно обновить свой * Узел 1014 *, поэтому он указывает на последний элемент в списке (обычно мы называем это tail).

next=tmp;
curr = tmp;

Вы можете попробовать его здесь .

0 голосов
/ 12 февраля 2020

Для начала это объявление узла

struct Node { 
    int data; 
    Node* next; 
}; 

недопустимо в C. Вы должны объявить структуру как

struct Node { 
    int data; 
    struct Node* next; 
}; 

Ваше определение функции не будет компилироваться и не имеет большого смысла.

Это может быть определено, например, следующим образом

struct Node * make_list( const int values[], size_t n ) 
{
    struct Node *head = NULL;
    struct Node **current = &head;

    for ( size_t i = 0; i < n; i++ )
    {
        *current = malloc( sizeof( struct Node ) );

        ( *current )->data = values[i];
        ( *current )->next = NULL;

        current = &( *current )->next;
    }

    return head;
}

Вот демонстрационная программа.

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

struct Node 
{ 
    int data; 
    struct Node* next; 
}; 

struct Node * make_list( const int values[], size_t n ) 
{
    struct Node *head = NULL;
    struct Node **current = &head;

    for ( size_t i = 0; i < n; i++ )
    {
        *current = malloc( sizeof( struct Node ) );

        ( *current )->data = values[i];
        ( *current )->next = NULL;

        current = &( *current )->next;
    }

    return head;
}

void out( struct Node *head )
{
    for ( ; head != NULL; head = head->next )
    {
        printf( "%d -> ", head->data );
    }

    puts( "null" );
}

int main(void) 
{

    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    const size_t N = sizeof( a ) / sizeof( *a );

    struct Node *head = make_list( a, N );

    out( head );

    return 0;
}

Ее вывод

0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null
...