[C] Lista j. kierunkowa - dodawanie, usuwanie, wyswietlanie.

kajtek95
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 28 gru 2016, o 11:55
Płeć: Mężczyzna
Lokalizacja: Białstok

[C] Lista j. kierunkowa - dodawanie, usuwanie, wyswietlanie.

Post autor: kajtek95 »

Witam. Mam problem ze zrozumieniem list. Napisałem funkcje, które mają dodawać, usuwać, wyświetlać elementy. W main zrobiłem menu główne, aby widzieć jak działa program, jednak wybierając case 1, a następnie wyświetlając, lub usuwając listę wyskakuje błąd, że lista jest pusta, pomimo, że wcześniej ją wypełniłem, ktoś coś ?

Kod:

Kod: Zaznacz cały

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

 struct Dane {
    float x;
    };
struct Element{
    struct Dane dane;
    struct Element *nast;
    };
typedef struct Element ELEMENT;
typedef ELEMENT* ADRES;

void wypiszListe(ADRES lista){
    if(lista==NULL){
        printf("Lista jest pusta.
");
        return -1;
    }
    printf("Nasza lista:");
    while(lista!=NULL){
        printf("%.2f", lista -> dane.x);
        lista=lista -> nast;
    }
    printf("
");
}
void dodajDoListy(ADRES *lista, float liczba){
    ADRES elem;
    elem =(ADRES)malloc(sizeof( ELEMENT ) );
    elem -> dane.x = liczba;
    elem -> nast = NULL;
    if( (*lista) == NULL )
        (*lista) = elem;
    else{
        ADRES pom = (*lista);
        while( pom -> nast != NULL ){
            pom = pom -> nast;
            pom -> nast = elem;
        }
    }
}
void czyscListe( ADRES *lista ){
    ADRES pom = *lista;
    while( pom != NULL){
        pom = pom -> nast;
        free( *lista );
        (*lista) = pom;
    }
    (*lista) = NULL;
}
void usunZListy (ADRES* lista, float liczba){
    ADRES pom, nast, pop;
    if ((*lista) == NULL){
        printf("Lista jest pusta, nie ma co usuwac
");
        return;
    }
    pom = (*lista);
    while( pom != NULL){
        if( pom -> dane.x = liczba )
            break;
        pom = pom -> nast;
    }
    if( pom == NULL ){
        printf("Nie ma elementu %d na liscie
", liczba);
    }
    else{
        nast = pom -> nast;
        if( pom == (*lista) )
            (*lista) = nast;
        else{
            pop = (*lista);
            while( pop -> nast != pom )
                pop = pop -> nast;
            pop -> nast = nast;
        }
        free( pom );
    }
}
void EXIT(){
    printf("KONIEC PROGRAMU");
}
int main()
{
    int wybor;
     do{
    printf("----------------------------
");
    printf("         MENU GLOWNE        
");
    printf("----------------------------
");
    printf("1. DodajDoListy.
");
    printf("2. WypiszListe
");
    printf("3. UsunZlisty
");
    printf("4. CzyscListe
");
    printf("5. EXIT
");
    printf("Wybor:");
    scanf("%d", &wybor);
    ADRES lista = NULL;
    //for(i=0;i<N;i++)
        switch(wybor){
            case 1: dodajDoListy( &lista, scanf("%d") ); break;
            case 2: wypiszListe(lista); break;
            case 3: usunZListy( &lista, scanf("%d") ); break;
            case 4: czyscListe( &lista ); break;
            case 5: EXIT; break;
            }
    }
    while(wybor!=5);
    return 0;
}
Ostatnio zmieniony 28 gru 2016, o 19:33 przez Afish, łącznie zmieniany 1 raz.
Powód: Umieszczaj kod na forum.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Lista j. kierunkowa - dodawanie, usuwanie, wyswietlanie.

Post autor: kalwi »

Kod: Zaznacz cały

            case 1: dodajDoListy( &lista, scanf("%d") ); break;
            case 3: usunZListy( &lista, scanf("%d") ); break;
to jest bez sensu (dalej nie patrzyłem w kod)
kajtek95
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 28 gru 2016, o 11:55
Płeć: Mężczyzna
Lokalizacja: Białstok

[C] Lista j. kierunkowa - dodawanie, usuwanie, wyswietlanie.

Post autor: kajtek95 »

Racja... poprawiłem to, wstawiłem wczytywanie liczby do wybieranych funkcji, ale błąd jest chyba w samych konstrukcjach funkcji, bo nadal nie dodaje żadnej liczby.

Kod: Zaznacz cały

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

 struct Dane {
    float x;
    };
struct Element{
    struct Dane dane;
    struct Element *nast;
    };
typedef struct Element ELEMENT;
typedef ELEMENT* ADRES;

void wypiszListe(ADRES lista){
    if(lista==NULL){
        printf("Lista jest pusta.
");
        return -1;
    }
    printf("Nasza lista:");
    while(lista!=NULL){
        printf("%.2f", lista -> dane.x);
        lista=lista -> nast;
    }
    printf("
");
}
void dodajDoListy(ADRES *lista){
    float liczba;
    printf("Podaj liczbe ktora ma zostac dodana do listy:
");
    scanf("%f", &liczba);
    ADRES elem;
    elem =(ADRES)malloc(sizeof( ELEMENT ) );
    elem -> dane.x = liczba;
    elem -> nast = NULL;
    if( (*lista) == NULL )
        (*lista) = elem;
    else{
        ADRES pom = (*lista);
        while( pom -> nast != NULL ){
            pom = pom -> nast;
            pom -> nast = elem;
        }
    }
}
void czyscListe( ADRES *lista ){
    ADRES pom = *lista;
    while( pom != NULL){
        pom = pom -> nast;
        free( *lista );
        (*lista) = pom;
    }
    (*lista) = NULL;
}
void usunZListy (ADRES* lista){
    float liczba;
    printf("Podaj jaka liczbe mam usunac z listy:
");
    scanf("%f", &liczba);
    ADRES pom, nast, pop;
    if ((*lista) == NULL){
        printf("Lista jest pusta, nie ma co usuwac
");
        return;
    }
    pom = (*lista);
    while( pom != NULL){
        if( pom -> dane.x = liczba )
            break;
        pom = pom -> nast;
    }
    if( pom == NULL ){
        printf("Nie ma elementu %d na liscie
", liczba);
    }
    else{
        nast = pom -> nast;
        if( pom == (*lista) )
            (*lista) = nast;
        else{
            pop = (*lista);
            while( pop -> nast != pom )
                pop = pop -> nast;
            pop -> nast = nast;
        }
        free( pom );
    }
}
void EXIT(){
    printf("KONIEC PROGRAMU");
}
int main()
{
    int wybor;
     do{
    printf("----------------------------
");
    printf("         MENU GLOWNE        
");
    printf("----------------------------
");
    printf("1. DodajDoListy.
");
    printf("2. WypiszListe
");
    printf("3. UsunZlisty
");
    printf("4. CzyscListe
");
    printf("5. EXIT
");
    printf("Wybor:");
    scanf("%d", &wybor);
    ADRES lista = NULL;
    //for(i=0;i<N;i++)
        switch(wybor){
            case 1: dodajDoListy(&lista);
            case 2: wypiszListe(lista); break;
            case 3: usunZListy( &lista );
            case 4: czyscListe( &lista ); break;
            case 5: EXIT; return 0;
            }
    }
    while(wybor!=5);
    return 0;
}
Ostatnio zmieniony 28 gru 2016, o 19:34 przez Afish, łącznie zmieniany 1 raz.
Powód: Umieszczaj kod na forum.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Lista j. kierunkowa - dodawanie, usuwanie, wyswietlanie.

Post autor: kalwi »

To tak na oko masz błędy w linijkach 108, 101, 38-41, i pewnie gdzieś jeszcze.
W każdym razie masz dosyć... złe podejście do robienia list. Zdecydowanie jest to przekombinowane oraz za mało zmodulowane, przez co trudniej jest znaleźć błąd.
Dużo prostsze i lepsze jest podejście do list takie, jakie zawsze stosuję:

Kod: Zaznacz cały

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

typedef struct node
{
    float key;
    struct node *next, *prev;
}node_t;

typedef struct list
{
    node_t *head;
    node_t *tail;
}list_t;

void removeSpecified(list_t *list);
void removeList(list_t *list);
void printList(list_t *list);
void checkMemory(const void * const ptr);
node_t *makeNode(void);
void addElement(list_t *list);


const char menu[] = {"
1. Dodaj element
2. Wyswietl wszystkie elementy.

3. Usun pierwszy element o danej wartosci.
4. Usun wszystkie elementy.
5. Wyjdz.
"};
typedef enum{ADD = 1, PRINT, REMOVE_ONE, REMOVE_ALL, EXIT}menu_t;

int main(void)
{
	list_t *list = malloc(sizeof(list_t));
    checkMemory(list);
    list->head = NULL;
    list->tail = NULL;
    menu_t choice;

    do
    {
        puts(menu);
        printf("Co chcesz zrobic: ");
        scanf("%d", &choice);
        switch(choice)
        {
            case ADD:
                addElement(list);
                break;
            case PRINT:
                printList(list);
                break;
            case REMOVE_ONE:
                removeSpecified(list);
                break;
            case REMOVE_ALL:
                removeList(list);
                break;
            case EXIT:
                removeList(list);
                exit(EXIT_SUCCESS);
            default:
                puts("Zla opcja!");
                break;
        }
    }
    while(choice != EXIT);

	return 0;
}

void addElement(list_t *list)
{
    node_t *node = makeNode();
    if(list->tail == NULL)
    {
        list->tail = node;
        list->head = node;
        return;
    }
    node->prev = list->tail;
    list->tail->next = node;
    list->tail = node;
}

node_t *makeNode(void)
{
    node_t *node = malloc(sizeof(node_t));
    checkMemory(node);
    node->prev = NULL;
    node->next = NULL;
    printf("Podaj wartosc elementu: ");
    scanf("%f", &(node->key));
    return node;
}

void checkMemory(const void * const ptr)
{
    if(ptr == NULL)
    {
        errno = ENOMEM;
        perror("Nie mozna zaalokowac pamieci!");
        exit(EXIT_FAILURE);
    }
}

void printList(list_t *list)
{
    if(list->head == NULL)
    {
        puts("Brak elementow na liscie!");
        return;
    }
    node_t *temp;
    puts("
Lista zawiera:");
    printf("{ ");
    for(temp = list->head; temp != NULL; temp = temp->next)
        printf("%.2f ", temp->key);
    puts("}");
};

void removeList(list_t *list)
{
    while(list->head != NULL)
    {
        list->tail = list->head;
        list->head = list->head->next;
        free(list->tail);
    }
    list->head = NULL;
    list->tail = NULL;
}

void removeSpecified(list_t *list)
{
    if(list->head == NULL)
    {
        puts("Brak elementow na liscie!");
        return;
    }
    printf("Wprowadz wartosc, jaka chcesz usunac: ");
    float var;
    scanf("%f", &var);
    node_t *temp;
    for(temp = list->head; temp != NULL; temp = temp->next)
        if(temp->key == var)
        {
            if(temp->prev == NULL)
            {
                list->head = list->head->next;
                list->head->prev = NULL;
            }
            else if(temp->next == NULL)
            {
                list->tail = list->tail->prev;
                list->tail->next = NULL;
            }
            else
            {
                temp->prev->next = temp->next;
                temp->next->prev = temp->prev;
            }
            free(temp);
            return;
        }
    puts("Brak takiego elementu na liscie!");
}
przestudiuj to sobie... dużo lepiej jest korzystać z listy mając wskaźnik na pierwszy i ostatni element
ODPOWIEDZ