sdd lista dublu inlantuita
user_1419384
c_cpp
20 days ago
6.0 kB
3
Indexable
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> #define LINESIZE 128 typedef struct Student { int anulDeNastere; char* nume; int nrNote; float* note; } Student; Student adaugareStudent(int _anulDeNastere, const char*_nume, int _nrNote, float* note ) { Student s; s.anulDeNastere = _anulDeNastere; s.nume = malloc((strlen(_nume) + 1)* sizeof(char) ); strcpy(s.nume, _nume); s.nrNote = _nrNote; if(s.nrNote > 0 && note !=NULL){ s.note = malloc(s.nrNote * sizeof(float)); for (int i = 0; i < s.nrNote; i++) s.note[i] = note[i]; } else { s.nrNote = 0; s.note = NULL; } return s; } typedef struct Node Node; typedef struct DoublyLinkedList DLList; struct Node { Student student; Node* next; Node* prev; }; struct DoublyLinkedList { Node* start; Node* end; }; void insertAtEnd(DLList* list, Student student) { //Cream noul nod comform studentului nou Node* newNode = malloc(sizeof(Node)); newNode->student = student; //Localizam nodul newNode->next = NULL; newNode->prev = list->end; if (list->start) { list->end->next = newNode; } else { list->start = newNode; } list->end = newNode; } void insertAtBeginning(DLList* list, Student student) { //Alocam noul nod cu toate info de rigoare Node* newNode = malloc(sizeof(Node)); newNode->student = student; //Localizam newNode newNode->next = list->start; newNode->prev = NULL; //daca avem noduri if (list->start) { list->start->prev = newNode; } else { //daca n-avem noduri, acesta o sa fie si end list->end = newNode; } list->start = newNode; } Student stergereStudentInceput(DLList* list) { if (list->start) { Node* nodSters = list->start; Student studentSters = (*list->start).student; if (list->start->next) { //avem mai mult de 1 nod list->start = list->start->next; list->start->prev = NULL; return studentSters; } else { //avem doar 1 nod list->start = NULL; list->end = NULL; return studentSters; } free(nodSters); } else { //Nu avem noduri / studenti printf("lista este goala! "); Student err = { .anulDeNastere = 0,.nume = "ERRR",.nrNote = 0,.note = NULL }; return err; } } Student stergereStudentFinal(DLList* list) { if (list->start) { //avem cel putin un nod //salvam nodul si info Node* nodSters = list->end; Student studentSters = (*nodSters).student; if (list->end->prev) { //exista cel putin 2 noduri list->end = list->end->prev; list->end->next = NULL; } else { //este doar un nod list->start = NULL; list->end = NULL; } free(nodSters); return studentSters; } else { printf("Lista este goala !"); Student err = { .anulDeNastere = 0, .nume="Err", .nrNote=0,.note=NULL}; return err; } } void printStudent(Student student) { printf("Studentul %s nascut in anul %i cu cele %i note:", student.nume, student.anulDeNastere, student.nrNote); for (int i = 0; i < student.nrNote; i++) printf("%.2f ", student.note[i]); printf("\n"); } void parseListPrint(DLList list) { while (list.start) { printStudent((*list.start).student); list.start = list.start->next; } } Student citireStudentFisier(char* buffer) { //Creez o structure de tip Student Student student; //Populez structura //cream tokenurile char* token; token = strtok(buffer, ","); student.anulDeNastere = atoi(token); token = strtok(NULL, ","); student.nume = malloc( (strlen(token)+1)*sizeof(char) ); strcpy(student.nume, token); token = strtok(NULL, ","); student.nrNote = atoi(token); if (student.nrNote > 0) { student.note = malloc(student.nrNote * sizeof(float)); for (int i = 0; i < student.nrNote; i++) { token = strtok(NULL, ","); student.note[i] = atof(token); } } else { student.nrNote = 0; student.note = NULL; } return student; } void citireStudentiFisier(DLList* list, int* nrStudenti, const char* fileName) { FILE* f = fopen(fileName, "r"); char buffer[LINESIZE]; if (f) { while (fgets(buffer,LINESIZE,f)) { insertAtEnd(list, citireStudentFisier(buffer)); (*nrStudenti)++; } fclose(f); } else printf("Fisierul %s nu s-a putut deschide",fileName); } void cautareDupaAnNastere(DLList list, int an ) { if (list.start) { Node* nodCurent = list.start; while ( nodCurent ) { if ((*nodCurent).student.anulDeNastere == an) { printf("S-a gasit : "); printStudent((*nodCurent).student); } nodCurent = nodCurent->next; } } else printf("Lista este goala, nu s-a putut initializa cautarea"); } int main() { int nrStudenti=0; DLList list; list.end = NULL; list.start = NULL; float Note[] = { 9.3,4.3,9 }; citireStudentiFisier(&list,&nrStudenti,"Studenti.txt"); parseListPrint(list); printf("%d studenti au fost cititi din fisier ", nrStudenti); insertAtEnd(&list, adaugareStudent(2004, "Iordachi Ionut", 3, Note)); nrStudenti++; printf("\n------Dupa Modificare (adaugare final )-----------\n"); parseListPrint(list); insertAtBeginning(&list, adaugareStudent(2001, "Iordachi Bianca", 3, Note)); printf("\n------Dupa Modificare (adaugare la inceput )-----------\n"); parseListPrint(list); printf("\n------Dupa Modificare (stergere inceput )-----------\n"); Student studentExmatriculat = stergereStudentInceput(&list); nrStudenti--; printf("\n------studentul sters :"); printStudent(studentExmatriculat); printf("\n"); parseListPrint(list); printf("\n------Dupa Modificare (stergere final )-----------\n"); Student studentExmatriculat2 = stergereStudentFinal(&list); nrStudenti--; printf("\n------studentul sters :"); printStudent(studentExmatriculat2); printf("\n"); parseListPrint(list); int an = 2008; cautareDupaAnNastere(list, an); return 0; }
Editor is loading...
Leave a Comment