razvandragos29 Posted October 20, 2015 Report Share Posted October 20, 2015 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;} Quote Link to comment Share on other sites More sharing options...
u0m3 Posted October 21, 2015 Report Share Posted October 21, 2015 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. Quote Link to comment Share on other sites More sharing options...