1 / 10

Programare in limbajul C – Cursul 16 Structuri de date înlănţuite Prof. univ. dr. Constantin Popescu

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ă.

jara
Download Presentation

Programare in limbajul C – Cursul 16 Structuri de date înlănţuite Prof. univ. dr. Constantin Popescu

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programare in limbajul C – Cursul 16Structuri de date înlănţuiteProf. univ. dr. Constantin Popescu

  2. Agenda • Exemplu este o listă simplu-înlănţuită • Structuri de date înlănţuite • Adaugarea unui nod nou in lista • Exemplu

  3. 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:

  4. 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;

  5. 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; }

  6. 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);

  7. 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.

  8. 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;

  9. 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; }

  10. 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; }

More Related