C++ lista wyszukiwanie najwcześniejszego terminu,

0

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ę

0

Ten kod się w ogóle kompiluje?

                \\tymczasowe dodawanie elementów.

Komentarze mają slashe w drugą stronę.

0

Dla mnie kod C++ proceduralny jest bardzo ciężki i też zgadzam się z @enedil nieczytelny. Zarazem BARDZO PODOBNY to podobnych tematów tu zamieszczanych. Przypadek?

Wiele z tych procedur by było fajnymi metodami.
Brak typu datowego (standardowego czy samoróbnego, nieważne) to zbrodnia. Nawiasem mówiąc, sam się na tym potykasz, porównanie tylko wg godziny na pewno nie jest tym, o czym myślisz.
Dałbym też obiektowo obiekty klasy MojaLista, miałby fajne metody.

Dziesiątki drobiazgów, a to modyfikowanie parametru (skąd ta maniera - identyczna byłą w podobnych kodach), i inne. Generalnie: nie chce się tego analizować, jak pisał @enedil
Nazwa Sterminarz kłamie, to nie Terminarz, tylko Termin

0

Po całej nocy i całym dniu zostało mi coś takiego,
Funkcja znajduje terminy z wybranego dnia,
Liczy ile znalazła terminów, ile jest poźniejszych, zwraca wartość
Przenosi najwczesniejszy wyszukany termin na początek,
Nie działa usuwanie poźniejszych terminów.

//usuwanie elementów różnych od głowy 
void usunPozostaleElementy(Stermin *&glowa, Stermin *r)
{
	Stermin * p;

	if (glowa == r)
	{
		usunPierwszyElement(glowa);
	}
	else
	{
		p = glowa;
		while (p->nastepny != r) p = p->nastepny;
		p->nastepny = r->nastepny;
		delete r;
	}
}

//funkcja wyszukująca  termin o najwczesniejszej godzinie. 
int wyszukajWczesniejsza(Stermin*& glowa, int rok, int miesiac, int dzien)
{
	if (!glowa)
	{
		cout << "Lista jest pusta";
		return NULL;
	}
	Stermin* p = glowa;
	Stermin* poprzedni = glowa;
	Stermin* wczesniejszy = glowa;
	Stermin* najwczesniejszy = glowa;

	bool duplikat = false;

	int licznik = 0;


	while (p)
	{

		if (sprawdz(p, rok, miesiac, dzien))
		{
			wczesniejszy = p;
			najwczesniejszy = poprzedni;

			licznik++;
			duplikat = true;

		}
		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 << endl;


		if (wczesniejszy != glowa)
		{
			najwczesniejszy->nastepny = wczesniejszy->nastepny;
			wczesniejszy->nastepny = glowa;
			glowa = wczesniejszy;
			cout << "Lista po przeniesieniu najwcześniejszego elementu: " << endl;

			p = glowa;
			while (p)
			{
				if (p->rok == rok && p->miesiac == miesiac && p->dzien == dzien)
				{

					Stermin *pierwszy = wczesniejszy;
					



					if (pierwszy->godzina != p->godzina)
					{
						//w tym miejscu znajduje mi pozostałe terminy z wybranego dnia.
						//jak próbuje wywołać funkcje void usunPozostaleElementy(pierwszy, p)
						//zostawia mi pierwszy element i jakiś randomowy.
                                                  
					}
					pierwszy = pierwszy->nastepny;

				}
				p = p->nastepny;

			}
		}

		cout << "\nTerminarz po usunięciu późniejszych terminów z wyszukanego dnia: " << endl;
		drukujListe(glowa);
	}

	return licznik;

}

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