Les pointeurs
Passage par pointeur (~ 20mn)
Des tableaux et des pointeurs (~ 30mn)
que le monde est étrange
finalement le monde est logique
Gestion des paramètres (~ 20mn)
- le paramètre argc de la fonction main du programme ./mon-prog vaut 4.
- le paramètre argv est un pointeur vers un tableau, tel que argv[0] pointe vers la chaîne de caractère "./mon-prog", argv[1] pointe vers "1", etc...
Manipuler des chaîne de caractères (~ 20mn)
Le but de cet exercice est de manipuler des chaînes de caractères en C. Pour rappel, une chaîne de caractère est un tableau de char dont les cases contiennent les différentes lettres de la chaîne. Le caractère nul ('\0') est utilisé pour terminer la chaîne de caratère.
Il s'agit ici d'implémenter une fonction retournant le nombre de caractères d'une chaîne de caractères. La signature de la fonction est la suivante:
Implémentez la fonction string_length et vérifiez qu'elle retourne le bon résultat.
On souhaite maintenant implémenter la fonction string_cpy dont le prototype est le suivant:
Cette fonction copie au plus n caractères depuis src vers dest
Implémentez la fonction string_cpy et vérifiez son fonctionnement.
Il s'agit ici d'implémenter une fonction permettant de concaténer deux chaînes de caractères. La signature de la fonction à implémenter est la suivante:
La fonction string_concatenate ajoute les n premiers caractères de la chaîne src à la fin de la chaîne dest en écrasant le caractère nul ('\0'), puis en ajoutant un nouveau caractère nul final.
Par exemple, le programme suivant:
devrait afficher:
Implémentez la fonction string_concatenate en vous servant des fonctions string_length et string_cpy.
Pour implémenter cette fonction, calculez la taille de la chaîne dest (en utilisant string_length). Cette taille correspond à l'indice du tableau dest où copier la chaîne src. Vous pouvez donc calculer l'adresse à passer en argument à string_cpy.Une liste chaînée (~ 80mn, exercice difficile, mais essentiel dans ce cours)
- un pointeur nommé next pointant vers le nœud suivant de la liste,
- et un élément nommé element, c'est à dire un tableau de 256 caractères dans notre cas.
Nous mettons maintenant en œuvre une fonction nommée insert d'insertion dans la liste chaînée. Cette fonction doit insérer une chaîne de caractères de façon à ce que la liste soit triée dans l'ordre lexicographique. Nous mettons en œuvre cette fonction progressivement étape par étape.
Commencez par écrire une fonction insert prenant deux paramètres :
- un pointeur vers un nœud, nommé list (struct node* list),
- une chaîne de caractères nommée str à insérer dans la liste.
La fonction commence par créer un nœud new_node en appelant la fonction create. Ensuite, trois cas sont à prendre en compte:
- insertion dans une liste vide: dans ce cas, le nœud suivant new_node est NULL, et la liste débute à new_node
- insertion avant le début de la liste: dans ce cas, le nœud suivant new_node est le premier nœud de la liste, et la liste débute à new_node
- insertion après le premier nœud: dans ce cas, new_node est inséré entre 2 nœuds notés cur_node et next_node: le suivant de cur_node est new_node, et le suivant de new_node est next_node.
Dans un premier temps, implémentez la fonction insert de sorte qu'elle gère les deux premiers cas. Testez votre code en créant une liste vide, et en y insérant les nœuds "ccc", "bbb", et "aaa". Vérifiez avec la fonction display que le résultat est correct.
Maintenant que nous pouvons parcourir la liste, nous cherchons l'emplacement auquel il faut insérer la chaîne de caractères str.
Pour cela, nous allons utiliser deux pointeurs cur_node et next_node. cur_node est initialisé au premier élément de la liste, et next_node est le successeur de cur_node.
Modifiez la fonction pour parcourir la liste. Le parcours doit s'arrêter si:
- next_node atteint la fin de la liste,
- ou si l'élément suivant (next_node->element) est plus grand que str en utilisant l'ordre lexicographique.
Lorsque la boucle se termine, cur_node désigne le nœud précédent str (dans l'ordre lexicographique), et next_node le nœud suivant str (ou NULL si aucun élément n'est plus grand que str). Il ne vous reste plus qu'à insérer new_node entre cur_node et next_node.