Ho cercato di sintetizzare al minimo il codice..
priorityqueue.h:
#ifndef PRIORITYQUEUE_H_INCLUDED
#define PRIORITYQUEUE_H_INCLUDED
typedef struct priorityQueue * PQUEUE;
/*** CALLBACK AL TIPO DI DATO ***/
typedef int (*COMPAREDATA)(void * , void * ); //confronta due elementi e restituisce -1, 0, 1
typedef void (*PRINTDATA) (void *); //visualizza al video il contenuto di un elemento
typedef void * (*INPUTDATA) (void); //legge un elemento dallo stdin
/*** CALLBACK AL TIPO DI STRUTTURA DATI CON CUI E' IMPLEMENTATA LA CODA ***/
typedef void (*PRINT) (void *, PRINTDATA);
typedef void * (*GETOBJECT) (void *, int);
typedef void (*SETOBJECT) (void **,int, void *);
typedef int (*GETPRIORITY) (void*,void*,COMPAREDATA);
/*** FUNZIONI PER GESTIRE UNA CODA A PRIORITA' ***/
PQUEUE insertKey (PQUEUE Q, void * k,GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData);
PQUEUE increaseKey (void * Q, int i, void * k, GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData);
int parent(int i);
/*** Funzioni ausiliari ***/
void * getInput(void); //Legge l'input da tastiera
#endif // PRIORITYQUEUE_H_INCLUDED
priorityqueue.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "priorityqueue.h"
#include "array.h"
typedef struct priorityQueue{
void * coda;
int heapsize;
}priorityQueue;
void * getInput(void){
int i; char c; int j=0;
char * str=malloc(80*sizeof(char));
char buffer[80];
if((c=getchar())!= '\n') //per liberare stdin dalla pressione di invio
buffer[j++]=c;
for(i=j; ((c=getchar())!='\n') && (i<80); i++)
buffer[i]=c;
buffer[i] = '\0';
strcpy(str,buffer);
return str;
}
PQUEUE insertKey (PQUEUE Q, void * k,GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData){
if(Q==NULL){
Q=(priorityQueue*)malloc(sizeof(priorityQueue));
Q->coda=NULL;
Q->heapsize=0;
}
Q->heapsize=Q->heapsize+1;
Q->coda=increaseKey(Q->coda,Q->heapsize,k,getObject,setObject,compareData);
return Q;
}
PQUEUE increaseKey (void * Q, int i, void * k, GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData){
setObject(&Q,i,k);
while( (i>1) && ( compareData(getObject(Q,parent(i)),getObject(Q,i)) < 0 ) ){
void * tmp=getObject(Q,i);
setObject(&Q,i,getObject(Q,parent(i)));
setObject(&Q,parent(i), tmp);
i=parent(i);
}
return Q;
}
int parent(int i){
return i/2;
}
array.h:
#ifndef ARRAY_H_INCLUDED
#define ARRAY_H_INCLUDED
typedef struct qArray * ARRAY;
ARRAY initARRAY (ARRAY a);
void * insertARRAY (void * A, void * k);
void setObjectARRAY (void ** A, int i, void * k);
void * getObjectARRAY(void * A, int i);
#endif // ARRAY_H_INCLUDED
array.c:
#include <stdio.h>
#include <stdlib.h>
#include "priorityqueue.h"
#include "array.h"
#define ARRAY_INITIAL_CAPACITY 3 //capacità iniziale dell'array
typedef struct qArray{
void ** data; //puntatore ad array di void //GETPRIORITY TORNA L'INDICE /GETDATO TORNA IL DATO
int size; //dimensione corrente dell'array
int capacity;//capacità totale dell'array
}qArray;
ARRAY initARRAY (ARRAY a){
a=(qArray*)malloc(sizeof(qArray));
a->size=0;
a->capacity=ARRAY_INITIAL_CAPACITY;
a->data=(void**)malloc(sizeof(void*)*a->capacity);
return a;
}
void setObjectARRAY (void ** A, int i, void * k){
ARRAY *a=(ARRAY*)A;
if(*a==NULL) //inizializzo
*a=initARRAY(*a);
if((*a)->capacity <= (*a)->size){//controllo che ci sia spazio
//rialloco al doppio la capacità dell'array
(*a)->capacity=(*a)->capacity*2;
(*a)->data=realloc(((*a)->data), (*a)->capacity * sizeof(void*));
}
if((*a)->size<i) //sto inserendo un nuovo elemento
(*a)->size=i;
//altrimenti sto aggiornando un valore di un elemento esistente
if(k==NULL)//elimino ultimo elemento
(*a)->size=(*a)->size-1;
printf("Inserisco %d in i %d\n",(int)k,i);
(*a)->data[i]=k;
}
void * getObjectARRAY(void * A, int i){
ARRAY a=(ARRAY)A;
return a->data[i];
}
datoINT.h:
#ifndef DATOINT_H_INCLUDED
#define DATOINT_H_INCLUDED
int compareINT(void * a, void * b);
void * inputINT (void);
#endif // DATOINT_H_INCLUDED
datoINT.c:
//datoINT.c
#include <stdio.h>
#include <stdlib.h>
#include "datoINT.h"
int compareINT (void * a, void * b){
int a1= (int) a;
int b1= (int) b;
return a1-b1;
}
void * inputINT (void){
int in;
printf("Inserisci un numero intero: ");
scanf("%d", &in);
return (void*)in;
}
main:
#include <stdio.h>
#include <stdlib.h>
#include "priorityqueue.h"
#include "array.h"
#include "datoINT.h"
int main(){
PQUEUE Q=NULL;
int i; void *key;
for(i=0;i<7;i++){
key=inputINT();
Q=insertKey(Q,key,getObjectARRAY, setObjectARRAY, compareINT);
}
return 0;
}
L'errore compare a runtime quando si prova ad inserire il 4° elemento (in quanto ho impostato capacity a 3), al rigo della realloc in array.c