• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

usuwanie wybranego elementu listy podwieszanej c

Object Storage Arubacloud
0 głosów
208 wizyt
pytanie zadane 2 września 2019 w C i C++ przez Ryszard Kałuziński Początkujący (280 p.)

Mam podwieszaną listę , chcę usunąć wybrany element z podwieszonej listy ale program wywala, ja w kodzie nie widzę błędu, kolega też nie

typedef struct stolik
{
    bool rezerwacja;
    int numer;
    int krzesla;
    struct stolik*pNext;
    struct data*kiedy;
}stolik_typ;

typedef struct data
{
    int rok;
    int miesiac;
    int dzien;
    int godzina;
    struct data*pNext;
    struct klient*kto;
}data_typ;

typedef struct klient
{
    char nazwisko[100];
    long long int nrtel;
    char uwagi[1000];
}klient_typ;

void usuwanieRezerwacji (stolik_typ**glowa)
{
    char nazwisko[100];
    int dzien, miesiac, rok, godzina;
    printf("Usuwanie rezerwacji.\nPodaj nazwisko na ktore zostala zlozona rezerwacja: ");
    scanf("%s", nazwisko);
    wyborDaty(&rok, &miesiac, &dzien, &godzina);
    stolik_typ*wsk = (*glowa);
    data_typ*pierw;
    while(wsk!=NULL)
    {
        pierw = wsk->kiedy;
        if(pierw->pNext==NULL)
        {
            if(pierw->rok == rok && pierw->miesiac == miesiac && pierw->dzien == dzien && pierw->godzina == godzina && strcmp(pierw->kto->nazwisko, nazwisko) == 0)
            {
                free(pierw->kto);
                free(pierw);
                wsk->kiedy = NULL;
            }
        }
        else
        {
            while(pierw->pNext!=NULL)
            {
                if(pierw->pNext->rok == rok && pierw->pNext->miesiac == miesiac && pierw->pNext->dzien == dzien && pierw->pNext->godzina == godzina && strcmp(pierw->pNext->kto->nazwisko, nazwisko) == 0)
                {
                    data_typ*usuwany = pierw->pNext;
                    pierw->pNext = pierw->pNext->pNext;
                    free(usuwany->kto);
                    free(usuwany);
                }
                else
                    pierw = pierw->pNext;
            }
        }
        wsk = wsk->pNext;
    }
}

 

komentarz 2 września 2019 przez tkz Nałogowiec (42,000 p.)
Bool działa? Jest od C99 dopiero. Gdzie masz deklarację wyborDaty();?
komentarz 2 września 2019 przez adrian17 Ekspert (344,860 p.)

Jest od C99 dopiero

A jest 2019 :P

Na przykład od GCC5 domyślny jest C11. W MSVC chyba też od dawna jest bool.

Gdzie masz deklarację wyborDaty();?

Pewnie gdzie indziej. #include też nie ma.

komentarz 2 września 2019 przez tkz Nałogowiec (42,000 p.)

Jest od C99 dopiero

A jest 2019 :P

Sam wiesz, że często standard nowszy niż C90 nie jest włączony, lepiej się upewnić. 

komentarz 2 września 2019 przez adrian17 Ekspert (344,860 p.)
Dlatego właśnie dodałem, że od GCC5 (wydany w 2015, również wersja dystrybuowana obecnie z Code::Blocks), Clanga 3.6 (wydany w 2015) domyślny jest właśnie C11, a MSVC ma boola z tego co wiem od 2013 :)
komentarz 2 września 2019 przez adrian17 Ekspert (344,860 p.)
Anyway, na oko nie widzę tu błędu; przydałby się pełny kod do reprodukcji.
komentarz 2 września 2019 przez mokrowski Mędrzec (155,460 p.)
Typ _Bool (dostępny natywnie od C99), wymaga dodania nagłówka <stdbool.h> aby był mógł być używany jako true/false. Samo true/false to makra tak zresztą jak bool.

1 odpowiedź

0 głosów
odpowiedź 2 września 2019 przez j23 Mędrzec (194,920 p.)

Jakoś tak:

void usuwanieRezerwacji(stolik_typ** glowa)
{
	char nazwisko[100];
	int dzien, miesiac, rok, godzina;
	
	printf("Usuwanie rezerwacji.\nPodaj nazwisko na ktore zostala zlozona rezerwacja: ");
	scanf("%s", nazwisko);
	wyborDaty(&rok, &miesiac, &dzien, &godzina);
	
	stolik_typ* wsk = (*glowa);

	while (wsk != NULL) {
		data_typ* date = wsk->kiedy;
		data_typ* date_before = NULL;

		while (date != NULL) {
			if (date->rok == rok && 
				date->miesiac == miesiac && 
				date->dzien == dzien && 
				date->godzina == godzina && 
				strcmp(date->kto->nazwisko, nazwisko) == 0) {

				data_typ* tmp = date;
				date = tmp->pNext;
				free(tmp->kto);
				free(tmp);

				if (date_before) date_before->pNext = date;
				else wsk->kiedy = date;
			}
			else {
				date_before = date;
				date = date->pNext;
			}
		}

		wsk = wsk->pNext;
	}
}

 

Podobne pytania

0 głosów
1 odpowiedź 197 wizyt
pytanie zadane 8 maja 2019 w C i C++ przez Ryszard Kałuziński Początkujący (280 p.)
0 głosów
1 odpowiedź 509 wizyt
pytanie zadane 23 czerwca 2017 w JavaScript przez nitrio578 Początkujący (270 p.)
0 głosów
2 odpowiedzi 447 wizyt
pytanie zadane 6 stycznia 2018 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)

92,568 zapytań

141,420 odpowiedzi

319,618 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...