Correction : Les listes chaînées
Correction Exercice 1
Objectif : créer une liste, la remplir et la parcourir
# Makefile
NAME = ex-1
SRCS = main.c \
list.c \
all : $(NAME)
$(NAME): $(SRCS)
gcc $(SRCS) -o $(NAME)
fclean:
rm -f $(NAME)
re: fclean all
#ifndef __EX_1_H__
#define __EX_1_H__
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
typedef struct s_number number;
struct s_number {
int value;
number *next;
};
/* list.c */
number *create_list(int value);
void add_to_list(number **list, int value);
void display_list(number **list);
void delete_list(number **list);
#endif
#include "ex-1.h"
number *create_list(int value)
{
number *list = malloc(sizeof(*list));
list->next = NULL;
list->value = value;
return list;
}
void add_to_list(number **list, int value)
{
number *tmp = *list;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
number *item = malloc(sizeof(*item));
item->next = NULL;
item->value = value;
tmp->next = item;
}
void display_list(number **list)
{
number *tmp = *list;
printf("\nLa liste : \n\n");
while(tmp != NULL)
{
printf("%d\n", tmp->value);
tmp = tmp->next;
}
}
void delete_list(number **list)
{
number *tmp = *list;
while(tmp != NULL)
{
number *to_remove = tmp;
tmp = tmp->next;
free(to_remove);
}
}
#include "ex-1.h"
int main()
{
int nb;
int cmd;
number *list;
printf("Veuillez saisir le premier nombre : \n");
scanf("%d", &nb);
list = create_list(nb);
while(cmd != 3)
{
printf("\n\nQue souhaitez-vous faire :\n\nAjouter un nombre (1)\nAfficher la liste (2)\nQuitter le programme(3)\nEffacer l'écran (4)\n");
scanf("%d", &cmd);
if(cmd == 1)
{
printf("Saisissez le nombre à ajouter : \n");
scanf("%d", &nb);
add_to_list(&list, nb);
}
else if(cmd == 2)
{
display_list(&list);
}
else if(cmd == 3)
{
delete_list(&list);
}
else if(cmd == 4)
{
system("clear");
}
else
{
printf("Commande %c invalide\n", cmd);
}
}
return(0);
}
Correction Exercice 2
Objectif : créer une fonction qui permet d'insérer un maillon à un endroit précis d'une liste
# Makefile
NAME = ex-2
SRCS = main.c \
list.c \
all : $(NAME)
$(NAME): $(SRCS)
gcc $(SRCS) -o $(NAME)
fclean:
rm -f $(NAME)
re: fclean all
#ifndef __EX_2_H__
#define __EX_2_H__
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
typedef struct s_number number;
struct s_number {
int value;
number *next;
};
/* list.c */
number *create_list(int value);
void add_to_list(number **list, int value);
void display_list(number **list);
void delete_list(number **list);
void insert_after(number **link, int value);
#endif
#include "ex-2.h"
number *create_list(int value)
{
number *list = malloc(sizeof(*list));
list->next = NULL;
list->value = value;
return list;
}
void add_to_list(number **list, int value)
{
number *tmp = *list;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
number *item = malloc(sizeof(*item));
item->next = NULL;
item->value = value;
tmp->next = item;
}
void insert_after(number **link, int value)
{
number *tmp = *link;
number *item = malloc(sizeof(*item));
item->next = tmp->next;
item->value = value;
tmp->next = item;
}
void display_list(number **list)
{
number *tmp = *list;
printf("\nLa liste : \n\n");
while(tmp != NULL)
{
printf("%d\n", tmp->value);
tmp = tmp->next;
}
}
void delete_list(number **list)
{
number *tmp = *list;
while(tmp != NULL)
{
number *to_remove = tmp;
tmp = tmp->next;
free(to_remove);
}
}
#include "ex-2.h"
int main()
{
number *list;
list = create_list(42);
printf("Remplir la liste avec les nombres suivants : 42, 28, 91, -7\n");
add_to_list(&list, 28);
add_to_list(&list, 36);
add_to_list(&list, 91);
add_to_list(&list, 152);
display_list(&list);
number *tmp = list;
number *link;
while(tmp != NULL)
{
if(tmp->value == 91)
{
link = tmp;
}
tmp = tmp->next;
}
printf("Ajouter le nombre 47 juste après 91\n");
insert_after(&link, 47);
display_list(&list);
return(0);
}
Correction Exercice 3
Objectif : réutiliser l'exercice 1 et l'exercice 2 pour créer une liste qui trie automatiquement les nombres
# Makefile
NAME = ex-3
SRCS = main.c \
list.c \
all : $(NAME)
$(NAME): $(SRCS)
gcc $(SRCS) -o $(NAME)
fclean:
rm -f $(NAME)
re: fclean all
#ifndef __EX_3_H__
#define __EX_3_H__
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
typedef struct s_number number;
struct s_number {
int value;
number *next;
};
/* list.c */
number *create_list(int value);
void add_to_list(number **list, int value);
void display_list(number **list);
void delete_list(number **list);
void sort_in_list(number **list, int value);
#endif
#include "ex-3.h"
number *create_list(int value)
{
number *list = malloc(sizeof(*list));
list->next = NULL;
list->value = value;
return list;
}
void sort_in_list(number **list, int value)
{
number *tmp = *list;
number *before;
if(tmp->value > value)
{
number *item = malloc(sizeof(*item));
item->value = value;
item->next = tmp;
*list = item;
}
else if(tmp->next->value > value)
{
number *item = malloc(sizeof(*item));
item->value = value;
item->next = tmp->next;
tmp->next = item;
}
else
{
while(tmp != NULL)
{
if(tmp->next != NULL)
{
if(tmp->next->value > value)
{
before = tmp;
number *item = malloc(sizeof(*item));
item->value = value;
item->next = before->next;
before->next = item;
break;
}
}
else
{
number *item = malloc(sizeof(*item));
item->value = value;
item->next = NULL;
tmp->next = item;
break;
}
tmp = tmp->next;
}
}
}
void add_to_list(number **list, int value)
{
number *tmp = *list;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
number *item = malloc(sizeof(*item));
item->next = NULL;
item->value = value;
tmp->next = item;
}
void insert_after(number **link, int value)
{
number *tmp = *link;
number *item = malloc(sizeof(*item));
item->next = tmp->next;
item->value = value;
tmp->next = item;
}
void display_list(number **list)
{
number *tmp = *list;
printf("\nLa liste : \n\n");
while(tmp != NULL)
{
printf("%d\n", tmp->value);
tmp = tmp->next;
}
}
void delete_list(number **list)
{
number *tmp = *list;
while(tmp != NULL)
{
number *to_remove = tmp;
tmp = tmp->next;
free(to_remove);
}
}
#include "ex-3.h"
int main()
{
int nb;
int cmd;
number *list;
printf("Veuillez saisir le premier nombre : \n");
scanf("%d", &nb);
list = create_list(nb);
while(cmd != 3)
{
printf("\n\nQue souhaitez-vous faire :\n\nAjouter un nombre (1)\nAfficher la liste (2)\nQuitter le programme(3)\nEffacer l'écran (4)\n");
scanf("%d", &cmd);
if(cmd == 1)
{
printf("Saisissez le nombre à ajouter : \n");
scanf("%d", &nb);
sort_in_list(&list, nb);
}
else if(cmd == 2)
{
display_list(&list);
}
else if(cmd == 3)
{
delete_list(&list);
}
else if(cmd == 4)
{
system("clear");
}
else
{
printf("Commande %c invalide\n", cmd);
}
}
return(0);
}
29 September 2025