Advertisement
Alx09

S9 SDA - liste simplu inlantuite

Apr 15th, 2024 (edited)
720
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct nod { // definire lista
  6.     struct nod* urm; // prima inlantuire
  7.     int id;// elemente lista
  8. }nod;
  9.  
  10.  
  11. struct nod* AddSorted(struct nod* head, struct nod* p) {// functia de adaugare sortata
  12.     struct nod* q = head;// nod folosit pentru parcurgea listei
  13.     if (head == NULL) // (!head) verificam daca sunt elemente in lista
  14.     {
  15.         head = p;// daca nu sunt capul listel devine noul element
  16.     }
  17.     else if (head->id > p->id) { // verificam daca elementul adaugat trebuie adaugat in capul listei
  18.         p->urm = head; //elementul aduaugat va avea in pareta dreapta lista existenta
  19.         head = p; // noul element va devieni capatul(radidacian listi)
  20.     }
  21.     else {
  22.         while (q->urm != NULL && q->urm->id < p->id) { // parcurgem lista ca sa gasim pozitia de inserare
  23.             q = q->urm;// parcurgere lista
  24.         }
  25.         p->urm = q->urm;// elementu nou va avea in dreapta ce avea poztia la care s-a gasit inserarea
  26.         q->urm = p;
  27.     }
  28.     return head;
  29. }
  30. struct nod* Remove(struct nod* head, int id) { //sterge nod
  31.     struct nod* aux = NULL, * q = NULL;// nodul aux este pentreu retinire tempara nod sters, q este folosit pentru parcurgere
  32.     if (head == NULL) {// verificam daca capul este null altfel return null ca si adresa
  33.         return NULL;
  34.     }
  35.     else if (head->id == id) {// verificam daca este capul listei nodul sters
  36.         aux = head;// salvam temporar nodul
  37.         head = head->urm;// capul devine umaatorul element
  38.         return aux;// returnam adresa nodul pe care vrem sa-l stergem in caz ce se vrea prelucat ceva dupa
  39.     }
  40.     else {
  41.         q = head;// daca nu e la inceput parcurgem lista
  42.         while (q->urm != NULL && q->urm->id != id) {// ca la adaugarea sorata cautam pozita anterioara nodul pe care vrem sa-l stergem
  43.             q = q->urm;// parcurgem lista
  44.         }
  45.         if (q->urm == NULL) {// daca s-a ajuns la sfarsitul listei si nu s-a gasit
  46.             return NULL;// returnam null deoarece nodul nu se afla in lista
  47.         }
  48.         else {
  49.             aux = q->urm;// altfel salvam nodul urmator(nodul ce trebuie stres)
  50.             q->urm = q->urm->urm;// nodul anterior va pointa catre nodul din dtreapa celui sters
  51.             return aux;// returnam nodul pe care vrem sa-l stergem
  52.         }
  53.     }
  54. }// atentie aici am refacut legaturile, memoria va ramane alocata pana se foloseste free()
  55.  
  56.  
  57. void Show(struct nod* head) {// toat functiile le am implementat sa primeasca head deaorece e mai ok asa
  58.     struct nod* p = head;// ne punem pe capul listei
  59.  
  60.     while (p != NULL) {// cat timp nu s-a ajuns la sfarsitul fiserului
  61.         printf("%d ", p->id);// afisam id
  62.         p = p->urm;// parcurgem lista
  63.     }
  64. }
  65.  
  66.  
  67. int main()
  68. {
  69.     int v[] = { 4, 1, 5, 8, 3, 0 }, n = sizeof(v) / 4;// initialziam mai usor lementele listei
  70.  
  71.     int i;
  72.     struct nod* p = NULL;// nodul nou adaugat
  73.     struct nod* head = NULL;// capul listei
  74.     for (i = 0; i < n; i++) {// facem un for pentru a adauga mai usor elementele exemplu
  75.         p = (nod*)malloc(sizeof(struct nod));// alocam memorie penteu fiecare element si salvam temprorar in p adresa returnata de malloc
  76.         p->id = v[i];// atrbuim valoareaa
  77.         p->urm = NULL;// mereu sa intializati nodurile cu NULL
  78.         head = AddSorted(head, p);//Apelam functia de sortare - sa folositi mereu & pentru ca apar probleme
  79.     }
  80.     printf("Lista simplu inlantuita - Adaugare sortata: ");  Show(head);// afisam
  81.     p = Remove(&head, 3);// apelam functia de sorate care returneaza adresa nodul de sters
  82.     free(p);// aici eliberam memoria alocata.
  83.     printf("\nDupa eliminarea elemtului 3: ");  Show(head);
  84.     p = Remove(&head, 8);
  85.     free(p);
  86.     printf("\nDupa eliminarea elemtului 8: ");  Show(head);
  87.     p = Remove(&head, 0);
  88.     free(p);
  89.     printf("\nDupa eliminarea elemtului 0: ");  Show(head);
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement