Witam.
Mam do napisania pewnien program.
Mianowicie terminarz w formie listy jednokierunkowej, niestety nie mogę użyć konternera <list>.
Niestety mam problem z usuwaniem pozostałych elementów z tego samego dnia.
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
struct Sterminarz
{
Sterminarz *nastepny = NULL;
int rok;
int miesiac;
int dzien;
int godzina;
string notatka;
bool operator<(const Sterminarz &rhs)const
{
return (godzina < rhs.godzina);
}
};
void weryfikujDane(int warosc)
{
cin >> warosc;
if (!cin.good())
{
cin.clear();
cin.ignore(INT16_MAX, '\n');
cout << "Blad wpisano litere/znak specjalny zamiast liczby" << endl;
cout << "Wpisz jeszcze raz prawidlowa wartosc" << endl;
cin >> warosc;
}
}
bool sprawdz(Sterminarz *glowa, int rok, int miesiac, int dzien)
{
if (glowa->rok == rok && glowa->miesiac == miesiac && glowa->dzien == dzien)
return true;
else
return false;
}
//dodaje termin na początku
void dodajNaPoczatku(Sterminarz *&glowa, int rok, int miesiac, int dzien, int godzina, string notatka)
{
Sterminarz *p;
p = new Sterminarz;
p->rok = rok;
p->miesiac = miesiac;
p->dzien = dzien;
p->godzina = godzina;
p->notatka = notatka;
p->nastepny = glowa;
glowa = p;
}
//drukuje liste
void drukujListe(Sterminarz *glowa)
{
if (glowa)
{
unsigned i;
for (i = 1; glowa; glowa = glowa->nastepny)
cout << "\nNr Terminu:" << i++ << ". " << glowa->rok << "/" << glowa->miesiac << "/" << glowa->dzien << " Godzina: " << glowa->godzina << "\nNotatka: " << glowa->notatka << endl;
}
else
{
cout << "\nBrak terminow." << endl;
}
}
//drukuje pojedyńczą notatkę
void drukujNotake(Sterminarz *glowa)
{
cout << "\n" << glowa->rok << "/" << glowa->miesiac << "/" << glowa->dzien << " Godzina: " << glowa->godzina << "\nNotatka: " << glowa->notatka << endl;
}
//Czyszczenie ekranu
void wyswietl(Sterminarz *glowa)
{
system("CLS");
cout << " ZAWARTOSC LISTY: " << endl;
cout << "======================================" << endl;
drukujListe(glowa);
cout << endl;
cout << "======================================" << endl << endl;
}
//usuwanie listy
void usunListe(Sterminarz *&glowa)
{
Sterminarz *p;
while (glowa != NULL)
{
p = glowa;
glowa = glowa->nastepny;
delete p;
}
}
//wyszukiwanie terminów
Sterminarz *wyszukajTermin(Sterminarz *glowa)
{
int rok;
int miesiac;
int dzien;
int licznik = 0;
cout << "\nPodaj rok: " << endl;
cin >> rok;
cout << "Podaj miesiac: " << endl;
cin >> miesiac;
cout << "Podaj dzien: " << endl;
cin >> dzien;
while (glowa)
{
if (sprawdz(glowa, rok, miesiac, dzien))
{
licznik++;
cout << "\nZnaleziony termin to: " << endl;
drukujNotake(glowa);
}
glowa = glowa->nastepny;
}
if (licznik == 0)
{
cout << "\nNie znaleziono terminów";
}
cout << "\nLiczba znalezionych terminów: " << licznik;
return glowa;
}
//usuwa pierwszy element
void usunPierwszyElement(Sterminarz *&glowa)
{
Sterminarz *p;
p = glowa;
if (p)
{
glowa = p->nastepny;
delete p;
}
}
//usuwa pozostałe elementy
void usunPozostaleElementy(Sterminarz *&glowa)
{
Sterminarz *p;
p = glowa;
while (p->nastepny)
{
Sterminarz *q = p->nastepny;
p->nastepny = q->nastepny;
delete q;
}
}
//funkcja wyszukująca termin o najwczesniejszej godzinie.
Sterminarz* wyszukajWczesniejsza(Sterminarz*& glowa)
{
if (!glowa)
{
cout << "Lista jest pusta";
return NULL;
}
Sterminarz* p = glowa;
Sterminarz* poprzedni = glowa;
Sterminarz* wczesniejszy = new Sterminarz;
Sterminarz* najwczesniejszy = new Sterminarz;
bool duplikat= false;
int licznik = 0;
int rok;
int miesiac;
int dzien;
cout << "\nPodaj rok: " << endl;
cin >> rok;
cout << "Podaj miesiac: " << endl;
cin >> miesiac;
cout << "Podaj dzien: " << endl;
cin >> dzien;
while (p)
{
if (sprawdz(p, rok, miesiac, dzien))
{
wczesniejszy = p;
najwczesniejszy = poprzedni;
licznik++;
duplikat = true;
cout << "\nnajwczesniejszy";
drukujNotake(najwczesniejszy);
cout << "\npoprzedni";
drukujNotake(wczesniejszy);
poprzedni = p;
}
p = p->nastepny;
}
if(duplikat == false)
{
cout << "\nNie znaleziono terminów" << endl;
return NULL;
}
else
{
cout << "\nIlość znalezionych terminów " << licznik << endl;
cout << "\nIlośc poźniejszych terminów " << --licznik;
if (wczesniejszy != glowa)
{
najwczesniejszy->nastepny = wczesniejszy->nastepny;
wczesniejszy->nastepny = glowa;
glowa = wczesniejszy;
}
}
return wczesniejszy;
}
int main()
{
setlocale(LC_ALL, "polish");
int opcja;
int rok;
int miesiac;
int dzien;
int godzina;
string notatka;
Sterminarz *start = NULL;
Sterminarz *temp = NULL;
while (true)
{
//wyswietl(start);
//menu
cout << "\n\nTerminarz" << endl;
cout << "======================================" << endl;
cout << "Wybierz opcje z menu ponizej " << endl;
cout << "1-Dodanie terminu " << endl;
cout << "2-Wydrukowanie wszystkich terminow" << endl;
cout << "3-Wyszukiwanie terminu po dacie " << endl;
cout << "4-Wyszukiwanie notatki " << endl;
cout << "5-Usuwanie listy " << endl;
cout << "6-Usuwanie pierwszego terminu " << endl;
cout << "7-Zakonczenie programu." << endl;
cout << "======================================" << endl;
cout << "\nOpcja: ";
cin >> opcja;
if (!cin.good())
{
cin.clear();
cin.ignore(INT16_MAX, '\n');
cout << "Blad wpisano litere/znak specjalny zamiast liczby" << endl;
cout << "Wpisz jeszcze raz prawidlowa wartosc" << endl;
cin >> opcja;
}
switch (opcja)
{
case 1:
\\tymczasowe dodawanie elementów.
dodajNaPoczatku(start, 1994, 7, 28, 123, "AAA7");
dodajNaPoczatku(start, 1995, 8, 28, 1, "BBB6");
dodajNaPoczatku(start, 1995, 8, 28, 132, "CCC5");
dodajNaPoczatku(start, 1997, 10, 28, 145, "DDD4");
dodajNaPoczatku(start, 1995, 9, 30, 1654, "EEE3");
dodajNaPoczatku(start, 1995, 8, 28, 2, "FFF2");
dodajNaPoczatku(start, 1996, 8, 28, 123, "GGG1");
break;
case 2:
cout << "\nDrukowanie listy:" << endl;
drukujListe(start);
break;
case 3:
wyszukajTermin(start);
break;
case 4:
wyszukajWczesniejsza(start);
break;
case 5:
cout << "\nUsuwanie listy. " << endl;
usunListe(start);
break;
case 6:
usunPierwszyElement(start);
break;
case 7:
cout << "\nUsuwanie listy oraz zakonczenie programu." << endl;
usunListe(start);
exit(0);
default:
if (opcja < 0 || opcja >8)
cout << "Niestety nie wiem o co chodzi wpisz liczbe od 1 do 7" << endl;
}
}
}
Problem jest w funkcji wyszukajWczesniejsza, albo mi nie usuwa, albo usuwa mi całą listę