Malloc связанный список в c - PullRequest
0 голосов
/ 27 июня 2019

Я новичок в C. Мне нужно создать связанный список в c с помощью malloc, я должен создать свое решение в struct list * solution ().Учитывая список чисел, мне нужно, чтобы они отображались, пока не будет задано значение int -1.После создания связанного списка верните указатель на корневой узел связанного списка. До сих пор я могу получить только одно число, которое появится после выполнения программы.

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

typedef struct list{
    int value;
    struct list *next;
} List ;

struct list* solution()
{
    int n = 0, a;
    List *listpointer;
    List *listpointer2;
    listpointer = ( List* ) malloc( 200 * sizeof(List*));
    listpointer2 = ( List* ) malloc( 200 * sizeof(List*));
    //for(n = 0; n < 7; n++)
    do   
    {
        scanf("%d", &a);
        if(a < 0)
        {
            listpointer[n].next = NULL;   
            break;
        }
        listpointer[n].value = a;
        listpointer[n].next = listpointer2[n].next;

        n++;
        //scanf("%d", &a);
        //listpointer2[n].value = a;
        //listpointer2[n].next = listpointer2[n].value;
    }while( a > 0);

    return listpointer;
}

int main()
{
    struct list *l=NULL,*temp;
    l = solution();
    if(l==NULL)
        printf("list is empty");
    else
    {
        do{
            printf("%d ",l->value);
            temp = l;
            l = l->next;
        }while(temp->next!=NULL);
    }
}

Я ожидаю, что выходной сигнал будет 2 6 4 7 8 2 9, но пока Am способен производить выходной сигнал только в 2 или 9 раз.

1 Ответ

3 голосов
/ 27 июня 2019

Вы не должны выделять массив. При создании связанного списка вы выделяете один узел списка каждый раз через цикл.

Вам нужны две переменные - head - указатель на первый узел в списке, listpointer - указатель на последний элемент, к которому мы хотим добавить следующий узел.

struct list* solution()
{
    int n = 0, a;
    List *listpointer = NULL;
    List *head = NULL;
    while(1)
    {
        scanf("%d", &a);
        if(a < 0)
        {
            break;
        }
        List *newNode = malloc(sizeof(List));
        newNode->value = a;
        newNode->next = NULL;
        if (listpointer) {
            listpointer->next = newNode;
            listpointer = newNode;
        } else {
            listpointer = newNode;
            head = newNode;
        }
    }

    return head;
}
...