View Full Version : [C] ordinare i dati allocati sullo heap
ghuighuoz91
05-01-2011, 20:38
ho bisogno di un piccolo aiuto: ho bisogno di creare in funzione che mi faccia ordinare gli elementi allocati sullo heap...si tratta di elementi formati da un tipo di dato creato atrtaverso lo struct quindi non di tipi omogenei...come posso fare??tutto questi in programmazione c...ringrazio anticipatamente...
cioè devi ordinare un array di struct?
ghuighuoz91
05-01-2011, 22:46
nono devo ordinare una serie di elementi allocati sulla memoria dinamica...quindi si tengono "uniti" attraverso i puntatori...niente array
scusa ma che intendi per "ordinare" allora? nel senso, in un array c'è un ordinamento nel senso che c'è un elemento di indice 0, uno di indice 1 etc.. tu che devi fare? stampare qualcosa o boh?
ad ogni modo ti conviene creare un array di puntatori alla struttura e ordinare usando qsort (chiaramente se ha senso definire qualche ordinamento totale)
esempio:
#include <stdlib.h>
#include <stdio.h>
#define N 3
typedef struct
{
int k;
char v;
} mystruct;
/*
La funzione che definisce l'ordinamento dell'array, un valore di ritorno
negativo equivale ad a<b e un valore di ritorno negativo equivale a>b (0 vuol dire a=b).
Ovviamente basta invertire il risultato per ordinare in modo decrescente.
*/
int CompareMyStruct(const void *a, const void *b);
int main(int argc, char *argv)
{
mystruct *a = malloc(sizeof(mystruct));
mystruct *b = malloc(sizeof(mystruct));
mystruct *c = malloc(sizeof(mystruct));
a->k = 12;
a->v = 'c';
b->k = 4;
b->v = '!';
c->k = 16;
c->v = 'Z';
if (!a || !b || !c)
{
return 1;
}
mystruct *array[N] = {
a,
b,
c
};
qsort(array, N, sizeof(mystruct*), CompareMyStruct);
int i;
for (i = 0; i < N; i++)
{
printf("{%d, %c}\n", array[i]->k, array[i]->v);
}
return 0;
}
int CompareMyStruct(const void *a, const void *b)
{
const mystruct *x, *y;
x = *((const mystruct**)a);
y = *((const mystruct**)b);
// In questo caso ordiniamo in base al valore del campo k
return x->k - y->k;
}
Cosa intendi per ordinare?
- Se vuoi che i vari oggetti (allocati dinamicamente in tempi diversi) siano in posizioni consecutive in memoria, credo sia necessario riallocare tutto;
- Se vuoi ordinare i puntatori (cioè tenerli in una stessa struttura di memoria) ti basta un vector o una lista, o anche un array.
- Se hai già un array o una lista che contiene i puntatori e vuoi ordinarli (nel senso stretto del termine, diciamo sortarli) ti basta ordinarlo come faresti con un normale array/lista/quello che è.
EDIT: ops, sono stato troppo lento :P
ghuighuoz91
05-01-2011, 23:16
faccio un esempio di quello che mi interessa perchè non c'ho capito molto xD
questa è una funzione di inserimento dati:
Funz *B(CFunz C){
CFunz alfa;
alfa=(alfa)malloc(sizeof(alfa);
strcpy(a, alfa->e.beta);
...
ora come faccio ad ordinare gli elementi secondo beta??cioè sei inserisco ciao e dopo alla che algoritmo devo scrivere per poterli ordinare??oppure prima che li inserisco??
ghuighuoz91
06-01-2011, 17:18
- Se hai già un array o una lista che contiene i puntatori e vuoi ordinarli (nel senso stretto del termine, diciamo sortarli) ti basta ordinarlo come faresti con un normale array/lista/quello che è.
questo è il punto...come faccio ad ordinare la lista??
clockover
07-01-2011, 01:18
questo è il punto...come faccio ad ordinare la lista??
come già ti ha detto tuccio usa qsort o qualche altro algoritmo a tua scelta
http://www.manpagez.com/man/3/qsort/
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.