Pereiti prie turinio

C medis, dvikryptis sarasas realizuojant kaip deka.


Rekomenduojami pranešimai

Sveiki, reikalinga pagalba padėkit viena vietą pakeisti.

 

sarasas perkelti(MedisPtr MusuMedis, sarasas pradzia)
{
    if (MusuMedis != NULL)
    {
       pradzia = perkelti(MusuMedis->kaire, pradzia);
               vienkryp *pag; // saraso rodykle
               pag = new vienkryp; // sukuriamas naujas sarasas
               pag->kitas = pradzia; // pridedama nauja reiksme priekyje
               pradzia = pag;
       pag->skaicius = MusuMedis->skaicius;
       pradzia = perkelti(MusuMedis->desine, pradzia);
    }
        return pradzia;
}

void spausdintiVienkrypt(sarasas pradzia)
{
   while(pradzia!=NULL)
   {
               printf("%3d", pradzia->skaicius);
               pradzia=pradzia->kitas;
   }
}

Va kodas gabalas kur yra realizuojamas vienkryptis. Man reikia pakeisti jį į dvikrypti ir realizuoti kaip deka, kas galėtu patarti kaip tą padaryti? :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

O tai "sarasas" yra tas pats, kas ir "vienkryp*" ? Jei taip, tuomet uzteks vienos eilutes

 

pag = new vienkryp; // sukuriamas naujas sarasas
pag->kitas = pradzia; // pridedama nauja reiksme priekyje
pradzia->atgal = pag;
pradzia = pag;

 

... o kas tas "dekas" ?

 

Sveiki, reikalinga pagalba padėkit viena vietą pakeisti.

 

sarasas perkelti(MedisPtr MusuMedis, sarasas pradzia)
{
    if (MusuMedis != NULL)
    {
       pradzia = perkelti(MusuMedis->kaire, pradzia);
               vienkryp *pag; // saraso rodykle
               pag = new vienkryp; // sukuriamas naujas sarasas
               pag->kitas = pradzia; // pridedama nauja reiksme priekyje
               pradzia = pag;
       pag->skaicius = MusuMedis->skaicius;
       pradzia = perkelti(MusuMedis->desine, pradzia);
    }
        return pradzia;
}

void spausdintiVienkrypt(sarasas pradzia)
{
   while(pradzia!=NULL)
   {
               printf("%3d", pradzia->skaicius);
               pradzia=pradzia->kitas;
   }
}

Va kodas gabalas kur yra realizuojamas vienkryptis. Man reikia pakeisti jį į dvikrypti ir realizuoti kaip deka, kas galėtu patarti kaip tą padaryti? :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dekas (angl. Deque) yra tokia duomenų strukūra, į kurią elementai įrašomi arba iš kurios šalinami viename ir kitame gale.

 

Įrašyti į pradžią

Irašyti į galą

Pašalinti iš pradžios

Pašalinti iš galo

 

.. ir kur tau ta deka reikia realizuoti? Naujas funkcijas pasirasyt, ar toje "perkelti" ?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nelabai teisingai supranti. Dekas yra platesne savoka nei dvk. sarasas. Todel tik dekas gali buti realizuotas kaip dvk. sarasas, bet ne atvirksciai.

Zodziu, dekas turi dvk. sarasa kaip duomenu laikymo struktura, o toliau pridedi funkcijas kad prideti ir atimti elementus is pradzios ir galo. Logika paprasta, pradzia ir gala gali saugotis, arba gali kiekviena karta susirast is bet kurio saraso elemento, kadangi ieskot gali i abi kryptis. Pridejima jau turi funkcijoj "perkelti", o ismetimas dar paprastesnis

 

// jei pradzioj
pag = pradzia;
if (pag->kitas != NULL) pag->kitas->atgal = NULL;
delete pag;
// jei gale
pag = galas;
if (pag->atgal != NULL) pag->atgal->kitas = NULL;
delete pag;

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki, iškylo problema turiu deka. va kodas



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct el{
      int duom;
      struct el *kitas;
      struct el *pries ;
      };
void deko_sukurimas (struct el**, struct el**);  
void ar_tuscias (struct el*);  
void el_iterpimas_pradzia (struct el**, struct el**); 
void el_ziurejimas (struct el*);
void naikinimas_pradzioje (struct el**, struct el**);
void el_iterpimas_pabaiga (struct el**, struct el**);
void naikinimas_pabaigoje (struct el**, struct el**);
void gauti_pradzios_el (struct el* );
void gauti_pabaigos_el (struct el*);
void el_skaicius (struct el*);
void sunaikinti_deka (struct el**, struct el**);

