Jump to content
razvandragos29

Inserare nod in interiorul unei liste [c]

Recommended Posts

Salut incerc sa inserez un nod intr-o lista simplu inlantuita cu ajutorul unei metode.Am gandit in modul urmator metoda va primi 3 parametri nodul care trebuie inserat, dupa ce valoare trebuie inserat si un pointer care ma va ajuta sa iterez lista.

Am o structura care arata asa

 struct entry
{
int value;
struct entry *next;
};

in main am declarat 4 variabile de tip entry n1, n2, n3, n4 si o variabila care este un pointer catre o structura de tip entry , struct entry *pointer;

In modul urmator am setat ca variabila pointer sa pointeze catre n1 , pointer = &n1 (in acest moment variabila pointer pointeaza catre adresa lui n1).

Dupa am initializat si celelalte variabile in modul urmator.

  n1.value = 100; 
n1.next = &n2;

n2.value = 200;
n2.next = &n3;

n3.value = 300;
n3.next = (struct entry *) 0;

n4.value = 500;

Ca sa introduc nodul am gandit in urmatorul mod :

daca gasesc valoarea cautata de mine atunci :nodul care vreau sa il inserez va avea ca element urmator elementul urmator al actualului nod iar nodul actual va avea ca element urmator nodul introdus de mine.

Nu primesc nici o eroare numai ca nu face acest insert :(

tot codul

 #include <stdio.h> 

struct entry
{
int value;
struct entry *next;

};


void insert (struct entry nod, int match , struct entry *pointer)
{
while (pointer != (struct entry *) 0)
{
if(pointer->value == match)
{
nod.next = pointer->next;
pointer = &nod;
break;
}
pointer = pointer->next;
}

}
int main (void)
{
void insert (struct entry nod, int match , struct entry *pointer);
struct entry n1, n2, n3, n4;
struct entry *pointer;

pointer = &n1;

n1.value = 100;
n1.next = &n2;

n2.value = 200;
n2.next = &n3;

n3.value = 300;
n3.next = (struct entry *) 0;

n4.value = 500;

insert(n4,100, pointer);


printf("----------------------\n");

while (pointer != (struct entry *) 0)
{
printf("%i\n",pointer->value);
pointer = pointer->next;
}

return 0;
}

Link to comment
Share on other sites

Motivul pentru care nu face insertia este ca tu incerci sa schimbi valoarea lui pointer, in loc de valoarea lui pointer->next.

Si inca o problema care este ascunsa momentan: cand pasezi un parametru unei functii, acel parametru este o copie a valorii.

Ceea ce vreau sa spun este ca atunci cand apelezi insert(n4,... in cadrul functiei insert variabila nod va fi o copie de tip struct a variabilei n4. In memomentul in care se executa pointer->next = &nod; valoarea din pointer->next va fi adresa lui nod din cadrul functiei insert.

Cand vei itera peste lista, vei fi in afara functiei insert, deci variabila nod nu mai exista, si vei citi o zona de memorie nealocata (oarecum). Programul va avea comportament nedefinit.

Ca atare functia insert ar trebui sa arate cam asa:

void insert (struct entry *nod, int match , struct entry *pointer)
{
while (pointer != (struct entry *) 0)
{
if(pointer->value == match)
{
nod->next = pointer->next;
pointer->next = nod;
break;
}
pointer = pointer->next;
}

}

iar apelarea se face asa

 insert(&n4, 100, pointer);

Si inca o mentiune, nu ai ruta pentru cazul in care nu gasesti valoarea.

Sper ca am explicat cat de cat inteligibil.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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



×
×
  • Create New...