Не в состоянии pu sh head в связанном списке - PullRequest
1 голос
/ 08 марта 2020

Я пытался создать программу для добавления элементов в связанный список. Элементы состоят из имени и возраста. Но он не может добавить, не давая мне никакой ошибки. Не могли бы вы показать мне мою ошибку?

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define MAX 9999

struct data {
    char name[MAX];
    int age;
    struct data *next;
};

void pushHead(struct data **head, struct data **tail, char name[], int age) {
    struct data *node = (struct data *)malloc(sizeof(struct data));

    strcpy(node->name, name);
    node->age = age;

    if (*head == NULL) {
        node = *head;
        node = *tail;
        node->next = NULL;
    } else {
        node->next = *head;
        *head = node;
    }
}

void view(struct data *head) {
    struct data *curr = head;
    if (curr == NULL)
        printf("No Data\n");
    else {
        while (curr != NULL) {
            printf("%s(%d)\n", curr->name, curr->age);
            curr = curr->next;
        }
    }
}

int main(int argc, char const *argv[]) {
    struct data *head = NULL;
    struct data *tail = NULL;

    pushHead(&head, &tail, "Felix", 19);
    view(head);
    return 0;
}

Вывод: No Output

Мой код работает, когда я помещаю голову в глобальную область видимости (изменяя все функции для работы глобально) , но когда я пытаюсь поместить голову в основную область, это не работает.

1 Ответ

3 голосов
/ 08 марта 2020

В pushHead() вы выполняете:

    node = *head;
    node = *tail;

и в итоге назначаете указатель NULL на node, поскольку *head и *tail оба равны NULL. Обратите внимание, что это утечка памяти, так как ваша программа теряет ссылку на память, которую держит указатель node. Вместо этого вы должны сделать

    *head = node;
    *tail = node;

Некоторые предложения:

  • Для хранения name в узле списка вы берете буфер размером 9999 (MAX macro) ) который (ИМО) очень большой. Я считаю, что для этого более чем достаточно буфера размером 256. Или вы можете также иметь буфер точного размера, необходимый для хранения name, динамически выделяя ему память. Для этого вам нужно взять char * член вместо char массива для name и выделить ему динамически память на основе размера name параметра pushHead(), и в этом случае вам необходимо убедиться, что освободить его явно при удалении узлов списка.
  • При использовании strcpy() для копирования строки убедитесь, что целевой буфер достаточно большой, чтобы содержать исходную строку, чтобы избежать переполнения.
  • Follow good практика программирования. Всегда проверяйте malloc return и гарантируйте free выделенную память, как только вы закончите с ней.
  • Не применяйте mallo c return.
  • Чтобы включить стандартные заголовочные файлы библиотеки, используйте <>, то есть #include "stdio.h" -> #include <stdio.h>, отметьте this .
...