Le décalage des éléments de rang supérieur à i dans un tableau
leilamoncif
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je suis debutante en langage et j'aimerais faire un programme qui l'insertion suivante:
Soit un tableau de taille N si l'on souhaite ajouter un élément en i ème position il faut décaler tous les éléments de rang supèrieur à i.
Prière de m'aider.
je suis debutante en langage et j'aimerais faire un programme qui l'insertion suivante:
Soit un tableau de taille N si l'on souhaite ajouter un élément en i ème position il faut décaler tous les éléments de rang supèrieur à i.
Prière de m'aider.
A voir également:
- Le décalage des éléments de rang supérieur à i dans un tableau
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Dans le fichier, générez ce tableau automatiquement (tableau croisé dynamique ou table de pilote) à partir des quatre premières colonnes. - Guide
- Imprimer un tableau excel - Guide
5 réponses
J'ai tenté ça mais ça n'a pas marché
C'est programme en C mais il est incomplet,
#include <stdio.h>
#include <stdlib.h>
int inserer (liste *l, cell *c, int r)
{
list *tmp = l;
int j = 0;
while (tmp != NULL && j < r)
{
[tab] tmp = tmp->suiv;
[tab]j++;
}
c- >suiv = tmp- >suiv;
tmp- >suiv = c;
}
void main()
{
int lis *i, cel* o, a;
printf("%d",inserer(lis *i, cel* o, a)) ;
getch();
}
C'est programme en C mais il est incomplet,
#include <stdio.h>
#include <stdlib.h>
int inserer (liste *l, cell *c, int r)
{
list *tmp = l;
int j = 0;
while (tmp != NULL && j < r)
{
[tab] tmp = tmp->suiv;
[tab]j++;
}
c- >suiv = tmp- >suiv;
tmp- >suiv = c;
}
void main()
{
int lis *i, cel* o, a;
printf("%d",inserer(lis *i, cel* o, a)) ;
getch();
}
Bonsoir
@leilamoncif:j'aimerais faire un programme qui l'insertion suivante:
Soit un tableau de taille N si l'on souhaite ajouter un élément en i ème position il faut décaler tous les éléments de rang supèrieur à i.
Tableaux ou liste chainée ? (vue la fonction insertion )
Dans le cas d'un tableau, il suffit de faire comme l'exemple ci-dessous, mais dans le cas d'une liste, il faudrait chainer les informations à la position souhaitée et tout ce qui se situe après la position l'actuelle de I, seront respectivement tous à In + 1
à bientôt
@leilamoncif:j'aimerais faire un programme qui l'insertion suivante:
Soit un tableau de taille N si l'on souhaite ajouter un élément en i ème position il faut décaler tous les éléments de rang supèrieur à i.
Tableaux ou liste chainée ? (vue la fonction insertion )
Dans le cas d'un tableau, il suffit de faire comme l'exemple ci-dessous, mais dans le cas d'une liste, il faudrait chainer les informations à la position souhaitée et tout ce qui se situe après la position l'actuelle de I, seront respectivement tous à In + 1
#include <stdio.h> #include <stdlib.h> #define MAX 5 int main( void ){ short *p_short = NULL; unsigned int i = 0; /* Allocation */ p_short = (short*)calloc( MAX, sizeof(short) ); if( p_short == NULL ){ perror("Erreur Allocation\n"); exit( EXIT_FAILURE ); } /* Ajout des valeurs */ for( i = 0; i < MAX; i++ ) p_short[i] = (short)i; /* Affichage du tableau */ for( i = 0; i < MAX; i++ ) printf("%4d|(%d) = (%d) |\n",i+1, i, p_short[i] ); printf("--Fin tableaux origine--\n"); /* Ré-allocation */ p_short = (short*)realloc( p_short, (MAX*sizeof(short)) ); if( p_short == NULL ){ perror("Erreur réallocation\n"); exit( EXIT_FAILURE ); } /* Ajout i+1 élement */ for( i = 5; i < (MAX*2); i++ ) p_short[i] = (short)i; /* Affichage du tableau */ for( i = 0; i < (MAX*2); i++ ) printf("%4d|(%d) = (%d) |\n",i+1, i, p_short[i] ); free( p_short ); printf("--Fin tableaux modifier--\n"); return( EXIT_SUCCESS ); }
à bientôt
@sambia39, ton realloc n'augmente pas la taille allouée, car en ligne 28 le 2ème argument de realloc indique une taille (supposée nouvelle) de MAX*sizeof(short), ce qui est la même taille que la taille initialement allouée en ligne 12 avec le calloc (MAX éléments de taille sizeof(short) chacun). Du coup l'écriture en ligne 35 et la suite du code accède à des zones mémoire non allouées et provoque une erreur de segmentation.
Si tu veux insérer des données représentant deux fois la taille du tableau d'origine, ton realloc doit doubler la taille initiale avec un truc du genre
@fiddy, il me semble que le code de Sambia ne répond pas vraiment à l'énoncé, puisqu'il n'insère pas un élément en décalant les autres. Il ne donne donc pas une solution "pré-machée". Par contre, il illustre comment une allocation et réallocation de mémoire peut être utilisée pour augmenter la taille en mémoire d'un tableau, sous réserve de la correction ci-dessus.
@leilamoncif : je ne suis pas sûr que ton énoncé te demande de gérer des allocations de mémoire avec des pointeurs. Si ce n'est pas le cas, tu peux prévoir un tableau de départ avec une capacité plus grande que le nombre d'éléments de départ, pour pouvoir y insérer des éléments dans la limite de l'espace disponible. Cela peut simplifier ton code. Tu dois alors juste gérer le décalage. Prend une feuille de papier quadrillée et un crayon et vois comment tu insères un élément au milieu de cases consécutives numérotées, et reproduit cette logique dans ton programme.
Dal
Si tu veux insérer des données représentant deux fois la taille du tableau d'origine, ton realloc doit doubler la taille initiale avec un truc du genre
p_short = (short*)realloc( p_short, (MAX*2*sizeof(short)) );par exemple.
@fiddy, il me semble que le code de Sambia ne répond pas vraiment à l'énoncé, puisqu'il n'insère pas un élément en décalant les autres. Il ne donne donc pas une solution "pré-machée". Par contre, il illustre comment une allocation et réallocation de mémoire peut être utilisée pour augmenter la taille en mémoire d'un tableau, sous réserve de la correction ci-dessus.
@leilamoncif : je ne suis pas sûr que ton énoncé te demande de gérer des allocations de mémoire avec des pointeurs. Si ce n'est pas le cas, tu peux prévoir un tableau de départ avec une capacité plus grande que le nombre d'éléments de départ, pour pouvoir y insérer des éléments dans la limite de l'espace disponible. Cela peut simplifier ton code. Tu dois alors juste gérer le décalage. Prend une feuille de papier quadrillée et un crayon et vois comment tu insères un élément au milieu de cases consécutives numérotées, et reproduit cette logique dans ton programme.
Dal
Bonjour @Dal ;)
Exacte ,je n'ai pas mis le "*2" pour la réallocation (mais bien dans la boucle d'affectation qui suit l'instruction précédente) et comme à mon habitude je me précipite.
Cependant, pour qu'il puisse décale un élément du tableau il doit réallouer une taille suffisante afin de remplir tout le contenue de son tableau d'où l'exemple. Le reste c'est à lui de le faire( traitement du décalage) afin d'affecter chaque élément à la place souhaitée.
à bientôt
Exacte ,je n'ai pas mis le "*2" pour la réallocation (mais bien dans la boucle d'affectation qui suit l'instruction précédente) et comme à mon habitude je me précipite.
Cependant, pour qu'il puisse décale un élément du tableau il doit réallouer une taille suffisante afin de remplir tout le contenue de son tableau d'où l'exemple. Le reste c'est à lui de le faire( traitement du décalage) afin d'affecter chaque élément à la place souhaitée.
à bientôt
Salut sambia39 :-)
oui, ton exemple est un exemple d'usage de malloc / réalloc, avec des pointeurs et l'accès aux données par les indices de tableaux, pour obtenir un tableau de taille dynamique (pas un exemple réellement de décalage).
pour être complet sur l'usage de realloc, il y a une autre précaution souhaitable, qui est d'utiliser un pointeur intermédiaire pour y mettre le résultat de realloc, afin de ne pas écraser le premier pointeur avec le résultat de realloc (qui peut renvoyer NULL) tant que l'on n'a pas vérifié que la réallocation ne s'est pas déroulée sans erreurs (et pouvoir libérer cette mémoire si nécessaire, ou faire ce que l'on doit faire avec les données en mémoire).
autrement, le premier pointeur vers les données peut être perdu.
Dal
oui, ton exemple est un exemple d'usage de malloc / réalloc, avec des pointeurs et l'accès aux données par les indices de tableaux, pour obtenir un tableau de taille dynamique (pas un exemple réellement de décalage).
pour être complet sur l'usage de realloc, il y a une autre précaution souhaitable, qui est d'utiliser un pointeur intermédiaire pour y mettre le résultat de realloc, afin de ne pas écraser le premier pointeur avec le résultat de realloc (qui peut renvoyer NULL) tant que l'on n'a pas vérifié que la réallocation ne s'est pas déroulée sans erreurs (et pouvoir libérer cette mémoire si nécessaire, ou faire ce que l'on doit faire avec les données en mémoire).
autrement, le premier pointeur vers les données peut être perdu.
Dal
Merci pour la reponse mais si je pouvais eventuellement avoir ce que tu as mis en programme C, il s'agissait effectivement d'un tableau.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question