Dobrý den. Mohl mi někdo poradit jak se dá tohle vyřešit. Předem děkuju
Jedna se lineární spojový seznam se zarážkou.
Prvek seznamu obsahuje klíč (int), hodnotu (string) a ukazatel na následující prvek seznamu.
Prvky jsou uspořádané vzestupně podle klíče.
Seznam obsahuje maximálně jeden prvek s daným klíčem.
Implementujte následující metody třídy UsporadanySeznam:
-konstruktor, destruktor
konstruktor inicializuje seznam, destruktor by měl smazat všechny prvky seznamu.
-void vlozPrvek(int klic, const string& hodnota)
Vloží prvek do seznamu na správné místo podle klíče (pokud už prvek s daným klíčem v seznamu je, jen změní jeho hodnotu na novou).
-Prvek* najdiPrvek(int klic);
Zamyslete se nad efektivnějším algoritmem než známe pro běžný spojový seznam. Využijte toho, že prvky jsou seřazené podle klíče, není třeba procházet celý seznam.
-void smazPrvek(int klic);
Opět lze využít toho, že prvky jsou seřazené podle klíče, není třeba procházet celý seznam.
-void vypis();
Vypíše prvky seznamu jeden po druhém na konzoli (na jeden řádek). Např. ve tvaru: (2,"skrin") (8,"zidle") (10,"stul")
Možná bude potřeba implementovat i nějaké metody třídy Prvek (např. konstruktor(y))
Rozšířte přiložené testovací příklady pro metody: vlozPrvek, najdiPrvek a smazPrvek, aby co nejlépe pokryly možné situace.
už mam hotovou část, ale nejde tohle přeložit kvůli chybám. Možna někdo napoví jak s tím
#include "UsporadanySeznam.h"
UsporadanySeznam::UsporadanySeznam()
{
prvni = new Prvek();
zarazka = prvni;
}
UsporadanySeznam::~UsporadanySeznam()
{
Prvek* P;
P = prvni;
while (prvni != zarazka)
{
P = prvni;
prvni*= prvni->
delete p;
}
}
Prvek* UsporadanySeznam::najdiPrvek(int klic)
{
Prvek* p = prvni;
while (p != zarazka && klic < p->klic)
{
p = p->dalsi;
if (p != zarazka && klic == p ->klic)
return p;
return nullptr;
}
}
void UsporadanySeznam::vlozPrvek(int klic, const std::string& hodnota)
{
Prvek* p =prvni;
if ( prvni -> klic > klic || prvni == zarazka)
{
Prvek* n = new Prvek();
n -> klic = klic;
n -> hodnota = hodnota;
n -> dalsi = prvni;
prvni = n;
return;
}
}
void UsporadanySeznam::smazPrvek(int klic)
{
Prvek* p = prvni;
if (p != zarazka && klic == p ->klic)
delete p;
}
void UsporadanySeznam::vypis()
{
Prvek* p=prvni;
while (p != zarazka)
{
cout<<"("<<p* klic<<"," <<p* hodnota <<",";
p = p* dalsi;
}
}
1) vloz, smaz- hotová je jen část (přidání prvního prvku, smazání prvku) , netuším jak s ostatními prvky
2) destruktor, vypis - myslím,že jsou tam syntaktické chyby, ale nevidím kde jsou
3) najdi - asi problém s těmi zavorkami nebo možna ještě něco chybí, nefunguje
4) prosím pomozte s konstruktorem Prvku a rozšířenými testy
Offline
↑ Tmitheadway:
Za prvé by ses měl obtěžovat a poskytnout kompletní kód, tedy včetně obsahu headeru UsporadanySeznam.h.
Za druhé by bylo fajn, aby sis nejdřív opravil chyby, které zachytí kompilátor. Např.
prvni*= prvni-> delete p;
asi tak úplně kompilátorem neprojde. Je tam celá řada chyb na pouhých dvou řádcích a kompilátor ti řekne, jaké to jsou. Kvůli tomu není třeba chodit sem.
Ve funkci najdiPrvek se zase vždy vrátí hned v první iteraci cyklu a podobných problémů tam bude asi víc, ale jak říkám, nechce se mi to procházet, když jsi ani nedodal definici třídy Prvek.
Offline
↑ LukasM:↑ LukasM:
je to tady
#ifndef UsporadanySeznam_h
#define UsporadanySeznam_h
#endif /* UsporadanySeznam_h */
#pragma once
#include<string>
/* Jeden prvek seznamu. */
struct Prvek
{
int klic=0; // identifikator
std::string hodnota=""; // nejaka hodnota (libovolny text)
Prvek *dalsi=nullptr; // ukazatel na dalsi prvek (naslednika)
/* sem muzete pridat konstruktor(y) nebo dalsi metody */
};
/* Seznam Prvku usporadanych vzestupne podle klice. */
class UsporadanySeznam
{
Prvek *prvni; // prvnн prvek seznamu nebo zarazka;
Prvek *zarazka; // posledni specialni prvek seznamu;
/* void push_front(T data);
void pop_back();
void insert(T value, int index);
void removeAt(int index);
*/
public:
UsporadanySeznam(); // konstruktor
~UsporadanySeznam(); // destruktor
Prvek* najdiPrvek(int klic);
void vlozPrvek(int klic, const std::string& hodnota);
void smazPrvek(int klic);
void vypis();
/* sem muzete pridat dalsi verejne metody */
};
Offline
↑ LukasM:
je ješte tu main
#include <iostream>
#include "UsporadanySeznam.h"
using namespace std;
/*Ukazka testovaci funkce pro metodu najdiPrvek() */
void vypisPrvek(UsporadanySeznam &t, int klic)
{
Prvek* p = t.najdiPrvek(klic);
if (p)
{
cout << "Nalezen prvek: ";
cout << "(" << p->klic << "," << p->hodnota << ") ";
cout << endl;
}
else
cout << "Prvek " << klic << " nenalezen. \n";
}
void test()
{
UsporadanySeznam t;
/* Vkladani prvku: */
t.vlozPrvek(9, "pracovni stul");
t.vlozPrvek(3, "kancelarska zidle");
t.vlozPrvek(6, "PC");
t.vlozPrvek(6, "notebook");
t.vlozPrvek(12, "lampa");
t.vypis();
/* Nalezeni prvku: */
Prvek* p = t.najdiPrvek(9);
if (p)
cout << "Prvek 9 nalezen.\n";
else
cout << "Prvek 9 nenalezen.\n";
vypisPrvek(t, 9);
vypisPrvek(t, 1);
/* Smazani prvku: */
t.smazPrvek(10);
t.smazPrvek(12);
t.smazPrvek(6);
t.smazPrvek(3);
t.smazPrvek(9);
t.smazPrvek(3);
t.vypis();
}
int main()
{
test();
return 0;
}
Offline
↑ Tmitheadway:
Pár poznámek:
1. Nikde nevidím funkci main, takže pokud to nekompiluješ jako knihovnu, tak to linkeru bude vadit. A těžko to bez ní otestuješ. (Edit: ano, po třetím příspěvku už je tu snad všechno.)
2. Když už OOP, tak pořádně. Minimálně metody vypis a najdiPrvek by měly být const.
3. Include guard v tom headeru je použitý úplně špatně. Pokud to má být k něčemu, je třeba přesunout ten #endif na úplný konec souboru. Pak je také možné vyhodit #pragma once, což dělá to samé (akorát je to non-standard). Ve tvém kódu je to samozřejmě jedno.
Znovu opakuji: oprav chyby, které odhalí kompilátor. Na řádcích, které jsem býše napsal je například toto:
1. první* nic neznamená. Asi chceš posunout ukazatel na další prvek, takže ta hvězdička tam nemá co dělat.
2. první-> evidentně postrádá identifikátor nějaké member proměnné.
3. p není deklarované. Názvy proměnných jsou case-sensitive.
Opravdu nevím, proč by chyby tohoto typu měl hledat někdo tady. I tak tam bude hodně logických chyb.
Offline