int main()
{
 int x, q;

 struct el *pradzia, *pabaiga;
 q=0;
 pradzia = NULL;
 pabaiga = NULL;

 while (q != 1)
    {
     system("cls");
     printf("MENIU:\n");
     printf("0-Sukurti tuscia deka.\n");
     printf("1-Patikrinti ar dekas tuscias.\n");
     printf("2-Iterpti naujus duomenis (nauja elementa) i deko pradzia.\n");
     printf("3-Panaikinti elementa deko pradzioje.\n");
     printf("4-Iterpti naujus duomenis (nauja elementa) i deko pabaiga.\n");
     printf("5-Panaikinti elementa deko pabaigoje.\n");
     printf("6-Gauti deko pradzios elemento duomenis, neisimant jo is deko.\n");
     printf("7-Gauti deko pabaigos elemento duomenis, neisimant jo is deko.\n");
     printf("8-Gauti deko elementu skaiciu.\n");
     printf("9-Sunaikinti deka.\n");
     printf("10-Paziureti deko elementus.\n");
     printf("11-Iseiti is programos.\n");
     scanf("%d", &x);
     system("cls");
     switch (x)
   {
     case 0: deko_sukurimas(&pradzia, &pabaiga);break;
  case 1: ar_tuscias(pradzia);break;
  case 2: el_iterpimas_pradzia(&pradzia, &pabaiga);break;
  case 3: naikinimas_pradzioje(&pradzia, &pabaiga);break;
  case 4: el_iterpimas_pabaiga(&pradzia, &pabaiga);break;
  case 5: naikinimas_pabaigoje(&pradzia, &pabaiga);break;
  case 6: gauti_pradzios_el(pradzia);break;
  case 7: gauti_pabaigos_el(pabaiga);break;
  case 8: el_skaicius(pradzia);break;
  case 9: sunaikinti_deka(&pradzia, &pabaiga);break;
  case 10: el_ziurejimas(pradzia);break;
     case 11: q=1;break;
}

    }
}


/*-------------------------------------------*/

void deko_sukurimas(struct el * *pr, struct el * *pab)
{
   *pr = NULL;
   *pab = NULL;
   printf("Tuscias dekas sukurtas.");  
   getch();
}
/*-------------------------------------------*/

void ar_tuscias(struct el *pradzia)
{
    if (pradzia == NULL)
       printf("Dekas tuscias.\n");
    else
       printf("Dekas netuscias.\n");
       getch();
}

/*-------------------------------------------*/

void el_iterpimas_pradzia(struct el * *pr, struct el * *pab)
{
    struct el *g;
    int x, i, s;

    printf("Kiek elementu bus irasoma i deko pradzia?\n");
    scanf("%d", &x);
    system("cls");
    printf("Iveskite sveikus skaicius.\n");
    for (i=1; i <= x; i++ )
      {
 printf("Iveskite %d-aji skaiciu.\n", i);
 scanf("%d", &s);

 if ( *pr == NULL)
    {
      g = (struct el *) malloc(sizeof(struct el));
      g -> duom = s;
      g -> kitas = NULL;
      g -> pries = NULL;
      *pr = g;
      *pab =g;
    }
 else
    {
      g = (struct el *) malloc(sizeof(struct el));
      g -> duom = s;
      g -> kitas = *pr;
      (*pr) -> pries = g;
      g -> pries = NULL;
      *pr = g;
    }
      }


}

/*-------------------------------------------*/

void el_ziurejimas(struct el  *pr)
{
   if ( pr == NULL)
      printf("Dekas tuscias.\n");
   else
      while (pr != NULL)
  {
    printf("%d\n", pr -> duom);
    pr = pr -> kitas;
  }
   getch();
}

/*-------------------------------------------*/

void naikinimas_pradzioje(struct el * *pr, struct el * *pab)
{
  struct el *g;
  if (*pr == NULL)
     {
printf("Dekas yra tuscias.\n");
getch();
   return;
   }

  g = *pr;
  if ( g -> kitas != NULL)
     {
printf("Panaikintas elemntas %d is deko pradzios.\n", g -> duom);
g = g -> kitas;
g -> pries = NULL;
free ( *pr );
*pr = g;
     }
  else
     {
printf("Panaikintas elemntas %d is deko pradzios.\n", g -> duom);
free ( *pr );
*pr = NULL;
*pab = NULL;
     }
   getch();
}

