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

pbinfo problema #3783 FStergeAfterQ

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

struct nod{
int info;
nod * ant,*urm;
};
în care câmpul info memorează un număr întreg, câmpul ant memorează adresa elementului anterior al listei, iar campul urm memorează adresa elementului următor al listei.

Cerința

Să se scrie o funcție C++ cu următorul prototip:
void StergeAfterQ(nod*&prim,nod*&ultim, nod*q);
care sterge nodul de dupa nodul de adresa q al listei pentru care primul element are adresa memorată în pointerul prim si ultimul element are adresa memorata in pointerul ultim.

Restricții și precizări

- numele funcției va fi StergeAfterQ;
- pointerul q poate fi prim si ultim;
- dacă lista nu conține niciun element, pointerul prim si ultim va avea valoarea NULL;
în toate cazurile, la ieșirea din apel prim va memora adresa primului element al listei, iar ultim va memora adresa ultimului element al listei.

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.

Aceasta este solutia mea de 80 puncte, nu stiu ce caz am mai uitat.
void StergeAfterQ(nod*&prim,nod*&ultim, nod*q)
{
nod *e,*f,*g;
f=q->urm;
if(q==ultim)
{
g=q->ant;
g->urm=NULL;
ultim=g;
free(q);
}
else
{
g=f->urm;
f->ant=NULL;
q->urm=g;
g->ant=q;
free(f);
}
}


andrei750238: Ce se întâmplă daca in lista ai un singur nod si il stergi ? Din ce vad cred ca nu te-ai gândit la acest caz.
antoniopacica: void StergeAfterQ(nod*&prim,nod*&ultim, nod*q)
{
nod *f,*g;
f=q->urm;
if(prim==q && ultim==q)
{
free(q);
prim=ultim=NULL;
}
else if(q==ultim)
{
g=ultim->ant;
g->urm=NULL;
ultim=g;
free(q);
}
else
{
g=f->urm;
q->urm=g;
g->ant=q;
free(f);
}
}
antoniopacica: Gata. Am pus cazul acesta la inceput: if(prim==q && ultim==q)
{
free(q);
prim=ultim=NULL;
}
antoniopacica: Dar tot 80 puncte imi da

Răspunsuri la întrebare

Răspuns de Addriss
1

Răspuns:

void StergereDupaQ(nod*& prim, nod*& ultim, nod* q)

{

// depinde cum e alocata memoria, daca e alocata cu new, stergi cu delete (ca aici), daca e cu malloc, eliberezi cu free();

nod* toBeDeletedNode = q->urm;

if (toBeDeletedNode == prim)

{

 prim = prim->urm;

 delete toBeDeletedNode;

 toBeDeletedNode = nullptr;

}

else if (toBeDeletedNode == ultim)

{

 ultim = ultim->ant;

 delete toBeDeletedNode;

 toBeDeletedNode = nullptr;

}

else

{

 q->urm = toBeDeletedNode->urm;

 toBeDeletedNode->ant = q;

 delete toBeDeletedNode;

 toBeDeletedNode = nullptr;

}

}

Explicație:


antoniopacica: Da, exact pe aceeasi idee am facut si eu, dar cu algoritmul tau tot 80 puncte am luat si zice la un caz Caught fatal signal 11. Am incercat sa mai modific ceva la algoritmul tau, dar degeaba tot 80 puncte. Singura idee ar fi sa mai incerc cu while dar probabil o sa depasesc limita de timp.
antoniopacica: Am incercat si cu while, dar e acelasi lucru. Cred ca ma dau batut si poate incerc să fac la clasă problema, dar in rest eu zic ca asta ar fi rezolvarea. Oricum multumesc amandurora pentru sfaturi. ❤
antoniopacica: Daca mai aveti ceva idei, puteti sa imi spuneti.
Addriss: N-ar avea de ce sa se imbunatateasca algoritmul cu un while, ca aia e o structura repetitiva ce automat iti creste complexitatea la O(n). Si-n plus nu ai avea nevoie de un while.

Cat despre eroarea aia cu signal 11 nu stiu ce reprezinta, posibil sa-mi fi scapat ceva cand am scris code-ul ca nu l-am testat.
antoniopacica: Scrie aici ce inseamna eroarea cu signal 11: https://www.pbinfo.ro/ajutor/11/ce-inseamna-killed-by-signal-11-caught-fatal-signal-11-stopped-by-signal-11
Alte întrebări interesante