Advertisement
Guest User

seminar6_tema2

a guest
Mar 29th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #define LINESIZE 128
  6.  
  7. struct Student {
  8.     char id[6];
  9.     char *nume;
  10.     char facultate[6];
  11.     char grupa[5];
  12.     float avg;
  13. };
  14.  
  15. struct Nod{
  16.     Student stud;
  17.     Nod* next;
  18. };
  19.  
  20. //inserare la inceputul listei
  21. void inserareNodInceput(Nod** lista, Student student){
  22.     Nod* nou = (Nod*)malloc(sizeof(Student));
  23.     nou->stud = student;
  24.     //nou->next = NULL; //?
  25.  
  26.     if (*lista != NULL){ //are deja cel putin 1 nod
  27.         nou->next = *lista;
  28.         *lista = nou; //reseteaza primul nod
  29.     }
  30.     else {
  31.         nou->next = NULL;
  32.         *lista = nou;
  33.     }
  34. }
  35.  
  36.  
  37. //inserare la sfarsitul listei - 2
  38. void inserareNodSfarsit(Nod** lista, Student student){
  39.     Nod* nou = (Nod*)malloc(sizeof(Nod));
  40.     nou->stud = student;
  41.     nou->next = NULL;
  42.     if (*lista != NULL){
  43.         Nod* nodPrim = *lista;//adresa primului nod
  44.         while (nodPrim->next != NULL){
  45.             nodPrim = nodPrim->next; //sari la urmatorul nod
  46.         }
  47.         nodPrim->next = nou;
  48.     }
  49.     else {
  50.         *lista = nou;
  51.     }
  52. }
  53.  
  54. //inserare la sfarsitul listei
  55. Nod* inserareSfarsit(Nod* lista, Student st){
  56.     Nod* nou = (Nod*)malloc(sizeof(Nod)* 1); //alocare nod in heap segment
  57.     nou->stud = st;
  58.     nou->next = NULL; //0
  59.     if (!lista){
  60.         return nou;
  61.     }
  62.     Nod* tmp = lista; //adresa primului nod
  63.     while (tmp->next){ //traversare lista pana la ultimul nod (legatura null)
  64.         tmp = tmp->next;
  65.     }
  66.     tmp->next = nou;
  67.     return lista;
  68. }
  69.  
  70. //stergere nod
  71. void stergereNod(Nod** lista, Student student){
  72.     Nod* nodCurent = NULL;
  73.     Nod* nodAnterior = NULL;
  74.     Nod* adresa = NULL;
  75.     for (nodCurent = *lista; nodCurent != NULL; nodAnterior = nodCurent, nodCurent = nodCurent->next){
  76.         //printf("Student: %s \n", nodCurent->stud.nume);
  77.         if (strcmp(student.id, nodCurent->stud.id) == 0){
  78.             //acest nod trebuie sters
  79.             if (nodAnterior == NULL){
  80.                 *lista = nodCurent->next;
  81.             }
  82.             else {
  83.                 printf("Se va sterge studentul cu id-ul #%s\n", nodCurent->stud.id);
  84.                 nodAnterior->next = nodCurent->next;
  85.                 adresa = nodCurent;
  86.             }
  87.             free(nodCurent->stud.nume);
  88.             free(nodCurent);
  89.             return;
  90.         }
  91.  
  92.     }
  93. }
  94.  
  95. //stergere lista
  96. void stergereLista(Nod** lista){
  97.     Nod* temp = NULL;
  98.     while (*lista != NULL){
  99.         temp = *lista;
  100.         *lista = temp->next;
  101.         free(temp->stud.nume);
  102.         free(temp);
  103.     }
  104. }
  105.  
  106. //traversare lista
  107. void traversareLista(Nod* lista){
  108.     Nod* temp = lista;
  109.     while (temp != NULL){
  110.         printf(" - #%s %s, facultatea: %s, grupa: %s, media: %6.2f\n", temp->stud.id,
  111.             temp->stud.nume, temp->stud.facultate, temp->stud.grupa, temp->stud.avg);
  112.         temp = temp->next;
  113.     }
  114. }
  115.  
  116. Nod* interschimbareNoduri(Nod* l, Nod* i){
  117.     if (i!=NULL){
  118.         Nod* temp = l;
  119.         Nod* j;
  120.         if (temp != NULL && temp->next == 0){
  121.             return l;
  122.         }
  123.         if (temp == i){
  124.             //interschimb nodurile 1<->2
  125.             j = i->next;
  126.             i->next = j->next;
  127.             j->next = i;
  128.             return j;
  129.         }
  130.         while (temp->next != i){
  131.             temp = temp->next;
  132.         }
  133.         j = i->next;
  134.         i->next = j->next;
  135.         j->next = i;
  136.         temp->next = j;
  137.     }
  138.     return l;
  139. }
  140.  
  141. Nod* cautareStudentID(Nod* l, char id[]){
  142.     if (l!=NULL){ //am cel putin un nod in lista
  143.         Nod* temp = l;
  144.         while (temp){
  145.             if (strcmp(temp->stud.id, id)==0){
  146.                 return temp;
  147.             }
  148.             temp = temp->next;
  149.         }
  150.         return temp; // t==null
  151.     }
  152.     return l; // l==null
  153. }
  154.  
  155.  
  156. void main(){
  157.  
  158.     FILE* f;
  159.     f = fopen("Studenti.txt", "r");
  160.     Student s;
  161.     Nod* lista = NULL;
  162.     char buffer[LINESIZE], seps[] = { "," }, *token; //seps = separatori
  163.     //citire din fisier
  164.     while (fgets(buffer, LINESIZE, f)){ //LINESIZE/sizeof(buffer)
  165.         token = strtok(buffer, seps); //preluare primul token din linia salvata in buffer
  166.         strcpy(s.id, token); //salvare token(id student) in campul id
  167.  
  168.         token = strtok(NULL, seps); //preluare token urmator
  169.         s.nume = (char*)malloc((strlen(token) + 1) * sizeof(char));
  170.         strcpy(s.nume, token);
  171.  
  172.         token = strtok(NULL, seps); //NULL - se parseaza din locul in care am ajuns pana la separator
  173.         strcpy(s.facultate, token);
  174.  
  175.         token = strtok(NULL, seps);
  176.         strcpy(s.grupa, token);
  177.  
  178.         token = strtok(NULL, seps);
  179.         s.avg = atof(token); //conversie string medie in reprezentare liniara tip float
  180.  
  181.         //inserare element nou in lista simpla
  182.         lista = inserareSfarsit(lista, s);
  183.  
  184.         //inserareNodSfarsit(&lista, s);
  185.         //inserareNodInceput(&lista, s);
  186.     }
  187.  
  188.  
  189.     //traversare lista cu afisare continut noduri  
  190.     printf("1) Traversare lista cu afisare continut noduri: \n\n");
  191.     traversareLista(lista);
  192.  
  193.    
  194.     /* /stergere un element din lista
  195.     printf("\n2) Stergere un element din lista: \n\n");
  196.     Student deSters; strcpy(deSters.id, "1235");
  197.     //stergereNod(&lista, deSters);
  198.     stergereLista(&lista);
  199.     traversareLista(lista); */
  200.  
  201.  
  202.     //calcul medie studenti din lista
  203.     Nod* temp;
  204.     temp = lista;
  205.     int nrStudenti = 0; float medieStudenti = 0;
  206.     while (temp != NULL){
  207.         nrStudenti++;
  208.         medieStudenti += temp->stud.avg;
  209.         temp = temp->next;
  210.     }
  211.     medieStudenti /= nrStudenti;
  212.     printf("\n2) Calcul medie studenti din lista\n");
  213.     printf(" - Numar studenti: %d - medie studenti: %f\n", nrStudenti, medieStudenti);
  214.  
  215.     //determinare numar studenti din lista <-
  216.    
  217.     //interschimbare noduri
  218.     printf("\n3)Interschimbare noduri adiacente\n");
  219.     Nod* studGasit = cautareStudentID(lista, "1235");
  220.     lista = interschimbareNoduri(lista, studGasit);
  221.     traversareLista(lista);
  222.  
  223.  
  224.  
  225.  
  226.     //stergere nod la inceputul listei
  227.     printf("\n4) Stergere primul nod din lista ...\n");
  228.     temp = lista->next; // -> salvare legatura urmatoare
  229.     free(lista);
  230.     lista = (Nod*)malloc(sizeof(Nod)*nrStudenti - 1); // -> realocare lista
  231.     lista = temp;
  232.     traversareLista(lista);
  233.     /*temp = lista;
  234.     while (temp != NULL){
  235.     printf("- #%s %s, facultatea: %s, grupa: %s, media: %6.2f\n", temp->stud.id,
  236.     temp->stud.nume, temp->stud.facultate, temp->stud.grupa, temp->stud.avg);
  237.     temp = temp->next;
  238.     }*/
  239.  
  240.    
  241.     //dezalocare lista
  242.     printf("\n5) Stergere noduri din lista ...\n");
  243.     stergereLista(&lista);
  244.     traversareLista(lista);
  245.     free(lista);
  246.  
  247.  
  248.  
  249.  
  250.  
  251.     //transformare lista simpla in lista circulara (sa dispara pointerul null pe ultimul nod)
  252.  
  253.     //interschimb noduri oarecare in lista simpla circulara
  254.  
  255.     //creare lista dubla cu studenti din Studenti.txt
  256.  
  257.     //interschimb noduri oarecare in lista dubla
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.     fclose(f);
  267.  
  268. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement