Probleme tri a bulles avec pointeurs

thyobes7 - 2 nov. 2014 à 13:44
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 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;
}

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
2 nov. 2014 à 14:04
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.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
2 nov. 2014 à 19:38
@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
0
Rejoignez-nous