Problema heap minimo

di il
5 risposte

Problema heap minimo

Ragazzi sapete spiegarmi perchè quando entro nella funzione scambia non tornano i conti
cosa sbaglio??

#include <stdio.h>
#include <conio.h>

#define MAX 20

typedef struct nodo{
int chiave;
} heap;
int prio[MAX-1];
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.chiave=radice[i/2].chiave;
prio=prio[i/2];
i=i/2;
}
radice.chiave=temp;
prio=temp;
return n;
}

void visualizza(heap *radice, int n)
{int i;
for(i=1; i<=n; i++) printf("%d ", radice.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;
prio[n]=prio[n];
n--;
padre=1; figlio=2;
while(figlio<=n){
if((figlio<n)&&(prio[figlio]>prio[figlio+1])) figlio++;
if(temp.chiave<=radice[figlio].chiave) break;
radice[padre].chiave=radice[figlio].chiave;
prio[padre]=prio[figlio];
padre=figlio; figlio *=2;
}
radice[padre]=temp;
return(n);
}

int cambio(heap *radice, int n)
{heap ele; int i=1, j,eleprio;
printf("digitare l'elemento a cui cambiare la priorita': ");
scanf("%d", &ele.chiave);
while(i<=n && radice.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(prio[j]>prio[j+1]) j++;
radice.chiave=radice[j].chiave;
prio=prio[j];
if(j*2>n){
while(j<=n){
radice[j].chiave=radice[j+1].chiave;
prio[j]=prio[j+1];
j++;
}
break;
}
i=j; j=j*2;
}
printf("\ninserire la priorita' dell'elemento: ");
scanf("%d", &eleprio);
i=n;
while(i!=1 && eleprio<prio[i/2]){
radice.chiave=radice[i/2].chiave;
prio=prio[i/2];
i=i/2;
}
void Scambia (int *f1, int *f2){
*f2=i;
*f1=eleprio;
*f1=*f2;
}
void Scambia (int *f1,int*f2);
radice[i].chiave=ele.chiave;
prio[i]=eleprio;
return n;
}

int 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();
}

5 Risposte

  • Re: Problema heap minimo

    É un concorso su chi scrive codice più incomprensibile? Sicuramente saresti tra i primi in classifica.
  • Re: Problema heap minimo

    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();
    }
    
  • Re: Problema heap minimo

    Cercando in giro ho trovato questo
    http://www.inforge.net/community/c-c/333814-gli-heap-delete-insert-find-heapify.html
    Premetto che li heap li ho fatti 20 anni fa quindi non ricordo nulla. Se ci sono errori di compilazione posso trovarli ma quelli di generazione algoritmo no perche ho dimenticato come funziona l'algoritmo.
  • Re: Problema heap minimo

    Molto utile grazie mille..però ti voglio fare anche un ultima domanda ti intendi di complessità t(n)??
    il mio dilemma è questo in questo pezzo di codice la complessità è nlog di n o n^2??
    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;
    }
  • Re: Problema heap minimo

    Per me non é n^2 perche il while annidato vale solo x certi valori (j < n e 2j > n) quindi sará n* (qualcosa che tende a scendere al crescere di j) quale puó essere il log(n)
Devi accedere o registrarti per scrivere nel forum
5 risposte