tablica wskaźników do struktury a wywolanie qsort() z stdlib.h

0

Pytanie :

 
struct tnode {
    int count1;//ilosc wystapien danego wyrazu
    char *word;   //wskaznik do wyrazu
    struct tnode *left;
    struct tnode *right;//lewy i prawy potomek
} *list1[10000]; 
int porownanie (const void * a, const void * b)
{
    struct tnode *temp1 = (struct tnode *)a;
    struct tnode *temp2 = (struct tnode *)b;
    if((temp1->count1) < (temp2->count1))
        return -1;
    else if((temp1->count1) == (temp2->count1))
        return 0;
    else
        return 1;
}
void sortlist()
{
    qsort(list1, ntn, sizeof(struct tnode[0]), porownanie);
}

Chciałbym posegregowac tablice na podstawie list[n]->count1, powiedzmy rosnaco (tak jak powyzej byc powinno).
Problem: polega na tym, że nie wiem w jaki sposób w wywołaniu qsort odwołać się to count1.
Czy mógłby mi ktoś wyjaśnić ?

0

rzutowanie jest poprawne, nie ma takie typu jak tnode za to jest struktura tnode.
Problem w tym, że dla danych
xxx
xxx
xxx
xxx
xxx
aaa
aaa
aaa
zzz
zzz
ppp
fff
fff
fff
chce otrzymac wynik
5: xxx
3: aaa
3: fff
2: zzz
1: ppp
lub w odwrotnej kolejnosci (obojetne)
a otrzymuje mix w postaci
5: xxx
3: aaa
2: zzz
1: ppp
3: fff
Co jest nie tak z wywolaniem qsort?

0

Daj jakieś przykładowe dane, które można skompilować.

    if((temp1->count1) < (temp2->count1))
        return -1;
    else if((temp1->count1) == (temp2->count1))
        return 0;
    else
        return 1;

To można uprościć do

return temp1->count1 - temp2->count1;
0

Masz wszystko źle:

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

struct tnode
  {
   int count1;//ilosc wystapien danego wyrazu
   char *word;   //wskaznik do wyrazu
   struct tnode *left;
   struct tnode *right;//lewy i prawy potomek
  }*list1[10000];

int porownanie(const void *a,const void *b)
  {
   const struct tnode *A=*(const struct tnode **)a;
   const struct tnode *B=*(const struct tnode **)b;
   //printf("%d %s <==> %d %s\n",A->count1,A->word,B->count1,B->word);
   return ((A->count1)>(B->count1))-((A->count1)<(B->count1));
  }

struct tnode Tb[5]=
  {
   {50,"Eeee",NULL,NULL},
   {40,"Deee",NULL,NULL},
   {30,"Cccc",NULL,NULL},
   {20,"Bbbb",NULL,NULL},
   {10,"Aaaa",NULL,NULL},
  };
  
int main()
  {
   int i;
   list1[0]=&Tb[0];
   list1[1]=&Tb[1];
   list1[2]=&Tb[2];
   list1[3]=&Tb[3];
   list1[4]=&Tb[4];
   
   for(i=0;i<5;++i) printf("%d %s\n",list1[i]->count1,list1[i]->word);
   printf("\n");
   qsort(list1,5,sizeof(struct tnode *),porownanie);
   for(i=0;i<5;++i) printf("%d %s\n",list1[i]->count1,list1[i]->word);
   return 0;
  }
0

Dzięki Dragon !
Ostatnie pytanie: o zapis

 const struct tnode *A=*(const struct tnode **)a;

oznacza do stałego wskaźnika na strukture tnode zapisuje co takiego ? * przez nawiasem to operator wyłuskania ? w takim razie do wskaznika zapisujesz wartosc a nie adres?

0
const struct tnode **AA=(const struct tnode **)a;
const struct tnode *A=(*AA);

1 użytkowników online, w tym zalogowanych: 0, gości: 1