Wypisywanie elementów listy jednokierunkowej

Odpowiedz Nowy wątek
2019-02-10 14:41
0

Co jest nie tak w tym kodzie? Wyświetlany jest tylko pierwszy element. Wydaje mi się, że w momencie uzupełniania elementu innego niż pierwszy (gdy pierwszy jest już zajęty) trzeba zastosować coś w stylu przypisania: "pierwszy = ostatni", żeby lista się nie rozleciała. Tylko do końca nie wiem, w którym miejscu to dodać + może jeszcze jakieś modyfikacje potrzebne?

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

struct element {
    int dane;
    struct element *nast;
};

typedef struct element ELEMENT;
typedef ELEMENT *ADRES;

void Wypisz (ADRES pierwszy)
{
    ADRES pom = (ADRES)malloc(sizeof(ELEMENT));
    pom = pierwszy;
    while(pom != NULL)
    {
        printf("%d", pom->dane);
        pom = pom->nast;
    }
}

int main()
{
    ADRES pierwszy = NULL, ostatni = NULL, pom;
    int liczba;
    FILE *f = fopen("Plik.txt", "rt");
        if(f == NULL)
            {
                printf("Error\n");
                return 1;
            }
                while(fscanf(f, "%d", &liczba) == 1)
                {
                    pom = (ADRES)malloc(sizeof(ELEMENT));
                    pom->dane = liczba;
                    pom->nast = NULL;
                        if(pierwszy == NULL)
                        {
                            pierwszy = pom;
                            ostatni = pom;
                        }
                        else
                        {
                            pierwszy = ostatni;
                            ostatni->nast = pom;
                            ostatni = pom;
                        }
                }
    fclose(f);
    Wypisz(pom);
    return 0;
}
edytowany 2x, ostatnio: ankubra, 2019-02-10 14:46

Pozostało 580 znaków

2019-02-10 14:47
0

Trochę inaczej:

void printList(ADRES root) {
    ADRES *tmp = root;
    while (tmp) {
        //Do sth with *tmp
        tmp = tmp->nast;
    }
}

a jaka jest tutaj różnica oprócz angielskiego słownictwa, muszę coś innego dodać w "while"? czy błędu nie ma przypadkiem w mainie? + sorry, uczę się, wolę mieć wszystko łopatologicznie wytłumaczone :) - ankubra 2019-02-10 14:52
Taka, że ten kod działa :-D:-D - lion137 2019-02-10 15:02
dzięki! zastrzel mnie, nie widzę: http://pokazywarka.pl/4programmers/ - ankubra 2019-02-10 15:08
W takim razie, Dajesz tej funkcji listę jednoelementową. - lion137 2019-02-10 15:13
aaaa, rzeczywiście, mea culpa - ankubra 2019-02-10 15:15
@lion137: Czy na pewno jest potrzeba tworzyć tmp w funkcji wyświetlającej, zamiast operować bezpośrednio na root? Nie ma tam referencji. - Hodor 2019-02-10 16:59

Pozostało 580 znaków

2019-02-10 17:34
0

@Hodor: Nie Musisz, można i tak:

void printList(struct node * root) {
    for (; root; root = root->next)
        std::cout << root->data << " ";
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0