Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct nod { // definire lista
- struct nod* urm; // prima inlantuire
- int id;// elemente lista
- }nod;
- struct nod* AddSorted(struct nod* head, struct nod* p) {// functia de adaugare sortata
- struct nod* q = head;// nod folosit pentru parcurgea listei
- if (head == NULL) // (!head) verificam daca sunt elemente in lista
- {
- head = p;// daca nu sunt capul listel devine noul element
- }
- else if (head->id > p->id) { // verificam daca elementul adaugat trebuie adaugat in capul listei
- p->urm = head; //elementul aduaugat va avea in pareta dreapta lista existenta
- head = p; // noul element va devieni capatul(radidacian listi)
- }
- else {
- while (q->urm != NULL && q->urm->id < p->id) { // parcurgem lista ca sa gasim pozitia de inserare
- q = q->urm;// parcurgere lista
- }
- p->urm = q->urm;// elementu nou va avea in dreapta ce avea poztia la care s-a gasit inserarea
- q->urm = p;
- }
- return head;
- }
- struct nod* Remove(struct nod* head, int id) { //sterge nod
- struct nod* aux = NULL, * q = NULL;// nodul aux este pentreu retinire tempara nod sters, q este folosit pentru parcurgere
- if (head == NULL) {// verificam daca capul este null altfel return null ca si adresa
- return NULL;
- }
- else if (head->id == id) {// verificam daca este capul listei nodul sters
- aux = head;// salvam temporar nodul
- head = head->urm;// capul devine umaatorul element
- return aux;// returnam adresa nodul pe care vrem sa-l stergem in caz ce se vrea prelucat ceva dupa
- }
- else {
- q = head;// daca nu e la inceput parcurgem lista
- while (q->urm != NULL && q->urm->id != id) {// ca la adaugarea sorata cautam pozita anterioara nodul pe care vrem sa-l stergem
- q = q->urm;// parcurgem lista
- }
- if (q->urm == NULL) {// daca s-a ajuns la sfarsitul listei si nu s-a gasit
- return NULL;// returnam null deoarece nodul nu se afla in lista
- }
- else {
- aux = q->urm;// altfel salvam nodul urmator(nodul ce trebuie stres)
- q->urm = q->urm->urm;// nodul anterior va pointa catre nodul din dtreapa celui sters
- return aux;// returnam nodul pe care vrem sa-l stergem
- }
- }
- }// atentie aici am refacut legaturile, memoria va ramane alocata pana se foloseste free()
- void Show(struct nod* head) {// toat functiile le am implementat sa primeasca head deaorece e mai ok asa
- struct nod* p = head;// ne punem pe capul listei
- while (p != NULL) {// cat timp nu s-a ajuns la sfarsitul fiserului
- printf("%d ", p->id);// afisam id
- p = p->urm;// parcurgem lista
- }
- }
- int main()
- {
- int v[] = { 4, 1, 5, 8, 3, 0 }, n = sizeof(v) / 4;// initialziam mai usor lementele listei
- int i;
- struct nod* p = NULL;// nodul nou adaugat
- struct nod* head = NULL;// capul listei
- for (i = 0; i < n; i++) {// facem un for pentru a adauga mai usor elementele exemplu
- p = (nod*)malloc(sizeof(struct nod));// alocam memorie penteu fiecare element si salvam temprorar in p adresa returnata de malloc
- p->id = v[i];// atrbuim valoareaa
- p->urm = NULL;// mereu sa intializati nodurile cu NULL
- head = AddSorted(head, p);//Apelam functia de sortare - sa folositi mereu & pentru ca apar probleme
- }
- printf("Lista simplu inlantuita - Adaugare sortata: "); Show(head);// afisam
- p = Remove(&head, 3);// apelam functia de sorate care returneaza adresa nodul de sters
- free(p);// aici eliberam memoria alocata.
- printf("\nDupa eliminarea elemtului 3: "); Show(head);
- p = Remove(&head, 8);
- free(p);
- printf("\nDupa eliminarea elemtului 8: "); Show(head);
- p = Remove(&head, 0);
- free(p);
- printf("\nDupa eliminarea elemtului 0: "); Show(head);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement