Ewal'

Iš vienakrypčio į dvikryptį tiesinį sąrašą

Recommended Posts

Sveiki, gan sunkiai sekėsi parašyti vienakryptį tiesinį sąrašą, tačiau dabar jį reikia perdaryti į dvikrypti. Žinau, kad reikia sukūrti dar veiną rodyklę " *prev ", tačiau nežinau, kur būtent poto ją dėti. Gal kas nors turi laisvo laiko ir galėtų pagelbėti? Ačiū.
Kodas:

#include <iostream>
using namespace std;
struct elementas
{
    int data;
    elementas *next;
};
int main()
{
    int n;
    elementas *pirmas;
    elementas *naujas;
    elementas *galas;
    naujas = new elementas;
    naujas->data=1;
    pirmas=naujas;
    galas=naujas;
    cout << "Kiek elementu bus sarase? ";
    cin >> n;
    for(int i=1; i<n; i++)
    {
        naujas = new elementas;
        naujas->data=i+1;
        galas->next=naujas;
        galas=naujas;
        galas->next=NULL;
    }
    cout << "Elementai: ";
    naujas=pirmas;
    while(naujas!=NULL)
    {
        cout << naujas->data << " ";
        naujas=naujas->next;
    }
    cout << endl;
    int funkcija;
    cout << "*******************************" << endl;
    cout << "1. Elemento iterpimas i pradzia" << endl;
    cout << "-------------------------------" << endl;
    cout << "2. Elemento iterpimas i gala" << endl;
    cout << "-------------------------------" << endl;
    cout << "3. Tiesinio saraso spausdinimas" << endl;
    cout << "-------------------------------" << endl;
    cout << "4. Pirmojo elemento trinimas" << endl;
    cout << "-------------------------------" << endl;
    cout << "5. Paskutinio elemento trinimas" << endl;
    cout << "-------------------------------" << endl;
    cout << "6. Saraso trinimas" << endl;
    cout << "*******************************" << endl;
    cout << "Pasirinkite funkcija: " ;
    cin >> funkcija;


    if(funkcija==1) //Elemento iterpimas i pradzia
    {
        naujas = new elementas;
        naujas->data=1;
        naujas->next=pirmas;
        pirmas=naujas;
        cout << endl<<"Sarasas su naujai iterptu elementu i pradzia: ";
        while(naujas!=NULL)
        {
            cout << naujas->data << " ";
            naujas=naujas->next;
        }
        cout<<endl;
        return 0;
    }
    if (funkcija==2) //Elemento iterpimas i gala
    {
        naujas = new elementas;
        naujas->data=1;
        naujas->next=NULL;
        galas->next=naujas;
        naujas=pirmas;
        cout << endl<<"Sarasas su naujai iterptu elementu i gala: ";
        while(naujas!=NULL)
        {
            cout << naujas->data << " ";
            naujas=naujas->next;

        }
        cout<<endl;
    }
    if(funkcija==3) //Tiesinio saraso spausdinimas
    {
        cout << endl<<"Elementai: ";
        naujas=pirmas;
        while(naujas!=NULL)
        {
            cout << naujas->data << " ";
            naujas=naujas->next;
        }
        cout << endl;
    }
    if(funkcija==4) //Pirmojo elemento trinimas
    {
        naujas=pirmas;
        pirmas=pirmas->next;
        free(naujas);
        cout << endl<<"Elementai: ";
        naujas=pirmas;
        while(naujas!=NULL)
        {
            cout << naujas->data << " ";
            naujas=naujas->next;
        }
        cout << endl;
    }
    if(funkcija==5) //Paskutinio elemento trinimas
    {

    }
    if(funkcija==6) //Saraso trinimas
    {
        pirmas=naujas;
        while(naujas!=0)
        {
            pirmas=naujas->next;
            delete naujas;
            naujas=pirmas;
        }
        cout << endl<<"Elementai: ";
        naujas=pirmas;
        while(naujas!=NULL)
        {
            cout << naujas->data << " ";
            naujas=naujas->next;
        }
        cout << endl;
    }
    if(funkcija>6)
    {
        cout <<endl<< "Tokios funkcijos nera!" <<endl;
    }
}

 

Redaguota , nario Ewal'

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Turi saugoti adresą į prev kaip ir su next (Pačiam struct turi atsirast šitas).

Geriausia jeigu zinai kur yra head (pirmasis adresas arba pirmoji struktura)

Tik tiek kad turėsi suteikti ne sekantį adresą o praeitą, todėl galbūt darydamas ciklą išsisaugok adresą kurį loopino dar prieš tai, taip bus patogiau jį susidėt.

Redaguota , nario PreFix

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Kur čia moko su new naudoti free?

