Wątek zablokowany 2015-01-27 22:06 przez furious programming.

Usuwanie elementu z listy jednokierunkowej

0

Witam, wzorując się na jednym z kodów wyskrobałem listę, do której mogę dodawać kolejne przedmioty (i to działa), problem jest gdy chcę coś usunąć, ponieważ niekoneicznie usuwa ten element który ja chcę. Oto kod:

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

#define MAX1 30
#define MAX2 20

typedef struct{ //struktura Przedmioty
    char nazwa_przedmiotu[MAX1];
    int punkty_ects;
    struct Przedmioty *next;
}Przedmioty;

void dodaj(Przedmioty **lista, Przedmioty *nowy){ //dodanie wezla do listy
    nowy -> next = NULL;
    if(!(*lista))
        *lista = nowy;
    else{
        Przedmioty *ptr = *lista;
        while(ptr->next)
            ptr = ptr -> next;
        ptr -> next = nowy;
    }
}

void dodaj_przedmiot(Przedmioty **lista){ //dodaje przedmiot do listy
    Przedmioty *nowy = (Przedmioty*)malloc(sizeof(Przedmioty));
    printf("Podaj nazwe przedmiotu oraz ilosc punktow ECTS: \n");
    scanf("%s %d",nowy->nazwa_przedmiotu,&(nowy->punkty_ects));
    dodaj(lista,nowy);
}

void wypisz_liste(Przedmioty *lista){ //wypisywanie listy
    Przedmioty *ptr = lista;
    if(!lista)
        printf("Lista jest pusta!");
    else
        printf("Oto przedmioty na liscie:\n");

    int i=1;
    while(ptr){
        printf("%d. %s %d\n",i, ptr -> nazwa_przedmiotu, ptr -> punkty_ects);
        ptr = ptr -> next;
        i++;
    }
    printf("\n");
}

int usun(char *nazwa, Przedmioty **lista){ //usuwanie z listy
    Przedmioty *poprzedni = NULL;
    Przedmioty *ptr = *lista;
    while((!ptr) && ((!strcmp(ptr->nazwa_przedmiotu,nazwa)))){
        poprzedni = ptr;
        ptr = ptr -> next;
    }

    if(!ptr)
        return 0;
    else{
        if(!poprzedni){
            (*lista) = (*lista) -> next;
            free(ptr);
        }

        else{
            poprzedni -> next = ptr -> next;
            free(ptr);
        }
        return 1;
    }
}

int main(void){
    Przedmioty *lista = NULL;
    int opcja=1;
    char nazwa[MAX1];
    while(opcja){
        printf("\nMENU:\n");
        printf("0. Wyjscie z programu\n");
        printf("1. Dodaj przedmiot\n");
        printf("2. Usun przedmiot\n");
        printf("3. Wyswietl liste przedmiotow\n");
        printf("Twoj wybor: ");
        scanf("%d",&opcja);
        printf("\n");
        switch(opcja){
            case 1:
                dodaj_przedmiot(&lista);
                break;

            case 2:
                printf("Podaj nazwe przedmiotu ktory chcesz usunac: ");
                scanf("%s",nazwa);
                usun(nazwa,&lista);
                break;

            case 3:
                wypisz_liste(lista);
                break;
        }
    }
return 0;
}
 

Siedzę nad tym już trochę i nic mi nie przychodzi do głowy, jakby ktoś mógł mi pomóc to byłoby fajnie ;)

