Lista jednokierunkowa - błędy w kodzie

Odpowiedz Nowy wątek
2012-06-08 22:20
0

Witam. Próbuję od niedawna zrozumieć listy jednokierunkowe. Program się kompiluje, ale działa tylko w przypadku, gdy elementy dodawane są tylko na początek. Nie mam pojęcia, w którym miejscu popełniam błąd.
Oto kod:

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

struct lista {
    int numer;
    char nazwa[10];
    struct lista *next;
};

void dodaj_na_poczatek(struct lista **, int, char *);
void dodaj_na_koniec(struct lista *wsk, int wart, char * txt);
void wyswietl(struct lista *);
void zwolnij (struct lista *);
int main(void)
{
    struct lista *head = NULL;
    int numer,wybor,wybor2;
    char tekst[10];

    printf("Jesli chcesz dodac kolejny element do listy wpisz 1\n");
    scanf("%d", &wybor);
    while (wybor == 1)
    {
        printf("Podaj numer\n");
        scanf("%d", &numer);
        printf("Podaj nazwe\n");
        scanf("%s", tekst);
        printf("Dodac na poczatek, czy na koniec? 1 - poczatek, 2 - koniec\n");
        scanf("%d", &wybor2);
        if (wybor2 == 1)
            dodaj_na_poczatek(&head,numer,tekst);
        else if(wybor2 == 2)
            dodaj_na_koniec(head,numer,tekst);
        else
        {
            ("Podales zla wartosc, koniec\n");
            exit(-1);
        }

        printf("Jesli chcesz dodac kolejny element do listy wpisz 1\n");
        scanf("%d", &wybor);
    }

    wyswietl(head);
    zwolnij(head);
    return 0;
}

void dodaj_na_poczatek(struct lista **wsk, int wart, char * txt)
{
    struct lista *nowy;
    nowy = (struct lista *) malloc (sizeof(struct lista));
    if (!nowy)
    {
        printf("Przydzial pamieci nie powiodl sie\n");
        exit(-1);
    }
    nowy->numer = wart;
    strcpy(nowy->nazwa,txt);
    nowy->next = NULL;

    if (!*wsk)
        *wsk = nowy;
    else
    {
        nowy->next = *wsk;
        *wsk = nowy;
    }
}

void dodaj_na_koniec(struct lista *wsk, int wart, char * txt)
{
    struct lista *nowy, *wsk1;
    nowy = (struct lista *) malloc (sizeof(struct lista));
    nowy->next = NULL;
    nowy->numer = wart;
    strcpy(nowy->nazwa,txt);

    if(!nowy)
    {
        printf("Przydzial pamieci nie powiodl sie \n");
        exit(-1);
    }

    if (!wsk)
        wsk = nowy;
    else
    {
        while(wsk1->next != NULL)
            wsk1 = wsk1->next;
         wsk1->next = nowy;
    }
}

void wyswietl(struct lista *wsk)
{
    struct lista *nowy;
    nowy = wsk;
    if (nowy == NULL)
        printf("Brak elementow do wyswietlenia\n");
    else
    {
        while (nowy != NULL)
        {
            printf("%3d %s \n", nowy->numer, nowy->nazwa);
            nowy = nowy->next;
        }
    }
}

void zwolnij (struct lista *wsk)
{
    struct lista *nowy;
    while(nowy != NULL)
    {
        nowy = wsk;
        free(nowy);
        wsk = wsk->next;
    }
}
edytowany 1x, ostatnio: .Newbie, 2012-06-08 22:21

Pozostało 580 znaków

2012-06-08 22:23
0

Z tego wierszu:

void dodaj_na_koniec(struct lista *wsk, int wart, char * txt);

już jednoznacznie wynika że nie będzie działać poprawnie.
Porównaj z dodawaniem na początku i spróbuj sam zrozumieć czemu.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2012-06-08 23:37
0

poza tym co napisał trzynasty smok to łatwiej się operuje na listach jeśli zrobisz 2 struktury (nazwy przykładowe): Node (takie same pola jak ma Twoja lista) oraz Lista (pola: Node pierwszy,ostatni; int ilosc). wtedy w zasadzie każdą operację implementuje się dużo prościej


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2012-06-08 23:37

Pozostało 580 znaków

2012-06-10 01:06
0

Dziękuję bardzo za pomocne wskazówki, proszę jeszcze o pomoc przy funkcji dodającej element do listy posortowanej. Błąd wyskakuje przy próbie wypisywania lub dodania wartości większej od jakiejkolwiek wcześniejszej. Funkcja wypisująca wygląda tak samo jak wyżej, więc problem leży gdzieś tutaj.

Kod:

 void dodaj_do_posortowanej(struct lista **wsk, int wart, char * txt)
{
    struct lista *nowy;
    nowy = (struct lista *) malloc (sizeof(struct lista));
    nowy->numer = wart;
    strcpy(nowy->nazwa,txt);

    if(!nowy)
    {
        printf("Przydzial pamieci nie powiodl sie \n");
        exit(-1);
    }

    if (!*wsk)
        *wsk = nowy;
    else
    {
        if((*wsk)->numer > wart)
        {
                nowy->next = (*wsk);
                *wsk = nowy;
        }
        else
        {
            struct lista *wsk1 = *wsk;
            while( wsk1->next != NULL && wsk1->next->numer < wart)
                wsk1 = wsk1->next;
            nowy->next = wsk1->next;
            wsk1->next = nowy;
        }
    }
} 

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