Tri de tableau de structure

samhmi Messages postés 2 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 24 février 2009 - 24 févr. 2009 à 12:26
samhmi Messages postés 2 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 24 février 2009 - 24 févr. 2009 à 17:04
Je veux trier un tableau de structure selon le degre décroissant tel que chaque case est de structure suivante
struct sommet
{
    int degré;
    int arc[10];
}
lors de l'affichage des arcs j'ai un problème.

2 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
24 févr. 2009 à 13:32
il te suffit de faire un qsort.

qsort(tableau, nombre, sizeof(struct sommet), fonction_comparatrice);
0
samhmi Messages postés 2 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 24 février 2009
24 févr. 2009 à 17:04
J'ai utilisé un tri par sélection, le résultat est bon pour les degrés mais pour les arcs ne marche pas
voici mon code:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
 typedef struct
      {
        int degre;
        int arc[10];
      } sommet;
void remplir( sommet tab[],int U1[],int k,int n);
int remplissage(int n,int k,int debut[],int fin[],int M[10][10]);
void  tri( sommet tab[],int n);
int maxi(int a,int b);
main()
{
   
      int i,n,k,t,p,q;
      int j=0,max=0;
     sommet tab[10];
      FILE *fp;
      char name[FILENAME_MAX];
      char s[100];
     
      int debut[10];
      int fin[10];
     
     int U[10];
      int U1[10],U2[10],debut1[10],fin1[10];
      int M[10][10],A[10][10];
      printf("donner le nom de fichier: ");
                     scanf("%s",name);
            fp=fopen(name,"r");
             if (fp== NULL) {
                          printf("erreur");
                           return 1;
                                }
                           
         if(fp)
          {
             while(!(fscanf(fp,"%d %d", &debut[j],&fin[j]) == EOF))
                  {
                                  printf("%d %d\n", debut[j],fin[j]);
                                  U[j]=j+1;
                                j++;
                                  }
                  fclose(fp);
           
          }                 
            k=j;
            p=debut[0];
      for(i=0;i<=k-1;i++)
      {
      if(debut[i]>=p)
      p=debut[i];
       }
       q=fin[0];
       for(i=0;i<=k-1;i++)
      {
      if(fin[i]>=q)
      q=fin[i];
       } 
       if(p>=q)
       n=p;
       else n=q;   
  printf(" le nombre des sommet est:%d\n",n);

  printf("le nombre des arcs est:%d\n",k);
 
  printf("MATRICE D'INCIDENCE\n");
  remplissage(n, k, debut, fin,M) ;  

     
  // algo 2   
          for(i=0;i<=n-1;i++)
          {
              tab[i].degre=0;              
             for(j=0,t=0;j<=k-1||t<=k-1;j++,t++)
             {
                 if(M[i][j]==1||M[i][j]==-1)
                 {
                   tab[i].degre++;
                   tab[i].arc[t]=j+1;
                   printf(" ARC %2d :",tab[i].arc[t]);
                  }
             }
             printf("%2d\n",tab[i].degre);
          }
        
   
          tri(tab,n);
         remplir(tab,U1,k,n);
          getch();
          return(0);

 }

 void tri( sommet tab[10],int n)
  {
      int i,t,j,max,l;
       int c;
      int f;
     for(i=0;i<=n-1;i++)
   {
     max=i;
      int d[10];
      for(j=i+1;j<=n-1;j++)
     {
        if(tab[j].degre>tab[max].degre)
        {
          max=j;
          if(max!=i)
           {
          //copie champ par champ
            c=tab[i].degre;
             for(t=0;t<=tab[i].degre-1;t++)
             {
             d[t]=tab[i].arc[t];
            
             }
            
           tab[i].degre=tab[j].degre;
            l=maxi(tab[i].degre,tab[j].degre);
          for(t=0;t<=l;t++)
             {
       
        tab[i].arc[t]=tab[j].arc[t];
        
       
            
             }
            tab[j].degre=c;
            for(t=0;t<= tab[j].degre-1;t++)
            {
             tab[j].arc[t]=d[t];
            
             }
            
           }
        }
       
      }
       
    
    }
    for(i=0;i<=n-1;i++)
    {
         for(t=0;t<=1;t++)
       printf("ARC %d :",tab[i].arc[t]);
     
     printf("DEGRE %d ",tab[i].degre);
        printf("\n");
     }
   }                               
 void  remplir( sommet tab[10],int U1[10],int k,int n)
  {
     int i,j,t;
     int  B[]={0,0,0,0,0,0};
  
    for(i=0,j=0;i<=n-1&&j<=k-1;i++,j++)
     {
         if (B[j]==0)
         {
            for(t=0;t<=(tab[i].degre)-1;t++)
           {  
             U1[j]=tab[i].arc[t];
             B[j]=1;
           
           }
          printf("U1 %d ",U1[j]);
         
       }
  }
}
 
  int remplissage(int n,int k,int debut[],int fin[],int M[10][10])
    {
      int i,j,l;
 
      for(j=0,l=0;j<=k-1 &&l<=k;j++,l++)
        {
           for(i=0;i<=n-1;i++)
            {
               if(fin[l]==i+1 && j==l)
               M[i][j]=-1;

            else  if(debut[l]==i+1 && j==l )
                  M[i][j]=1;

            else
                  M[i][j]=0;

             }
        }
            for(i=0;i<=n-1;i++)
             {
                 for(j=0;j<=k-1;j++)
                  {
                   if(M[i][j]==-1)                
                     printf("%d ", M[i][j]);
                   else  printf(" %d ", M[i][j]); 
                  }
                printf("\n");
             }    
         }

      int maxi(int a,int b)
      {
         
        if(b>=a)
        return b;
        else return a;
          }
0
Rejoignez-nous