Probleme tri a bulles avec pointeurs

Signaler
-
Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
-
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;
}
A voir également:

2 réponses

Messages postés
15932
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
9 juillet 2020
94
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.
Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
107
@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