Dodawanie elementów listy dwukierunkowej

0

Witam. Jest to pewnie dosyć proste zagadnienie. Próbuję pisać kod w C na małą bazę danych. Program wywala się jednak po pobraniu dwóch elementów listy (w sensie dwóch elementów po dwie zmienne).

Może miałby ktoś pomysł, co należy poprawić w tym kodzie? (Program we wcześniejszej wersji, bez menu, z kilkukrotnym wywołaniem dodawania elementu w funkcji main() - wpisane było "na sztywno" kilka linijek typu dodajostatni(&pierwszy,liczba) - poprawnie dodawał do listy elementy)

Byłbym wdzięczny za pomoc z tym problemem (próbuję to poprawić już od pewnego czasu)

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

typedef struct el_listy
{
    //char nadawca[30];
    float waga;
    int status;
    struct el_listy *poprz;
    struct el_listy *nast;
} el;
typedef el* LISTA;

void wypisz(LISTA pierwszy)
{
    LISTA pom=pierwszy;

    if (pierwszy==NULL) printf("Lista jest pusta\n");
    else
    {
        while(pom!=NULL)
        {
            printf ("%f %d \n", pom->waga, pom->status);
            pom=pom->nast;
        }
    }
    fflush(stdin);
}

void dodajostatni(LISTA *pierwszy)
{
    LISTA pom=*pierwszy, nowy;
    nowy=malloc(sizeof(LISTA));

    //printf("Podaj nadawce:\n");
    //fflush(stdin);
    //fgets(nowy->nadawca, 29, stdin);
    //printf("%s\n", nowy->nadawca);

    printf("Podaj wage:\n");
    fflush(stdin);
    scanf("%f", &nowy->waga);

    printf("Podaj status:\n");
    fflush(stdin);
    scanf("%d", &nowy->status);

    if (pom==NULL)
    {
        printf("Lista jest pusta\n");
        (*pierwszy)=nowy;
        (*pierwszy)->poprz=NULL;
        (*pierwszy)->nast=NULL;
    }
    else if (pom!=NULL)
    {
        while (pom->nast!=NULL) pom=pom->nast;
        pom->nast=nowy;
        nowy->poprz=pom;
        nowy->nast=NULL;
    }
    fflush(stdin);
}

void usunostatni(LISTA *pierwszy)
{
    LISTA pom=*pierwszy;
    if ((*pierwszy)->nast==NULL)
    {
        (*pierwszy)=NULL;
        free(pom);
    }
    else
    {
        while (pom->nast->nast!=NULL) pom=pom->nast;
        pom->nast=NULL;
        free(pom->nast);
    }
}

void edytuj()
{

}

int main()
{
    LISTA pierwszy=malloc(sizeof(LISTA));
    pierwszy=NULL;

    int x, y;

    system("cls");

    printf("===========================================================\n");
    printf("\tBAZA DANYCH\n");
    printf("===========================================================\n\n");

    while(x != EOF) 
    {
          printf("Wybierz opcje: \n 1 - Dodaj rejestr \n 2 - Edytuj rejestr \n 3 - Usun rejestr \n 4 - Wypisz wpisy \n 5 - Zakoncz \n");
          fflush(stdin);
          y = getch();
          if(y=='1')
                dodajostatni(&pierwszy);
          else if(y == '2')
                edytuj();
          else if(y == '3')
                usunostatni(&pierwszy);
          else if(y == '4')
                wypisz(pierwszy);
          else if(y == '5') {
                break;
          }
          else printf("Niepoprawna opcja\n");
        }

    system ("PAUSE");
    return 0;
}
0
LISTA pierwszy=malloc(sizeof(LISTA));
pierwszy=NULL;

Wiesz, że to przypisanie w drugiej linijce sprawia, że tracisz wcześniej zarezerwowaną pamięć?

0

Tak, wiedziałem (tutaj niepotrzebnie dodałem tą linijkę LISTA pierwszy=malloc(sizeof(LISTA)); dzięki za pokazanie tego błędu ;))

Udało mi się zrobić, by kod działał dla dodawania liczb do listy (przestawiłem listę z wewnętrznej na globalną). Jeszcze tylko mam takie pytanie: dlaczego w tym kodzie, jeśli podmieni się na początku

char nadawca[30]; na:   char *nadawca;

i usunie się znak komentarza z linijki:

//nowy->nadawca=malloc(sizeof(char)*30);

to wczytywanie tekstu do tego "nadawcy" nie działa prawidłowo? (w moim przypadku pierwsze wczytanie działa prawidłowo, ale dalsze już nie)

EDIT: Problem rozwiązany ;). Wszystkie błędy były spowodowane tym, że malloc przydzielał pamięć rozmiaru wskaźnika do struktury, a nie elementu struktury.

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