Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

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


Ewal'

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1767 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

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'
Nuoroda į komentarą
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
Nuoroda į komentarą
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]
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1767 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

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ų

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

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

Skelbimai


×
×
  • Sukurti naują...