Moderators NEFERPITOU Postat Decembrie 24, 2024 Moderators Postat Decembrie 24, 2024 ** Declarare functii de inserare , printare si stergere totala ** // Lists.h #pragma once #include "stdlib.h" // malloc/free #include "string.h" // memcpy typedef struct LinkedList{ // LISTA INLANTUITA GENERICA (O PUTEM FOLOSI CU ORICE TIP DE DATE FARA SA DECLARAM MAI MULTE STRUCTURI) void* Data; // Pastram informatia pentru elementul curent struct LinkedList* nextElement;// Ne corelam cu urmatorul element }Linked_List; void insertAtHead(Linked_List** head, void* data, size_t sizeData); // Inseram de la inceputul listei (Transfer prin adresa , inseram date in lista) void insertAtEnd(Linked_List** head, void* data, size_t sizeData); // Inseram la sfarsitul listei void printLinkedList(Linked_List* head, void(*printDataGeneric)(void*)); // Printam lista void freeLinkedList(Linked_List** head, void(*deleteDataGeneric)(void*)); // Eliberam Lista ** Inserare de la inceput ** Implementam functia de inserare la inceput in "Lists.c" : // Lists.c #include "Lists.h" // Includem Headerul void insertAtHead(Linked_List** head,void* data,size_t sizeData) { // PRIMESTE CA PARAMETRU LISTA PRELUATA PRIN ADRESA (PENTRU MODIFICARI) , INFORMATIA PE CARE O PRIMESTE NODUL SI DIMENSIUNEA ACESTEIA } Inseram date in Nod : // Lists.c #include "Lists.h" // Includem Headerul void insertAtHead(Linked_List** head,void* data,size_t sizeData) { // PRIMESTE CA PARAMETRU LISTA PRELUATA PRIN ADRESA (PENTRU MODIFICARI) , INFORMATIA PE CARE O PRIMESTE NODUL SI DIMENSIUNEA ACESTEIA //// 1. ADAUGAM INFORMATIA CATRE NOD // Alocam un bloc nou de memorie pentru segmentul pe care l introducem Linked_List* newNode = (Linked_List*)malloc(sizeof(Linked_List)); // Inseram date in bloc newNode->Data = malloc(sizeData); // Alocam spatiu pentru informatie memcpy_s(newNode->Data,sizeData,data,sizeData); // Transferam informatia spre blocul nou } Construim legatura cu Urmatorul Nod : // Lists.c #include "Lists.h" // Includem Headerul void insertAtHead(Linked_List** head,void* data,size_t sizeData) { // PRIMESTE CA PARAMETRU LISTA PRELUATA PRIN ADRESA (PENTRU MODIFICARI) , INFORMATIA PE CARE O PRIMESTE NODUL SI DIMENSIUNEA ACESTEIA //// 1. ADAUGAM INFORMATIA CATRE NOD // Alocam un bloc nou de memorie pentru segmentul pe care l introducem Linked_List* newNode = (Linked_List*)malloc(sizeof(Linked_List)); // Inseram date in bloc newNode->Data = malloc(sizeData); // Alocam spatiu pentru informatie memcpy_s(newNode->Data,sizeData,data,sizeData); // Transferam informatia spre blocul nou /// 2. CONSTRUIM LEGATURA CU URMATORUL NOD newNode->nextElement = *head; // URMATORUL NOD VA FI CAPUL CURENT (PRIMUL ELEMENT ) *head = newNode; // NOUL NOD VA FI CAPUL /*** Reprezentare Vizuala : SA presupunem ca dorim sa introducem : 5 , 4 , 2 , 7, 6 (In Lista ) 1. 5 -> NULL 2. 4 -> 5 -> NULL 3. 2 -> 4 -> 5 -> NULL 4. 7 -> 2 -> 4 -> 5 -> NULL 5. 6 -> 7 -> 2 -> 4 -> 5 -> NULL ***/ } ** Inserare de La Capat ** Implementam functia de inserare la sfarsitul listei : // Lists.c void insertAtEnd(Linked_List** head, void* data, size_t sizeData) { // IDEM , DIFERA DOAR MODUL DE FORMARE A LEGATURILOR //// 1. ADAUGAM INFORMATIA CATRE NOD // Alocam un bloc nou de memorie pentru segmentul pe care l introducem Linked_List* newNode = (Linked_List*)malloc(sizeof(Linked_List)); // Inseram date in bloc newNode->Data = malloc(sizeData); // Alocam spatiu pentru informatie memcpy_s(newNode->Data, sizeData, data, sizeData); // Transferam informatia spre blocul nou // INFORMATIA SE ADAUGA LA FEL DOAR DIFERA LEGATURILE newNode->nextElement = NULL; // Setam ca nodul construit sa fie ultimul element // CONTINUARE } Daca lista este goala : if (*head == NULL) // Daca nu avem elemente in lista *head = newNode; // NODUL VA DEVENI CAPUL LISTEI Daca NU : void insertAtEnd(Linked_List** head, void* data, size_t sizeData){ // RESTU CODULUI else { // ALTFEL VOM PARCURGE LISTA PANA LA FINAL Linked_List* lastNode = *head; while (lastNode->nextElement != NULL) // Parcurgem pana la ultimul element lastNode = lastNode->nextElement; // Parcurgem nod cu nod (sau segment) lastNode->nextElement = newNode; // Urmatorul element al ultimului nod va fi cel construit aici } /*** Reprezentare vizuala : 5 , 3 , 2 , 6 , 7 1. 5 -> NULL ; 2 5 -> 3 -> NULL ; 3. 5 -> 3 -> 2 -> NULL; 4. 5 -> 3 -> 2 -> 6 -> NULL; 5. 5 -> 3 -> 2 -> 6 -> 7 -> NULL; ***// } ** Afisare Lista Generica ** Afisarea listei se va efectua generic (adaptata la tipul de date pe care l vom folosi, in cazul nostru Utilizator) : // Lists.c void printLinkedList(Linked_List* head,void(*printDataGeneric)(void*)) { // Preluam lista prin copie dar si o functie pointer care ne permite sa printam un tip de date pe care l dorim (In cazul nostru , Utilizatori) while (head != NULL) // NAVIGAM PANA NU MAI EXISTA ELEMENTE { (*printDataGeneric)(head->Data); // Printam INFORMATIA DIN NOD ADAPTATA LA TIPUL DE DATE PE CARE L VREM NOI head = head->nextElement; // NAVIGAM LA URMATORUL ELEMENT } } ** Stergere Lista Generica ** Stergerea listei se va efectua generic (adaptata la tipul de date pe care l vom folosi , in cazul nostru Utilizator) : void freeLinkedList(Linked_List** head, void(*deleteDataGeneric)(void*)) { // Preluam nodul actual sa l putem sterge Linked_List* nodeToBeDeleted = head; // Stergerea se face de la primul spre ultimul while (*head != NULL) //navigam PANA la capat { nodeToBeDeleted = *head; // Preluam referinta capului *head = (*head)->nextElement; // Mutam capul la urmatorul element //// Stergem informatia din nodul actual (*deleteDataGeneric)(nodeToBeDeleted->Data); // Stergem Generic (Adaptata la tipul nostru de date) free(nodeToBeDeleted->Data); // Stergem blocul de memorie ocupata de informatie free(nodeToBeDeleted); // Stergem nodul in sine } *head = NULL; // SETAM LISTA PE NULL } Testam functiile in programul principal : // entryPoint.c /* Legam toate entry point toate headerele dependente */ #include "../StructuriDate/roles.h" #include "../StructuriDate/fileHandling.h" #include "../StructuriDate/User.h" #include "../StructuriDate//Lists.h" // stringHandling.h nu este dependent de entry point // // CONSTANTELE MACRO SUNT UTILE CA LE PUTEM UTILIZA LA NIVEL GLOBAL (PE TOT FISIERUL) // NOTA** : E O PRACTICA BUNA DE A FOLOSI MACRO SPRE DEOSEBIRE DE CONSTANTE "MAGICE" (NUMERE PRIN COD) #define NR_FILES 2 // STABILIM UN NUMAR DE FISIERE int main() { FILE** file = NULL; file = (FILE**)malloc(sizeof(FILE*)*NR_FILES); // DECLARAM O COLECTIE DE FISIERE file[0] = openFile(FILENAME_INPUT_ROLES, READMODE_TXT); // CITIM ROLURILE DINTR-UN FISIER TEXT file[1] = openFile(FILENAME_USER_INPUT, READMODE_TXT); // CITIM UTILIZATORI DINTR-UN FISIER TEXT // dateIntrareLeagueCS.txt && dateIntrareRoluriLeagueCS.txt TREBUIE SA EXISTE IN DIRECTOR (ALTFEL VA ESUA) Role* roles = fetchRoles(file[0]); // Am primit lista cu rolurile User* users = fetchUsersFromTxtFile(file[1],roles); // Am primit informatia despre utilizatori Linked_List* list = NULL; // Declaram lista nula for (int i = 0; i < 3; i++) // Primii 3 ii inseram de la cap insertAtHead(&list, users + i, sizeof(users[i])); // inseram al doilea element al listei ca cap al listei (1) for (int i = 3; i < 6; i++) // Ceilalti de la coada insertAtEnd(&list, users + i, sizeof(users[i])); // inseram al doilea element al listei ca cap al listei (1) printLinkedList(list, printUser); // ELIBERAM RESURSELE freeLinkedList(&list, freeUser); // Eliberam Nodurile + Lista va fi NULA freeRoles(&roles); // Eliberam resursele ocupate de entitate free(users); // Stergem colectia closeFiles(&file,NR_FILES); // Eliberam resursele ocupate de fisiere if (file == NULL) printf("COLECTIA DE FISIERE A FOST ELIBERATA CU SUCCES !! "); return 0; } Si vom avea rezultatul : **FISIERUL dateIntrareRoluriLeagueCS.txt S-A DESCHIS CU SUCCES !** **FISIERUL dateIntrareUtilizatoriLeagueCS.txt S-A DESCHIS CU SUCCES !** User 0 : { ID UTILIZATOR: 2 , NUME UTILIZATOR: Alivcxvxcn , ADRESA MAIL UTILIZATOR: alidsadvfcn@gmail.com , PAROLA : dsewqqewqadc , NUMAR POSTURI : 550 , ESTE BANAT : NU , ROLURI DETINUTE : { ID ROL : 3 | NUME ROL : Super Moderator ID ROL : 1 | NUME ROL : Utilizator Premium } }User 1 : { ID UTILIZATOR: 1 , NUME UTILIZATOR: Alinds , ADRESA MAIL UTILIZATOR: alidasdsan@gmail.com , PAROLA : dsavvcvdc , NUMAR POSTURI : 50 , ESTE BANAT : NU , ROLURI DETINUTE : { ID ROL : 0 | NUME ROL : Membru ID ROL : 1 | NUME ROL : Utilizator Premium } }User 2 : { ID UTILIZATOR: 0 , NUME UTILIZATOR: Alin , ADRESA MAIL UTILIZATOR: alidsadan@gmail.com , PAROLA : dsdasdadsadadc , NUMAR POSTURI : 100 , ESTE BANAT : NU , ROLURI DETINUTE : { ID ROL : 0 | NUME ROL : Membru ID ROL : 3 | NUME ROL : Super Moderator ID ROL : 4 | NUME ROL : Administrator ID ROL : 1 | NUME ROL : Utilizator Premium } }User 3 : { ID UTILIZATOR: 3 , NUME UTILIZATOR: Alifdsfn , ADRESA MAIL UTILIZATOR: alewewin@gmail.com , PAROLA : dsfdsfsdfsadc , NUMAR POSTURI : 3300 , ESTE BANAT : NU , ROLURI DETINUTE : { ID ROL : 0 | NUME ROL : Membru ID ROL : 1 | NUME ROL : Utilizator Premium ID ROL : 2 | NUME ROL : Moderator ID ROL : 3 | NUME ROL : Super Moderator ID ROL : 4 | NUME ROL : Administrator } }User 4 : { ID UTILIZATOR: 4 , NUME UTILIZATOR: Alie2qweqn , ADRESA MAIL UTILIZATOR: alcxsaxcadsain@gmail.com , PAROLA : dsvcvvvvadc , NUMAR POSTURI : 11100 , ESTE BANAT : NU , ROLURI DETINUTE : { ID ROL : 0 | NUME ROL : Membru } }User 5 : { ID UTILIZATOR: 5 , NUME UTILIZATOR: Alidasdadan , ADRESA MAIL UTILIZATOR: alidasdassdadn@gmail.com , PAROLA : dsvvvvvvvvradc , NUMAR POSTURI : 134300 , ESTE BANAT : NU , ROLURI DETINUTE : { ID ROL : 0 | NUME ROL : Membru ID ROL : 2 | NUME ROL : Moderator ID ROL : 1 | NUME ROL : Utilizator Premium ID ROL : 3 | NUME ROL : Super Moderator } }COLECTIA DE FISIERE A FOST ELIBERATA CU SUCCES !! OBS 1 ** : PRIMELE 3 SUNT INSERATE (2->1->0) IAR ULTIMELE 3 (3->4->5) (VA ORIENTATI DUPA ID-URI) !! NOTA ** : DACA INTERVIN COMPLICATII , PM ME SAU REPLY !
Postări Recomandate