Cosi va meglio??però ti prego aiutami il problema è nella funzione cambio se metto pochi elementi a salire nelle posizioni funziona ma non riesco a scendere. non riesco a scambiare i figli
con il padre [i/2]??e se mi dai qualche dritta lo sistemo anche a livello di comprensibilità sono una principiante lo ammetto per me è gia molto anche questo che sono riuscita a fare
#include <stdio.h>
#include <conio.h>
#define MAX 20
typedef struct nodo{
int chiave;
int prio;} heap;
int inserisci(heap *radice, int n)
{int i, temp;
if(n==MAX){
printf("heap completo, impossibile inserire altri valori");
return n;
}
printf("digitare il valore da inserire: ");
scanf("%d", &temp);
i=++n;
while(i!=1 && temp<radice[i/2].chiave){
radice[i].chiave=radice[i/2].chiave;
radice[i].prio=radice[i/2].prio;
i=i/2;
}
radice[i].chiave=temp;
radice[i].prio=temp;
return n;
}
void visualizza(heap *radice, int n){
int i;
for(i=1; i<=n; i++) printf("%d ", radice[i].chiave);
fflush(stdin);
getchar();
}
int crea(heap *radice)
{int n, i=0;
do{
printf("inserire il numero di valori da inserire: ");
scanf("%d", &n);
}
while(n<1 && n>=MAX);
while(i<n) i=inserisci(radice, i);
return n;
}
int elimina(heap *radice, int n){
int padre, figlio; heap temp;
temp.chiave=radice[n].chiave;
temp.prio=radice[n].prio;
n--;
padre=1; figlio=2;
while(figlio<=n){
if((figlio<n)&&(radice[figlio].prio>radice[figlio+1].prio)) figlio++;
if(temp.prio<=radice[figlio].prio) break;
radice[padre].chiave=radice[figlio].chiave;
radice[padre].prio=radice[figlio].prio;
padre=figlio; figlio *=2;
}
radice[padre]=temp;
return(n);
}
int cambio(heap *radice, int n){
heap ele; int i=1, j;
printf("digitare l'elemento a cui cambiare la priorita': ");
scanf("%d", &ele.chiave);
while(i<=n && radice[i].chiave!=ele.chiave) i++;
if(i>n) {
printf("elemento non trovato\nimpossibile continuare"); fflush(stdin); getchar(); return n;
}
j=i*2;
while(j<=n){
if(radice[j].prio>radice[j+1].prio) j++;
radice[i].chiave=radice[i+1].chiave;
radice[i].prio=radice[i+1].prio;
if(j*2>n){
while(j<=n){
radice[j].chiave=radice[j+1].chiave;
radice[j].prio=radice[j+1].prio;
j++;
}
break;
}
i=j; j=j*2;
}
printf("\ninserire la priorita' dell'elemento: ");
scanf("%d", &ele.prio);
i=n;
while(i!=1 && ele.prio<radice[i/2].prio){
radice[i].chiave=radice[i/2].chiave;
radice[i].prio=radice[i/2].prio;
i=i/2;
}
radice[i].chiave=ele.chiave;
radice[i].prio=ele.prio;
return n;
}
main()
{
int scelta, n=0; heap radice[MAX];
do{
printf("\t\t***MENU***\n");
printf("1) Creare un heap minimo\n");
printf("2) Eliminare il campo chiave con il valore piu' piccolo\n");
printf("3) Cambiare la priorita' di un elemento arbitrario\n");
printf("4) Inserire un elemento nell'heap\n");
printf("5) Visualizza il contenuto dell'heap\n");
printf("0) Uscita\n");
printf("\tSCEGLIERE TRA LE SEGUENTI OPZIONI: ");
scanf("%d", &scelta);
switch(scelta){
case 0: printf("\t**FINE**"); break;
case 1: n=crea(radice); break;
case 2: if(n>0) n=elimina(radice,n);
else printf("impossibile eliminare elemento\theap vuoto");
break;
case 3: n=cambio(radice,n); break;
case 4: n=inserisci(radice,n); break;
case 5: visualizza(radice,n); break;
default: printf("scelta errata..."); break;
}
}
while(scelta);
fflush(stdin);
getchar();
}