Tri de tableau de structure

Signaler
Messages postés
2
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
24 février 2009
-
Messages postés
2
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
24 février 2009
-
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

Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
il te suffit de faire un qsort.

qsort(tableau, nombre, sizeof(struct sommet), fonction_comparatrice);
Messages postés
2
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
24 février 2009

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;
          }