Pereiti prie turinio

Dvipusis sarasas


Rekomenduojami pranešimai

Yra programa su dvipusiu sąrašu. Niekaip neišeina parašyti funkcijos (get) kuri pašalintų iš sąrašo paskutinį elementa.

 

Programos kodas:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <climits>
#include <fstream>
using namespace std;
  struct dvipelem {
                struct dvipelem *priekin;
                int duom;
                struct dvipelem *atgal;
                };
struct dvipelem *elem, *elemk;

void Sukurti_dvipsar (struct dvipelem**, struct dvipelem**);
void Iterpti_elem (struct dvipelem**, struct dvipelem**);
void Spausdinti (struct dvipelem*);
void Naikinti_dvipsar (struct dvipelem**, struct dvipelem**);
void get (struct dvipelem**, struct dvipelem**);
void printMenu ();

int main()
  {
  struct dvipelem *pr, *pab, *elem, *elemk;

   for (;;) {
       cout << "\n----------------------------------------\n";
       cout << "(m - rodyti meniu) > ";
       string command;
       cin >> command;
            if (command == "0") return 0;
       else if (command == "m") printMenu      ();
       else if (command == "1") Sukurti_dvipsar (&pr , &pab);
       else if (command == "2") Iterpti_elem (&pr, &pab);
       else if (command == "3") Spausdinti (pr);
       else if (command == "4") Naikinti_dvipsar (&pr, &pab);
       else if (command == "5") get (&pr, &pab);
       else cout << endl << "Neteisinga komanda..." << endl;  
   }
}

void printMenu () {
   cout << endl
        << "Video nuoma:"   << endl
        << "  1 - sukurti dvikrypti sarasa"     << endl
        << "  2 - itertpti elementa       "     << endl
        << "  3 - spauzdinti              "     << endl
        << "  4 - Naikinti                "     << endl
        << "  5 - Get                     "     << endl
        << endl
        << "  0 - baigti darba"   << endl;
}

void Sukurti_dvipsar (struct dvipelem**pradzia, struct dvipelem**pabaiga){
  struct dvipelem *g;
  int reiksme;
  cout << "Kuriame dvipusi sarasa. Iveskite sveikus skaicius. Noredami baigti, iveskite 0.";
  *pradzia = NULL;
  *pabaiga = NULL;
  scanf("%d", &reiksme);
  while(reiksme != 0)
     {
     if (*pradzia == NULL)
        {
        g = (struct dvipelem *) malloc(sizeof(struct dvipelem));
        g->duom = reiksme;
        g->priekin = NULL;
        g->atgal = NULL;
        *pradzia = g;
        *pabaiga = g;
        }
     else
        {
        g = (struct dvipelem *) malloc(sizeof(struct dvipelem));
        g->duom = reiksme;
        g->priekin = NULL;
        g->atgal = *pabaiga;
        (*pabaiga)->priekin = g;
        *pabaiga= g;
        }
     scanf("%d", &reiksme);
  }
  cout << "Sarasas sekmingai sukurtas!";
}

void Iterpti_elem (struct dvipelem * *pradzia, struct dvipelem * *pabaiga){
  int i,k,y;
  elemk = *pradzia;
  printf("Iveskite sveikaji elemento numeri, pries kuri bus iterptas naujas elementas:\n");
  scanf("%d", &k);
  if (k == 1)
     {
     printf("Iveskite sveikaji skaiciu, kuris bus iterptas i sarasa:\n");
     scanf("%d", &y);
     elem = (struct dvipelem*) malloc(sizeof(struct dvipelem));
     elem->duom = y;
     elem->atgal = NULL;
     elemk->atgal = elem;
     elem->priekin = elemk;
     *pradzia = elem;
     printf("Elementas sekmingai iterptas!\n");
     }
  else
     { 
     i = 1;
     while (i<k && elemk != NULL)
        {
        elemk = elemk->priekin;
        i++;
        }
     if(i == k) 
        {
        printf("Rodykle nukreipta i %d-aji elementa.\n", k);
        printf("Iveskite sveikaji skaiciu, kuris bus iterptas i sarasa:\n");
        scanf("%d", &y);
        elem = (struct dvipelem*) malloc(sizeof(struct dvipelem));
        elem->duom = y;
        elem->atgal = elemk->atgal;
        elemk->atgal->priekin = elem;
        elem->priekin = elemk;
        elemk->atgal = elem;
        printf("Elementas sekmingai iterptas!\n");
        }
     else
        printf("Sarase yra maziau nei %d elementu.\n", k);
     }
}

void Spausdinti (struct dvipelem *s){
  int i=1;
  cout << "Spausdiname sarasa:";
  while (s != NULL)
     {
     printf("%d ", s->duom);
     s = s->priekin;
     i++;
     }
}

void Naikinti_dvipsar (struct dvipelem * *pradzia, struct dvipelem * *pabaiga){
  struct dvipelem *s;
  cout << "\nNaikiname sarasa nuo pabaigos.";
  while (*pradzia != NULL)
     {
     s = *pradzia;
     if (*pabaiga != *pradzia)
        {
        while (s->priekin != *pabaiga)
           s = s->priekin;
        *pabaiga = s;
        printf("Naikiname: %d\n", s->priekin->duom);
        free (s->priekin);
        }
     else
        {
        printf("Naikiname pirma: %d. \n", s->duom);
        free (s);
        *pradzia = NULL;
        *pabaiga = NULL;
        }
     }
  cout << "Sarasas istrintas!\n";
}      

void get (struct dvipelem * *pradzia, struct dvipelem * *pabaiga){
  struct dvipelem *s;
  s = s->priekin;
  *pabaiga = s;
  free (s->priekin);
  delete s;
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Yra programa su dvipusiu sąrašu. Niekaip neišeina parašyti funkcijos (get) kuri pašalintų iš sąrašo paskutinį elementa.

...

 

 

Man teko daryt circular linked list'ą, tai prisegu projektą.

Pasinagrinėk, nes nedaug kuo skirias linked list nuo circular.

list.rar

Redagavo MantasP
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Šitoje funkcijoje susirandu paskutinį sąrašo elementą, jį pašalinu. Tada turėčiau priešpaskutinio elemento rodyklę į sekantį elementą priskirti NULL, nes sekančio elemento nėra. Niekaip neišeina to padaryti.

 

void get (struct dvipelem * *pradzia, struct dvipelem * *pabaiga){
  struct dvipelem *s;
  s = *pradzia;
     if (*pabaiga != *pradzia)
        {
        while (s->priekin != *pabaiga)
            s = s->priekin;
        *pabaiga = s;
        printf("Naikiname: %d\n", s->priekin->duom);
        delete s;
        s->priekin = NULL;
       }
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

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

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...