Understanding Data Structures in C: A Comprehensive Guide
Salmane Koraichi
Computer Science & AI </> | Building Inclusive AI & Dev Communities to Drive Innovation | Co-Founder @CoursAi
Data structures are fundamental components of computer science and programming, enabling efficient storage and manipulation of data. They serve as building blocks for algorithms and play a crucial role in software development. In this article, we will explore data structures in C, one of the most widely used programming languages for system-level and embedded programming.
What are Data Structures?
In computer science, data structures are specialized formats or containers designed to organize, store, and manipulate data efficiently. They are essential for solving various real-world problems and optimizing algorithm performance. Data structures can be classified into two main categories:
Common Data Structures in C
Let's delve into some commonly used data structures in C:
1. Arrays
Arrays are a collection of elements of the same data type, stored in contiguous memory locations. They provide efficient random access to elements using an index.
int myArray[5] = {1, 2, 3, 4, 5};
2. Linked Lists
Linked lists are dynamic data structures composed of nodes, each containing data and a reference (pointer) to the next node. They are used when dynamic memory allocation is required.
struct Node {
int data;
struct Node* next;
};
3. Stacks
Stacks follow the Last-In-First-Out (LIFO) principle and are often used for tasks like function call management and expression evaluation.
// Using an array-based stack
#define MAX_SIZE 100
int stack[MAX_SIZE];
int top = -1;
4. Queues
Queues adhere to the First-In-First-Out (FIFO) principle and are commonly used for tasks like process scheduling.
领英推荐
// Using an array-based queue
#define MAX_SIZE 100
int queue[MAX_SIZE];
int front = -1, rear = -1;
5. Trees
Trees are hierarchical data structures with nodes connected by edges. They find applications in various fields, including database indexing and filesystems.
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
6. Graphs
Graphs consist of vertices and edges and are used to model relationships between various entities, such as social networks and transportation systems.
// Using an adjacency list representation
struct Graph {
int V;
struct Node** adjList;
};
Advantages of Data Structures
Data structures offer several advantages in software development:
Challenges and Considerations
While data structures are powerful tools, they also present challenges:
Conclusion
Data structures are the backbone of computer science and programming. In C, understanding and implementing data structures efficiently can greatly enhance your ability to solve complex problems and write high-performance code. Whether you're building a simple application or working on a large-scale system, mastering data structures is a key step toward becoming a proficient programmer.
Some code notes : ( liked list ) .
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct {
char * Nom ;
float Note ;
}Etudiant;
struct Cellule {
Etudiant Eleve ;
struct Cellule * Next ;
} ;
typedef struct Cellule * Liste ;
void Lire_Etudiant(Etudiant* Etu){
char temp[40];
printf(" Nom : ");
scanf("%s",temp);
Etu->Nom=(char*) malloc((strlen(temp)+1)*sizeof(char));
strcpy(Etu->Nom,temp);
printf(" Note : ");
scanf("%f",&(Etu->Note));
}
Etudiant Read_Student(void){
Etudiant Etu ;
char temp[40];
printf(" Nom : ");
scanf("%s",temp);
Etu.Nom=(char*) malloc((strlen(temp)+1)*sizeof(char));
strcpy(Etu.Nom,temp);
printf(" Note : ");
scanf("%f",&(Etu.Note));
return Etu ;
}
Etudiant Read_StudentBis(char* temp , float Mark){
Etudiant Etu ;
Etu.Nom=(char*) malloc((strlen(temp)+1)*sizeof(char));
strcpy(Etu.Nom,temp);
Etu.Note = Mark ;
return Etu ;
}
void Write_Student(Etudiant E){
printf(" %s ==> %.2f \n",E.Nom,E.Note);
}
Etudiant* Read_Array_Student(int* Taille){
Etudiant * Filiere ;
int i ;
printf(" Nbre d'étudaints :"); scanf("%d",Taille);
Filiere = (Etudiant*) malloc((*Taille)*sizeof(Etudiant));
for(i=0 ; i< (*Taille) ; i++)
{
printf("ETUDIANT %d :\n",i+1);
Filiere[i]=Read_Student();
}
return Filiere ;
}
void Write_Array_Student(Etudiant* Filiere , int Taille){
int i ;
printf(" LISTE DES ETUDIANTS \n");
for(i=0 ; i< Taille ; i++){
Write_Student(Filiere[i]);
}
}
Liste Create_Student(Etudiant Etu){
Liste Nv ;
Nv = (Liste) malloc(sizeof (struct Cellule));
Nv->Eleve =Etu ;
Nv->Next = NULL ;
return Nv ;
}
Liste To_List(Etudiant* Filiere , int Taille){
Liste LF =NULL , Nv , p; int i ;
for(i=0 ; i< Taille ; i++){
Nv = Create_Student(Filiere[i]);
if(LF==NULL) LF=Nv ;
else {
for(p=LF ; p->Next!=NULL ; p=p->Next);// je suis en fin de liste
p->Next = Nv ; }}
return LF ;}
void Display_List(Liste L){
Liste p ;
printf(" Linked List of students \n");
for(p = L ; p ; p=p->Next)
printf(" %s %.2f \n",p->Eleve.Nom, p->Eleve.Note);
}
Liste Insert_Croissant(Liste L , Etudiant Etu)
{ Liste p ,q ;
Liste Nv = Create_Student(Etu);
if(!L) return Nv ; // Liste est vide
// Liste non vide
if(strcmp(L->Eleve.Nom,Etu.Nom)>=0){
Nv->Next = L ; return Nv ; }
for(p = L ; p && strcmp(p->Eleve.Nom,Etu.Nom)<=0 ; q=p ,p=p->Next);
if(p!=NULL) // Inserer au milieu
{
Nv->Next = p ; q->Next = Nv ;
}
else // Inserer en fin de liste
q->Next= Nv ;
return L ;
}
Liste To_List_SortByName(Etudiant* Filiere, int Taille){
Liste LT=NULL , L =NULL ,p;
L= To_List(Filiere,Taille);
// Passer d'une liste L non triée à une liste triée
for(p=L ; p ; p=p->Next){
LT = Insert_Croissant(LT,p->Eleve);
}
return LT ;
}
Liste Search(Liste L , char * Nom){
Liste p ;
for(p=L ; p && strcmp(p->Eleve.Nom,Nom)!=0 ; p=p->Next) ;
return p ;
}
int main()
{
/*
* Partie 1 :
* Etudiant A ={"ALI",17};
Write_Student(A);
Lire_Etudiant(&A);
Write_Student(A);*/
/* Partie 2 :
* Etudiant A ,B;
char Name[30]; float Note ;
A=Read_Student();
B= Read_StudentBis("HIBA",18);
Write_Student(A);
Write_Student(B);
printf(" Name : "); scanf("%s",Name);
printf(" Note : "); scanf("%f",&Note);
A= Read_StudentBis(Name,Note);
Write_Student(A);
*/
Etudiant * GINF1 ; Liste LGINF1=NULL , LT=NULL ;
int Nbre=10 ;
GINF1 = Read_Array_Student(&Nbre);
Write_Array_Student(GINF1,Nbre);
LGINF1= To_List(GINF1,Nbre);
Display_List(LGINF1);
LT = To_List_SortByName(GINF1,Nbre);
Display_List(LT);
return 0 ;
}