Informatică, întrebare adresată de sikesjack1, 8 ani în urmă

Buna! Am rezolvat problema #3801 LsiInterclasare de pe pbinfo:

Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:

struct Nod
{
int info;
Nod *leg;
};
Câmpul info memorează un număr întreg, iar câmpul leg memorează adresa următorului element al listei.

Cerinţa
Se dau două liste în care informațiile sunt ordonate crescător. Adresele celor două liste sunt memorate în pointerii h1 și h2. Să se scrie o funcție C++ cu următorul antet:

void LsiInterclasare(Nod *h1, Nod *h2, Nod *&h)
care interclasează nodurile într-o nouă listă de adresă h și care are de asemenea informațiile ordonate crescător. Atenție la faptul că nu puteți să ștergeți și să creați noi noduri, ci numai să schimbați legăturile nodurilor. Dacă există noduri de informație identică în ambele liste, mai întâi se va depune în h nodul din h1.

Restricţii şi precizări
cele două liste inițiale conțin fiecare cel puțin un nod
la ieșirea din apel h va memora adresa primului element al listei interclasate



Exemplu
Dacă h1 = 2,7,7,10,20 și h2 = 1,1,7,9,20,25,30, atunci după apelul funcției h = 1,1,2,7,7,7,10,20,25,30. Rețineți că mai întâi s-au depus în h nodurile de informație 7 din prima listă, apoi din a doua.

Important
Soluţia propusă va conţine definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.,

Dar din vreun motiv am deseu de memorie la primul nod, nu stiu care este problema, pe evaluare imi da eroare, m-ati putea ajuta?
AIci e codul meu:


#include
#include
using namespace std;
struct Nod
{
int info;
Nod* leg;
};
Nod* create()
{
Nod* tmp = new Nod;
tmp->leg = NULL;
return tmp;
}
void insert_front(Nod** head, int x)
{
Nod* new_node = new Nod;
new_node->info = x;
new_node->leg = NULL;
new_node->leg = *head;
*head = new_node;
}
void forward_print(Nod* head)
{
Nod* tmp = head;
cout << "List elements: \n";
while (tmp->leg!= NULL)
{
cout << tmp->info << " ";
tmp = tmp->leg;
}
cout << endl;
}
void LsiInterclasare(Nod* h1, Nod* h2, Nod*& h)
{

while ((h1->leg != NULL) && (h2->leg != NULL))

{
if (h1->info <= h2->info)
{
insert_front(&h, h1->info);
}
else if(h1->info==h2->info)
{
insert_front(&h, h1->info);
}
else
{
insert_front(&h, h2->info);
}
h1 = h1->leg;
h2 = h2->leg;
}
if (h1->leg != NULL)
{
while (h1->leg != NULL)
{
insert_front(&h, h1->info);
h1 = h1->leg;
}
}
if (h2->leg != NULL)
{
while (h2->leg != NULL)
{
insert_front(&h, h2->info);
h2 = h2->leg;
}
}
}
void insert_rear(Nod** head, int x)
{
Nod* new_node = new Nod;
new_node->info = x;
new_node->leg=NULL;
Nod* tmp = *head;
if (tmp == NULL)
{
*head = new_node;
}
else
{
while (tmp->leg != NULL)
{
tmp = tmp->leg;
}
new_node->leg = tmp->leg;
tmp->leg = new_node;
}

}
int main()
{
Nod* h1=create(), * h2=create();
int n1, n2;
/*
cout << "n1=";
cin >> n1;
cout << "n2=";
cin >> n2;
*/
int a1[] = { 2,7,7,10,20 };
int a2[] = { 1,1,7,9,20,25,30 };

cout << endl;
for (int i = 0; i <= 5; i++)
{
insert_rear(&h1, a1[i]);
}

for (int i = 0; i <= 7; i++)
{
insert_rear(&h2, a2[i]);
}
forward_print(h1);
forward_print(h2);
Nod* h = create();
LsiInterclasare(h1,h2,h);
forward_print(h);

}

Mersii!


nadoleanuanamaria217: unde este întrebarea?

Răspunsuri la întrebare

Răspuns de andrei750238
5

Salut ! Nu pot sa imi dau seama ce e gresit la solutia ta dar am gasit o alta rezolvare a problemei #3801 :

void LsiInterclasare(Nod *h1, Nod *h2, Nod *&h){

Nod *aux;

if(h1->info<=h2->info){

 aux=h1;

       h=aux;

       h1 = h1->leg;

}

else {

 aux=h2;

       h=aux;

       h2=h2->leg;

}

while(h1&&h2){

 if(h1->info<=h2->info){

  aux->leg=h1;

           aux=h1;

           h1=h1->leg;

 }

 else{

  aux->leg=h2;

           aux=h2;

           h2=h2->leg;

 }

   }

while(h1){

 aux->leg=h1;

       aux=h1;

       h1=h1->leg;

}

while(h2){

 aux->leg=h2;

       aux=h2;

       h2=h2->leg;

}

}

Alte întrebări interesante