/*-------------------------------------------*/

void el_iterpimas_pabaiga(struct el * *pr, struct el * *pab)
{
  struct el *g;
  int x, i, s;

  printf("Kiek elemntu talpinsi i deko pabaiga?\n");
  scanf("%d", &x);
  system("cls");
  printf("Iveskite sveikus skaicius.\n");

  for (i=1; i<=x; i++)
     {
printf("Iveskite %d-atji skaiciu.\n", i);
scanf("%d", &s);

if (*pr == NULL)
   {
     g = (struct el *) malloc(sizeof(struct el));
     g -> duom = s;
     g -> kitas = NULL;
     g -> pries = NULL;
     *pr = g;
     *pab = g;
   }
else
   {
     g = (struct el *) malloc(sizeof(struct el));
     g -> duom = s;
     g -> kitas = NULL;
     g -> pries = *pab;
     (*pab) -> kitas = g;
     *pab = g;
   }
     }
}


/*-------------------------------------------*/

void naikinimas_pabaigoje(struct el * *pr, struct el * *pab)
 {
   struct el *g;
  if (*pab == NULL)
     {
printf("Dekas yra tuscias.\n");
getch();
   return;
     } 

      g = *pab;
  if ( g -> pries != NULL)
     {
printf("Panaikintas elemntas %d is deko pabaigos.\n", g -> duom);
g = g -> pries;
g -> kitas = NULL;
free ( *pab );
*pab = g;
     }
  else
     {
printf("Panaikintas elemntas %d is deko pabaigos.\n", g -> duom);
free ( *pab );
*pr = NULL;
*pab = NULL;
     }
   getch();
}
/*-------------------------------------------*/

void gauti_pradzios_el(struct el *pr)
 {
   struct el *g;
   g = pr;

   if (g == NULL)
      printf("Dekas tuscias.\n");
   else
     {
printf("Pirmas deko elementas: %d\n", g -> duom);
     }
   getch();
 }

/*-------------------------------------------*/

void gauti_pabaigos_el(struct el *pab)
 {
    struct el *g;
    g = pab;

    if (g ==NULL)
printf("Delas tuscias.\n");
    else
      {
 printf("Paskutinis deko elementas: %d", g -> duom);
      }
    getch();
 }

/*-------------------------------------------*/

void el_skaicius(struct el *pr)
 {
   struct el *g;
   int i;
   g = pr;

   if (g == NULL)
      i = 0;
   else
      {
  i = 1;
  while (g -> kitas != NULL)
     {
	i++;
	g = g -> kitas;
     }
}
   printf("Elementu skaicius: %d\n", i);
   getch();
 }

/*-------------------------------------------*/

void sunaikinti_deka(struct el * *pr, struct el * *pab)
 {
     struct el *g;

     if (*pr == NULL)
 printf("Dekas buvo tuscias.\n");

   while (*pr != NULL)
 {
     g = *pab;
  if ( g -> pries != NULL)
     {
printf("Panaikintas elemntas %d .\n", g -> duom);
g = g -> pries;
g -> kitas = NULL;
free ( *pab );
*pab = g;
     }
  else
     {
printf("Panaikintas elemntas %d .\n", g -> duom);
free ( *pab );
*pr = NULL;
*pab = NULL;
     }

}
   getch();
 }

/*-------------------------------------------*/



su juo viskas gerai, tesiog gal galit paatarti kaip rasti mažiau skaičių ir jį iterpti į vidurį? :)

Redagavo Domius
Nuoroda į pranešimą
Dalintis kituose puslapiuose
su juo viskas gerai, tesiog gal galit paatarti kaip rasti mažiau skaičių ir jį iterpti į vidurį?

 

Na kad rasti maziausia skaiciu, tai tiesiog eini per deka nuo pradzios i gala, ir ziuri kuris skaicius maziausias.

 

algoritmas:

 

min = max_type_value;
while (deque_ele != null)
{
   if (deque_ele.duom < min)
      min = deque_ele.duom;
   deque_ele = deque_ele->kitas;
}

 

Kad iterpt i viduri - argi tai nepazeidzia deko specifikos, kad prideti galima tik pradzioj ir gale? Jei vistiek to reikia, nu tai susirandi kieki elementu deke (turi jau ta funkcija), dalini skaiciu is 2, tada is naujo atsiskaiciuoji ta puse elementu ir darai pridejima (toki pati kaip ir kad i pradzia, bet updatini abu laukus "pries" ir "kitas").

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ą...