Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <malloc.h>
- #include <string.h>
- #include <stdlib.h>
- #define LINESIZE 128
- struct Student {
- char id[6];
- char *nume;
- char facultate[6];
- char grupa[5];
- float avg;
- };
- struct Nod{
- Student stud;
- Nod* next;
- };
- //inserare la inceputul listei
- void inserareNodInceput(Nod** lista, Student student){
- Nod* nou = (Nod*)malloc(sizeof(Student));
- nou->stud = student;
- //nou->next = NULL; //?
- if (*lista != NULL){ //are deja cel putin 1 nod
- nou->next = *lista;
- *lista = nou; //reseteaza primul nod
- }
- else {
- nou->next = NULL;
- *lista = nou;
- }
- }
- //inserare la sfarsitul listei - 2
- void inserareNodSfarsit(Nod** lista, Student student){
- Nod* nou = (Nod*)malloc(sizeof(Nod));
- nou->stud = student;
- nou->next = NULL;
- if (*lista != NULL){
- Nod* nodPrim = *lista;//adresa primului nod
- while (nodPrim->next != NULL){
- nodPrim = nodPrim->next; //sari la urmatorul nod
- }
- nodPrim->next = nou;
- }
- else {
- *lista = nou;
- }
- }
- //inserare la sfarsitul listei
- Nod* inserareSfarsit(Nod* lista, Student st){
- Nod* nou = (Nod*)malloc(sizeof(Nod)* 1); //alocare nod in heap segment
- nou->stud = st;
- nou->next = NULL; //0
- if (!lista){
- return nou;
- }
- Nod* tmp = lista; //adresa primului nod
- while (tmp->next){ //traversare lista pana la ultimul nod (legatura null)
- tmp = tmp->next;
- }
- tmp->next = nou;
- return lista;
- }
- //stergere nod
- void stergereNod(Nod** lista, Student student){
- Nod* nodCurent = NULL;
- Nod* nodAnterior = NULL;
- Nod* adresa = NULL;
- for (nodCurent = *lista; nodCurent != NULL; nodAnterior = nodCurent, nodCurent = nodCurent->next){
- //printf("Student: %s \n", nodCurent->stud.nume);
- if (strcmp(student.id, nodCurent->stud.id) == 0){
- //acest nod trebuie sters
- if (nodAnterior == NULL){
- *lista = nodCurent->next;
- }
- else {
- printf("Se va sterge studentul cu id-ul #%s\n", nodCurent->stud.id);
- nodAnterior->next = nodCurent->next;
- adresa = nodCurent;
- }
- free(nodCurent->stud.nume);
- free(nodCurent);
- return;
- }
- }
- }
- //stergere lista
- void stergereLista(Nod** lista){
- Nod* temp = NULL;
- while (*lista != NULL){
- temp = *lista;
- *lista = temp->next;
- free(temp->stud.nume);
- free(temp);
- }
- }
- //traversare lista
- void traversareLista(Nod* lista){
- Nod* temp = lista;
- while (temp != NULL){
- printf(" - #%s %s, facultatea: %s, grupa: %s, media: %6.2f\n", temp->stud.id,
- temp->stud.nume, temp->stud.facultate, temp->stud.grupa, temp->stud.avg);
- temp = temp->next;
- }
- }
- Nod* interschimbareNoduri(Nod* l, Nod* i){
- if (i!=NULL){
- Nod* temp = l;
- Nod* j;
- if (temp != NULL && temp->next == 0){
- return l;
- }
- if (temp == i){
- //interschimb nodurile 1<->2
- j = i->next;
- i->next = j->next;
- j->next = i;
- return j;
- }
- while (temp->next != i){
- temp = temp->next;
- }
- j = i->next;
- i->next = j->next;
- j->next = i;
- temp->next = j;
- }
- return l;
- }
- Nod* cautareStudentID(Nod* l, char id[]){
- if (l!=NULL){ //am cel putin un nod in lista
- Nod* temp = l;
- while (temp){
- if (strcmp(temp->stud.id, id)==0){
- return temp;
- }
- temp = temp->next;
- }
- return temp; // t==null
- }
- return l; // l==null
- }
- void main(){
- FILE* f;
- f = fopen("Studenti.txt", "r");
- Student s;
- Nod* lista = NULL;
- char buffer[LINESIZE], seps[] = { "," }, *token; //seps = separatori
- //citire din fisier
- while (fgets(buffer, LINESIZE, f)){ //LINESIZE/sizeof(buffer)
- token = strtok(buffer, seps); //preluare primul token din linia salvata in buffer
- strcpy(s.id, token); //salvare token(id student) in campul id
- token = strtok(NULL, seps); //preluare token urmator
- s.nume = (char*)malloc((strlen(token) + 1) * sizeof(char));
- strcpy(s.nume, token);
- token = strtok(NULL, seps); //NULL - se parseaza din locul in care am ajuns pana la separator
- strcpy(s.facultate, token);
- token = strtok(NULL, seps);
- strcpy(s.grupa, token);
- token = strtok(NULL, seps);
- s.avg = atof(token); //conversie string medie in reprezentare liniara tip float
- //inserare element nou in lista simpla
- lista = inserareSfarsit(lista, s);
- //inserareNodSfarsit(&lista, s);
- //inserareNodInceput(&lista, s);
- }
- //traversare lista cu afisare continut noduri
- printf("1) Traversare lista cu afisare continut noduri: \n\n");
- traversareLista(lista);
- /* /stergere un element din lista
- printf("\n2) Stergere un element din lista: \n\n");
- Student deSters; strcpy(deSters.id, "1235");
- //stergereNod(&lista, deSters);
- stergereLista(&lista);
- traversareLista(lista); */
- //calcul medie studenti din lista
- Nod* temp;
- temp = lista;
- int nrStudenti = 0; float medieStudenti = 0;
- while (temp != NULL){
- nrStudenti++;
- medieStudenti += temp->stud.avg;
- temp = temp->next;
- }
- medieStudenti /= nrStudenti;
- printf("\n2) Calcul medie studenti din lista\n");
- printf(" - Numar studenti: %d - medie studenti: %f\n", nrStudenti, medieStudenti);
- //determinare numar studenti din lista <-
- //interschimbare noduri
- printf("\n3)Interschimbare noduri adiacente\n");
- Nod* studGasit = cautareStudentID(lista, "1235");
- lista = interschimbareNoduri(lista, studGasit);
- traversareLista(lista);
- //stergere nod la inceputul listei
- printf("\n4) Stergere primul nod din lista ...\n");
- temp = lista->next; // -> salvare legatura urmatoare
- free(lista);
- lista = (Nod*)malloc(sizeof(Nod)*nrStudenti - 1); // -> realocare lista
- lista = temp;
- traversareLista(lista);
- /*temp = lista;
- while (temp != NULL){
- printf("- #%s %s, facultatea: %s, grupa: %s, media: %6.2f\n", temp->stud.id,
- temp->stud.nume, temp->stud.facultate, temp->stud.grupa, temp->stud.avg);
- temp = temp->next;
- }*/
- //dezalocare lista
- printf("\n5) Stergere noduri din lista ...\n");
- stergereLista(&lista);
- traversareLista(lista);
- free(lista);
- //transformare lista simpla in lista circulara (sa dispara pointerul null pe ultimul nod)
- //interschimb noduri oarecare in lista simpla circulara
- //creare lista dubla cu studenti din Studenti.txt
- //interschimb noduri oarecare in lista dubla
- fclose(f);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement