Sari la conținut

Postări Recomandate

  • Moderators
Postat

** 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 !

 

Vizitator
Acest topic este acum închis pentru alte răspunsuri.
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Termeni de Utilizare & Politică Intimitate