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.

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