|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 9
|
[C] ordinare i dati allocati sullo heap
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...
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
cioè devi ordinare un array di struct?
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 9
|
nono devo ordinare una serie di elementi allocati sulla memoria dinamica...quindi si tengono "uniti" attraverso i puntatori...niente array
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
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: Codice:
#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;
}
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
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 |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 9
|
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?? |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 9
|
questo è il punto...come faccio ad ordinare la lista??
Ultima modifica di ghuighuoz91 : 06-01-2011 alle 18:17. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
http://www.manpagez.com/man/3/qsort/ |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:31.




