Beje, čia būtų labai patogu naudoti klases. Pradžioj sukurk vieną klasę, kuri laikys pointer'į į head'ą ir metodus push_front, push_back, print, pop_front, clear. Tada antrą klasę/struktūrą, kurioje laikysi data bei pointer'ius į sekantį ir praeitą elementą. Aišku, reiktų panaudoti konstruktorius ir destruktorius, bet ten nėra labai sudėtinga.

Edit: padariau pagal tavo formatą, tik kiek pagal save pakeičiau ir daug ką supaprastinau bei sutvarkiau.

#include <iostream>

struct Elementas {
    int         data;
    Elementas*  kitas;
    Elementas*  praeitas;
};

Elementas* iterpti_gale( Elementas* galva, const unsigned i = 1 ) {
    if ( !galva ) {
        galva           = new Elementas;
        galva->data     = i + 1;
        galva->kitas    = nullptr;
        galva->praeitas = nullptr;
    } else {
        Elementas* temp = galva;
        
        while ( temp->kitas != nullptr ) {
            temp = temp->kitas;
        }
        
        temp->kitas             = new Elementas;
        temp->kitas->data       = i + 1;
        temp->kitas->praeitas   = temp;
        temp->kitas->kitas      = nullptr;
    }
    
    return galva;
}

Elementas* iterpti_pradzioje( Elementas* galva, const unsigned i = 1 ) {
    if ( !galva ) {
        galva           = new Elementas;
        galva->data     = i + 1;
        galva->kitas    = nullptr;
        galva->praeitas = nullptr;
    } else {
        Elementas* temp = galva;
        
        galva           = new Elementas;
        galva->data     = i + 1;
        galva->praeitas = nullptr;
        galva->kitas    = temp;
        
        temp->praeitas = galva;
    }
    
    return galva;
}

void spausdinti_sarasa( Elementas* galva ) {
    Elementas* temp = galva;
    
    std::cout << "Elementai: ";
    
    while ( temp != nullptr ) {
        std::cout << temp->data << " ";
        
        temp = temp->kitas;
    }
    
    std::cout << std::endl;
}

Elementas* trinti_pirmaji( Elementas* galva ) {
    galva->kitas->praeitas  = nullptr;
    Elementas* temp         = galva;
    galva                   = galva->kitas;
    delete temp;
    
    return galva;
}

Elementas* trinti_paskutiniji( Elementas* galva ) {
    Elementas* temp = galva;
    
    while ( temp->kitas != nullptr ) {
        temp = temp->kitas;
    }
    
    temp->praeitas->kitas = nullptr;
    delete temp;
    
    return galva;
}

Elementas* trinti_sarasa( Elementas* galva ) {
    Elementas* temp = galva;
    
    while ( temp->kitas != nullptr ) {
        delete temp->praeitas;
        
        temp = temp->kitas;
    }
    
    delete temp;
    
    return nullptr;
}

int main() {
    Elementas* galva = nullptr;
    
    std::cout << "Kiek elementu bus sarase? ";
    
    unsigned n;
    std::cin >> n;
    
    for ( unsigned i = 1; n != i; ++i ) {
        galva = iterpti_gale( galva, i );
    }
    
    spausdinti_sarasa( galva );
    
    std::cout << "*******************************"   << std::endl;
    std::cout << "1. Elemento iterpimas i pradzia"   << std::endl;
    std::cout << "-------------------------------"   << std::endl;
    std::cout << "2. Elemento iterpimas i gala"      << std::endl;
    std::cout << "-------------------------------"   << std::endl;
    std::cout << "3. Tiesinio saraso spausdinimas"   << std::endl;
    std::cout << "-------------------------------"   << std::endl;
    std::cout << "4. Pirmojo elemento trinimas"      << std::endl;
    std::cout << "-------------------------------"   << std::endl;
    std::cout << "5. Paskutinio elemento trinimas"   << std::endl;
    std::cout << "-------------------------------"   << std::endl;
    std::cout << "6. Saraso trinimas"                << std::endl;
    std::cout << "*******************************"   << std::endl;
    std::cout << "Pasirinkite funkcija: " ;
    
    unsigned funkcija;
    std::cin >> funkcija;
    
    switch ( funkcija ) {
        case 1: { galva = iterpti_pradzioje( galva, 0 );    break;  }
        case 2: { galva = iterpti_gale( galva, 0 );         break;  }
        case 3: { spausdinti_sarasa( galva );               break;  }
        case 4: { galva = trinti_pirmaji( galva );          break;  }
        case 5: { galva = trinti_paskutiniji( galva );      break;  }
        case 6: { galva = trinti_sarasa( galva );           break;  }
        
        default: { std::cout << "Tokios funkcijos nera." << std::endl; }
    }
    
    spausdinti_sarasa( galva );
}

 

Redaguota , nario [m]

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.


  • Šiame puslapyje naršo:   0 nariai

    Nėra registruotų narių peržiūrinčių šį forumą.

  • eneba
  • eneba
  • eneba



  • SuperGames programele
  • SuperGames programele