вставка связанного списка отсутствует - PullRequest
0 голосов
/ 07 мая 2020

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

спасибо за любую помощь / идею

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

typedef struct {

    int num;
    struct List* next;

}List;
// i think the problem is in here cant find it :(((
List* insert(List* head, int num)
{
    List* temp = (List*)malloc(sizeof(List));
    List* temp_head = head;
    temp->num = num;
    temp->next = NULL;
    if (head == NULL)
    {
        head = temp;
    }
    else
    {
        while (temp_head->next != NULL)
        {
            temp_head = temp_head->next;
        }
        temp_head->next = temp;
    }
    return head;
}
List* create_new_list(List* new_list)
{
    int number;
    printf("Enter numbers, to exit enter negative number\n");
    scanf_s("%d", &number);
    if (number <= 0)
    {
        return NULL;
    }
    new_list->num = number;
    new_list->next = NULL;
    scanf_s("%d", &number);
    while (number >= 0)
    {
        new_list=insert(new_list, number);
        scanf_s("%d", &number);
    }
    return new_list;
}

int main()
{
    List* head= (List*)malloc(sizeof(List));
    head=create_new_list(head);
}

1 Ответ

0 голосов
/ 07 мая 2020

Хорошо, у вас есть ряд проблем, и ваш компилятор должен сообщить вам точную строку, на которой они находятся. Для начала вам не хватает struct List в вашем определении List, например

typedef struct List {
    int num;
    struct List *next;
} List;

Затем вам нужно исправить каждое местоположение, которое вы используете, используя list вместо List в качестве типа, например

List *insert (List *head, int num)

и

List *create_new_list (List *new_list)

и

    List *head = malloc(sizeof *head);

После внесения изменений у вас будет ( примечание: У меня нет scanf_s, поэтому ниже используется scanf):

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

typedef struct List {
    int num;
    struct List *next;
} List;

List *insert (List *head, int num)
{
    List *temp = malloc (sizeof *temp);
    List *temp_head = head;

    temp->num = num;
    temp->next = NULL;

    if (head == NULL)
        head = temp;
    else {
        while (temp_head->next != NULL)
            temp_head = temp_head->next;
        temp_head->next = temp;
    }

    return head;
}

List *create_new_list (List *new_list)
{
    int number;
    printf("Enter numbers, to exit enter negative number\n");
    scanf ("%d", &number);
    if (number <= 0)
    {
        return NULL;
    }
    new_list->num = number;
    new_list->next = NULL;
    scanf ("%d", &number);
    while (number >= 0)
    {
        new_list=insert(new_list, number);
        scanf("%d", &number);
    }
    return new_list;
}

void prnList (List *head)
{
    for (; head; head = head->next)
        printf (" %d", head->num);

    putchar ('\n');
}

int main()
{
    List *head = malloc(sizeof *head);
    head=create_new_list(head);
    prnList (head);
}

( примечание: Я добавил функцию prnList())

Пример использования / Выход

$ ./bin/ll_scanf
Enter numbers, to exit enter negative number
1 2 3 4 5 -1
 1 2 3 4 5

Альтернатива - Избегайте выделения для head

Вы можете просто использовать head в main() с автоматическим c хранилищем продолжительность, а не распределение. Например, вы можете сделать:

int main()
{
    List head = { .num = 0 };
    create_new_list(&head);
    prnList (&head);
}

Это просто освобождает вас от необходимости позже free(head) и в противном случае и может быть передано любой функции, которая в нем нуждается, как если бы она была выделена. Примечание: вы не назначаете возврат из create_new_list(&head);, если вы выбираете этот маршрут, поскольку head выше является экземпляром структуры, а не указателем на List.

Посмотрите Дайте мне знать, если у вас возникнут вопросы.

Также обратите внимание: '*' идет с именем переменной, а не с типом (обычно). Зачем? Поскольку:

List* a, b, c;

НЕ объявляет три указателя на List, вместо этого объявляется один указатель на List (a) и два экземпляра struct List (b, c). Использование:

List *a, b, c;

проясняет это.

...