Probleme tri a bulles avec pointeurs

- - Dernière réponse : cptpingu
Messages postés
3798
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
13 novembre 2019
- 2 nov. 2014 à 19:38
SALUT TOUT LE MONDE

j'ai fait des algos de tri ( bulles , insertion , selection , qsort , shell )

mais avec des indices etc... sans pointeur , mais maintenant je veux bien faire tous ces tris avec les pointeurs ,

j'ai fait ce code la , certes il compile mais il ne fait pas son travail :/

je sais pas ou j'ai fait l'erreur :/

#include <stdio.h>
#include <stdlib.h>
 
 
void remp (int tab[] , int n)
{
 
    int *p;
    for(p=tab;p-tab<n;p++)
    {
        printf("T[%d] = ",p-tab);
        scanf("%d",p);
    }
 
 
}
 
 
int main()
{
int n,temp;
 
int tab ;
 
int *p;
 
int *pt;
 
*p==NULL;
*pt==NULL;
p=tab;
pt=tab;
printf("enter taille du tab : ");
scanf("%d",&n);
 
tab=(int*)malloc(n*sizeof(int));
 
    remp(tab,n);
 
 
 
 
 
for (p=n-1;p-tab>0;p--)
{
    for(pt=0;pt-tab<p;pt++)
    if (*pt<*(pt+1))
    {
        temp=*pt;
        *pt=*(pt+1);
        *(pt+1)=temp;
    }
}
 
 
 
printf("le tableau apres tri : ");
for (p=tab;p-tab<n;p++)
printf("%d",*p);
 
 
free(tab);
 
return 0;
}
Afficher la suite 

2 réponses

Messages postés
16073
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
13 novembre 2019
88
0
Merci
Bonjour,

Je ne suis pas forcément le plus à l'aise en C, mais si je comprends bien tu as juste remplacer un int[] par un int* mais ça ne veut pas dire que tu tries avec des pointeurs, car ce que tu déplaces ce sont toujours les valeurs du tableau, pas des pointeurs.

Il faudrait plutôt que tu ais un (int*)[] où chaque case serait un pointeur, et où tu comparerais la valeur associée au pointeur mais déplacerais uniquement le pointeur.

Remarque : dans l'absolu utiliser des pointeurs pour des int c'est overkill.
Commenter la réponse de KX
Messages postés
3798
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
13 novembre 2019
90
0
Merci
@KX: Ce qu'il a fait, lui permet bien d'utiliser des pointeurs (ou plutôt un arithmétique des pointeurs) au lieu d'un accès indexé (il ne parle pas changer le type contenu dans le tableau de int vers int*, mais de manipuler un tableau en mode pointeurs et non en mode indexé).
Je pense qu'il veut utiliser des pointeurs pour des int, uniquement parce que ça doit être un exercice scolaire. Il y n'y pas de réel avantage d'une méthode à l'autre.

@thyobes7: Le souci que tu as, est que tu ne sembles pas à l'aise avec les pointeurs. Ca se voit à l'écriture "for (p = n - 1". "p" étant un pointeur, et "n" un entier, ça commence déjà mal... Il aurait fallu écrire p = tab + n - 1. Je me suis permis de réécrire la partie de tri, pour coller un peu plus à ce qu'on attend généralement par un tri utilisant de l'arithmétique de pointeurs.

#include <stdio.h>
#include <stdlib.h>

void swap(int* a, int* b)
{
  int tmp = *a;
  *a = *b;
  *b = tmp;
}

void bubble_sort(int* tab, int size)
{
  int* p = tab;
  int* end = tab + size;
  int any_change = 1;
  while (any_change)
  {
      p = tab;
      any_change = 0;
      while (p != end - 1)
      {
        if (*p > *(p + 1))
        {
          swap(p, p + 1);
          any_change = 1;
        }
        ++p;
      }
  }
}

void show(int* tab, int size)
{
  int i = 0;
  for (i = 0; i < size; ++i)
    printf("%i ", tab[i]);
  printf("\n");
}

int main()
{
  int tab[] = {8, 3, 1, 5, 2};
  int size = sizeof (tab) / sizeof (*tab);
  int* alloc_tab = malloc(3 * sizeof (int));
  alloc_tab[0] = 3;
  alloc_tab[1] = 1;
  alloc_tab[2] = 2;

  show(tab, size);
  bubble_sort(tab, size);
  show(tab, size);

  show(alloc_tab, 3);
  bubble_sort(alloc_tab, 3);
  show(alloc_tab, 3);

  free(alloc_tab);

  return 0;
}



__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu