Le décalage des éléments de rang supérieur à i dans un tableau

Fermé
leilamoncif Messages postés 5 Date d'inscription samedi 31 janvier 2015 Statut Membre Dernière intervention 25 mai 2015 - Modifié par leilamoncif le 31/01/2015 à 15:36
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 4 févr. 2015 à 13:05
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.

5 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
31 janv. 2015 à 16:19
0
leilamoncif Messages postés 5 Date d'inscription samedi 31 janvier 2015 Statut Membre Dernière intervention 25 mai 2015
31 janv. 2015 à 16:43
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();
}
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
31 janv. 2015 à 18:02
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
#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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
31 janv. 2015 à 21:45
Sambia39,
Je sais que c'est plus fort que toi, mais il faut se contenter d'aider pas de faire ;-).
Ce n'est pas leur rendre service.
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
31 janv. 2015 à 22:01
;) Fiddy
Ok, j'essayerais la prochaine fois de faire que le strict minimum, merci pour le conseil à bientôt
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 2/02/2015 à 12:18
@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
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
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
2 févr. 2015 à 16:10
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
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
3 févr. 2015 à 10:08
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
0
leilamoncif Messages postés 5 Date d'inscription samedi 31 janvier 2015 Statut Membre Dernière intervention 25 mai 2015
31 janv. 2015 à 18:44
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
31 janv. 2015 à 21:46
C'est du C ce que sambia39 a mis. À toi de t'en inspirer pour utiliser un tableau.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
leilamoncif Messages postés 5 Date d'inscription samedi 31 janvier 2015 Statut Membre Dernière intervention 25 mai 2015
1 févr. 2015 à 01:15
En tout cas merci Sambia39 :)
0