Вставка и отображение связанного списка - PullRequest
0 голосов
/ 17 октября 2019

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

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

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

typedef struct nodes *node;

void InsertFront(node head)
{
    int num;
    node temp = malloc(sizeof(node));
    printf("Enter The Value Of Node\n");
    scanf("%d", &num);
    temp->data = num;
    if (head == NULL)
    {
        temp->next = NULL;
        head = temp;
    }
    else
    {
        temp->next = head;
        head = temp;
    }
}

void Display(node head)
{
    node q;
    if (head == NULL)
    {
        printf("Linked List Seems To Be Empty");
    }
    else
    {
        q = head;
        while (q != NULL)
        {
            printf("%d -> ", q->data);
            q = q->next;
        }
    }
}

void main()
{
    node head;
    head = NULL;
    InsertFront(head);
    Display(head);
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Вот рабочий код с исправленными ошибками.

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

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

typedef struct nodes *node;

void InsertFront(node *head)
{
    int num;
    node temp = (node)malloc(sizeof(node));
    printf("Enter The Value Of Node\n");
    scanf("%d", &num);
    temp->data = num;
    if (*head == NULL)
    {
        temp->next = NULL;
        *head = temp;
    }
    else
    {
        temp->next = *head;
        *head = temp;
    }
}

void Display(node head)
{
    node q;
    if (head == NULL)
    {
        printf("Linked List Seems To Be Empty");
    }
    else
    {
        q = head;
        while (q != NULL)
        {
            printf("%d -> ", q->data);
            q = q->next;
        }
    }
}

int main()
{
    node head;
    head = NULL;
    InsertFront(&head);
    Display(head);
}

Вам нужно передать head из main () в качестве его адреса (используя указатель на указатель). В предыдущем случае голова не обновлялась и по этой причине показала, что список пуст. Теперь введенный узел правильно печатается в этом коде.

0 голосов
/ 18 октября 2019

Во-первых, неправильно указывать указатели. Посмотрите на эту ветку для лучшего обсуждения.

Чтобы изменить заголовок вашего связанного списка, вы должны передать его по ссылке, а затем изменить его внутри функции. Для лучшей визуализации я проигнорировал typedef.

// Notice that now you need to pass a pointer to a pointer, not just a pointer
void InsertFront(struct nodes **head)
{
    int num;
    struct nodes *temp = malloc(sizeof(node));
    printf("Enter The Value Of Node\n");
    scanf("%d", &num);
    temp->data = num;

    if (*head == NULL)
    {
        temp->next = NULL;
        // by doing *head = temp we change the variable head declared in main
        *head = temp;
    }
    else
    {
        temp->next = *head;
        // Same thing here, we are updating the head by doing *head = ...
        *head = temp;
    }
}

И когда вы хотите вызвать функцию InsertFront:

struct nodes *head = NULL;
InsertFront(&head); // notice the &
...