Spojový seznam – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spojový seznam – C / C++ – Fórum – Programujte.comSpojový seznam – C / C++ – Fórum – Programujte.com

 

TarderOrtex
~ Anonymní uživatel
2 příspěvky
21. 1. 2015   #1
-
0
-

Zdravím,

potřeboval by jsem poradit s jednou funkcí v c++ v jednosměrným spojovým seznamu.
Seznam jako takový je zde:

#include <iostream>
using namespace std;

typedef int data;
const data NULA = 0;

struct prvek
{
    data data;
    prvek *dalsi;
};
struct spojovy_seznam
{
    prvek *hlava, *zarazka;
};
void vytvor_seznam(spojovy_seznam *s)
{
    s->hlava = new prvek;
    s->zarazka = s->hlava;
    s->zarazka->data = NULA;
    s->zarazka->dalsi = nullptr;
}
void vloz_na_zacatek(spojovy_seznam *s, data cislo)
{
    prvek *bunka = new prvek;
    bunka->data = cislo;
    bunka->dalsi = s->hlava;
    s->hlava = bunka;
}
void vloz_na_konec(spojovy_seznam *s, data cislo)
{
    prvek *bunka = new prvek;
    bunka->dalsi = nullptr;
    bunka->data = NULA;
    s->zarazka->dalsi = bunka;
    s->zarazka->data = cislo;
    s->zarazka = bunka;
}
void vypis(spojovy_seznam *s)
{
    prvek *bunka = s->hlava;
    while (bunka != s->zarazka)
    {
        cout << bunka->data << ", ";
        bunka = bunka->dalsi;
    }
    cout << endl;
}
bool prazdny(spojovy_seznam *s)
{
    return s->hlava == s->zarazka;
}
void odstranprvni(spojovy_seznam *s)
{
    if (prazdny(s))
        return;
    else
    {
        prvek *pom = new prvek;
        pom = s->hlava;
        s->hlava = pom->dalsi;
        delete pom;

    }
}
void odstrandruhy(spojovy_seznam *s)
{
    if (prazdny(s))
        return;
    else
    {
        prvek *pom2 = new prvek;
        pom2 = s->hlava->dalsi;
        s->hlava->dalsi = pom2->dalsi->dalsi;
        delete pom2;

    }
}
void vyprazdni(spojovy_seznam *s)
{
    while (!prazdny(s))
    {
        odstranprvni(s);
    }
}
void nejvetsi_prvek(spojovy_seznam *s)
{
    while (s->hlava->dalsi != nullptr)
    {
        if (s->hlava < s->hlava->dalsi)
            odstranprvni(s);
    }

}
void najdi(int prvek)
{
    
};

int main()

{

}

Chtěl jsem vytvořit funkci najdi největší, ale k tomu jsem musel udělat funkci smaž druhý prvek, kterou prostě nějak nemůžu dát dohromady. Mohli by jste mi prosím poradit?

Nahlásit jako SPAM
IP: 90.181.4.–
vitamin+8
Grafoman
22. 1. 2015   #2
-
0
-

#1 TarderOrtex

Zdrojovy kod sa tu vklada pomocou tlacitka [<?]

Preco vo funkciach na  mazanie prvku 'odstrandruhy' a 'odstranprvni' alokujes novy prvok?

Zvysny kod si pisal ty?

Preco si spravil toto:

const data NULA = 0;
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
TarderOrtex
~ Anonymní uživatel
2 příspěvky
22. 1. 2015   #3
-
0
-

#2 vitamin
jop. kód jsem psal více méně já, ale dělal jsem ho tak, jak ho po nás chtěli a ta alokace nového prvku tam právě byla :-( 

Nahlásit jako SPAM
IP: 90.181.4.–
ondrej39+1
Věrný člen
22. 1. 2015   #4
-
0
-

#3 TarderOrtex

Upřímně, máš to napsaný naprosto nevkusně. Raw pointery se ke správě zdrojů nepoužívají. (A fakt nevím, proč se to na všech školách pořád učí.) Akorát ti to bude dělat v kódu bordel, musíš si hlídat dealokaci, atp.

Toto je prostě hnus...

s->hlava = new prvek;

Co se nalezení největšího prvku týče, aktuálně máš funkci nejvetsi_prvek(spojovy_seznam *s) jako void. Namísto voidu to změň, aby ti to vracelo strukturu prvek, nicméně samotná funkce bude fungovat tak, že v těle funkce si uděláš dočasný raw pointer, třeba prvek * tempUzel = s->hlava;, seznam normálně budeš projíždět, dokud pNext != NULL a v rámci každého while cyklu porovnáš hodnotu tempUzel->data s uzelAktualni->data, a když bude tempUzel->data < uzelAktualni->data, tak přesměruješ pointer tempUzel = uzelAktualni;.

Jinak, když ses tak vrhnul do C++11 syntaxe s nullptr, doporučuji ti nastudovat si chytré ukazatele do C++11 uvedené.

Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
vitamin
~ Anonymní uživatel
1092 příspěvků
22. 1. 2015   #5
-
0
-

#4 ondrej39

Raw pointre by sa nemali pouzivat na prenos vlastinctva, inak je ich pouzitie v c++ v poriadku.

Nahlásit jako SPAM
IP: 95.105.229.–
ondrej39+1
Věrný člen
23. 1. 2015   #6
-
0
-

#5 vitamin
Raw pointery pochopitelně v C++ používat můžeš, ale nemají se používat na správu zdrojů, na správu dynamické paměti. Což tady kolega v příkladu očividně dělá. Krom toho, že si ještě v delete metodách vytváří navíc další prvky, které mu způsobí memory leak, na což jsi už poukázal. Kdyby použil třeba std::unique_ptr, problém se správou paměti mít nebude.

Nechce se mi věřit, že v zadání opravdu mají, aby alokaci nového prvku ve funkcích pro smazání provedli, spíš to vidím tak, že TarderOrtex nepochopil, co bylo vytvořením nového dočasného pointeru v metodách pro mazání myšleno.

Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Spojový seznam — založil lubabe

Spojový seznam — založil Jakub

Spojový seznam — založil Luckin

Linearní spojový seznam — založil Rivers

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý