100 likes | 237 Vues
Programare in limbajul C – Cursul 16 Structuri de date înlănţuite Prof. univ. dr. Constantin Popescu. Agenda. E xemplu este o listă simplu-înlănţuită Structuri de date înlănţuite Adaugarea unui nod nou in lista Exemplu. E xemplu este o listă simplu-înlănţuită.
E N D
Programare in limbajul C – Cursul 16Structuri de date înlănţuiteProf. univ. dr. Constantin Popescu
Agenda • Exemplu este o listă simplu-înlănţuită • Structuri de date înlănţuite • Adaugarea unui nod nou in lista • Exemplu
Exemplu este o listă simplu-înlănţuită • Exemplu este o listă simplu-înlănţuită: struct listnode{ char *item; struct listnode *next; }; • Putem crea o mică listă cu următoarele declaraţii: struct listnode node2 = {"world", NULL}; struct listnode node1 = {"hello", &node2}; struct listnode *head = &node1; • O reprezentare a listei ce rezultă se poate da sub forma:
Structuri de date înlănţuite • Declarăm un alt pointer la listă cu numele lp pe care îl vom face să parcurgă fiecare nod al listei pe rând: struct listnode *lp; for(lp = head; lp != NULL; lp = lp->next) printf("%s\n", lp->item); • Secvenţa de mai jos introduce un nou element la începutul listei: #include <stdio.h> /* pentru fprintf, stderr */ #include <stdlib.h> /* pentru malloc */ char *newword = "test"; struct listnode *newnode = malloc(sizeof(struct listnode)); if(newnode == NULL) { fprintf(stderr, "memoria epuizata\n"); exit(1); } newnode->item = newword; newnode->next = head; head = newnode;
Adaugarea unui nod nou in lista • Operaţia de introducere a unui nou nod în listă o vom încapsula într-o funcţie: #include <stdio.h> /* pentru fprintf, stderr */ #include <stdlib.h> /* pentru malloc, exit */ #include <string.h> /* pentru strlen, strcpy */ struct listnode *adaugare(char *newword, struct listnode *oldhead){ struct listnode *newnode = malloc(sizeof(struct listnode)); if(newnode == NULL){ fprintf(stderr, "memorie epuizata\n"); exit(1); } newnode->item = malloc(strlen(newword) + 1); if(newnode->item == NULL){ fprintf(stderr, " memorie epuizata \n"); exit(1); } strcpy(newnode->item, newword);newnode->next = oldhead; return newnode; }
Adaugarea unui nod nou in lista • Putem să comprimăm codul funcţiei astfel: struct listnode *newnode; if((newnode = malloc(sizeof(struct listnode))) == NULL || (newnode->item = malloc(strlen(newword) + 1)) == NULL) { fprintf(stderr, " memorie epuizata \n"); exit(1); } • Acum că avem funcţia de adăugare a unui nod, putem crea o listă prin apelarea în mod repetat a acestei funcţii: struct listnode *head = NULL; head = adaugare("world", head); head = adaugare ("hello", head);
Exemplu • Vom citi cuvinte sau şiruri de caractere introduse de utilizator (sau redirectate dintr-un fişier), şi le vom adăuga la listă: #define MAXLINE 200 char line[MAXLINE]; struct listnode *head = NULL; struct listnode *lp; while(getline(line, MAXLINE) != EOF) head = adaugare(line, head); for(lp = head; lp != NULL; lp = lp->next) printf("%s\n", lp->item); • getline este funcţia pentru citirea liniilor pe care am mai folosit-o. • În locul acestei funcţii putem folosi funcţia fgets din biblioteca standard. • Programul de mai sus va afişa liniile în ordinea inversă introducerii lor.
Exemplu #include <stdio.h> /* Adauga un nod si parcurge lista */ #include <string.h> int main () { struct node { char name [30]; struct node *nextperson; }; struct node m1 = {"Chris", NULL}; struct node m2 = {"Kelly", &m1}; struct node m3 = {"Les", &m2}; struct node m4 = {"Nicky", &m3}; struct node m5, m6; struct node *current = &m4;
Exemplu while (current != NULL) { printf("%s\n", current->name); current = current -> nextperson; } printf("\nAdauga un element la inceput\n"); strcpy(m5.name, "Ali"); m5.nextperson = &m4; current = &m5; while (current != NULL) { printf("%s\n", (*current).name); current = (*current).nextperson; }
Exemplu printf("\nAdauga o persoana la mijloc\n"); printf(“Introduceti numele"); scanf("%s", &m6.name); m6.nextperson = &m2; m3.nextperson = &m6; current = &m5; while (current != NULL) { printf("%s\n", (*current).name); current = (*current).nextperson; } return 0; }