Programmation bas niveau (BNV) Help

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); }

Télécharger la correction

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); }

Télécharger la correction

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); }

Télécharger la correction

29 September 2025