0
while((!ptr)
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX1 30
#define MAX2 20

typedef struct{ //struktura Przedmioty
    char nazwa_przedmiotu[MAX1];
    int punkty_ects;
    struct Przedmioty *next;
}Przedmioty;

void dodaj(Przedmioty **lista, Przedmioty *nowy){ //dodanie wezla do listy
    nowy -> next = NULL;
    if(!(*lista))
        *lista = nowy;
    else{
        Przedmioty *ptr = *lista;
        while(ptr->next)
            ptr = ptr -> next;
        ptr -> next = nowy;
    }
}

void dodaj_przedmiot(Przedmioty **lista){ //dodaje przedmiot do listy
    Przedmioty *nowy = (Przedmioty*)malloc(sizeof(Przedmioty));
    printf("Podaj nazwe przedmiotu oraz ilosc punktow ECTS: \n");
    scanf("%s %d",nowy->nazwa_przedmiotu,&(nowy->punkty_ects));
    dodaj(lista,nowy);
}

void wypisz_liste(Przedmioty *lista){ //wypisywanie listy
    Przedmioty *ptr = lista;
    if(!lista)
        printf("Lista jest pusta!");
    else
        printf("Oto przedmioty na liscie:\n");

    int i=1;
    while(ptr){
        printf("%d. %s %d\n",i, ptr -> nazwa_przedmiotu, ptr -> punkty_ects);
        ptr = ptr -> next;
        i++;
    }
    printf("\n");
}

int usun(char *nazwa, Przedmioty **lista){ //usuwanie z listy
    Przedmioty *poprzedni = NULL;
    Przedmioty *ptr = *lista;
    while((ptr) && ((!strcmp(ptr->nazwa_przedmiotu,nazwa)))){
        poprzedni = ptr;
        ptr = ptr -> next;
    }

    if(!ptr)
        return 0;
    else{
        if(!poprzedni){
            (*lista) = (*lista) -> next;
            free(ptr);
        }

        else{
            poprzedni -> next = ptr -> next;
            free(ptr);
        }
        return 1;
    }
}

void zapis_dopliku(char *nazwaPliku[], Przedmioty **lista){
    Przedmioty *ptr = lista;
    FILE *fp = fopen(nazwaPliku,"w+");
    while(ptr){
        fprintf(fp,"%s %d\n",ptr -> nazwa_przedmiotu, ptr -> punkty_ects);
        ptr = ptr -> next;
    }
    fclose(fp);
}

void odczyt_zpliku(char *nazwaPliku[], Przedmioty **lista){
    Przedmioty *nowy = (Przedmioty*)malloc(sizeof(Przedmioty));
    FILE *fp = fopen(nazwaPliku,"r+");
    while(fp != EOF){
        fscanf(fp,"%s %d", nowy -> nazwa_przedmiotu, &(nowy -> punkty_ects));
        dodaj(lista, nowy);
    }
    fclose(fp);
    printf("Odczyt z pliku pomyslny!\n");
}

int main(void){
    Przedmioty *lista = NULL;
    int opcja=1;
    char nazwa[MAX1],nazwaPliku[MAX1],odczytPliku[MAX1];
    while(opcja){
        printf("\nMENU:\n");
        printf("0. Wyjscie z programu\n");
        printf("1. Dodaj przedmiot\n");
        printf("2. Usun przedmiot\n");
        printf("3. Wyswietl liste przedmiotow\n");
        printf("4. Zapis listy do pliku tekstowego\n");
        printf("5. Odczyt listy z pliku tekstowego\n");
        printf("Twoj wybor: ");
        scanf("%d",&opcja);
        printf("\n");
        switch(opcja){
            case 1:
                dodaj_przedmiot(&lista);
                break;

            case 2:
                printf("Podaj nazwe przedmiotu ktory chcesz usunac: ");
                scanf("%s",nazwa);
                usun(nazwa,&lista);
                break;

            case 3:
                wypisz_liste(lista);
                break;

            case 4:
                printf("Podaj nazwe pliku do ktorego chcesz zapisac liste: (z rozszerzeniem .txt)\n");
                scanf("%s",nazwaPliku);
                zapis_dopliku(nazwaPliku,lista);
                break;

            case 5:
                printf("Podaj nazwe pliku z ktorego chcesz odczytac liste przedmiotow: (z rozszerzeniem .txt)\n");
                scanf("%s",odczytPliku);
                odczyt_zpliku(odczytPliku,&lista);
                break;
        }
    }
return 0;
}
 

Nadal usuwanie mi nie działa mimo tej wskazówki, nie wiem dlaczego wcześniej dałem tam zaprzeczenie. Teraz doszedł mi kolejny problem, bo postanowiłem spróbować wczytać listę z pliku tekstowego, ale wygląda na to że nic mi to nie dało. Dobrze, że chociaż działa zapisywanie do pliku :D

0

Nie wiem też dlaczego dałem zaprzeczenie przy strcmp, usuwanie jest już w porządku...
A co jest nie tak z odczytem z pliku? Może powinienem użyć innej funkcji?

0

Wątek zostaje zablokowany, z powodu próby skasowania treści z postów przez autora wątku;
Jak dobrze, że wszelkie zmiany w postach oraz usunięte posty można jednym kliknięciem przywrócić.

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