Problema heap minimo

di Anonimizzato12792 il
5 risposte
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

  • É un concorso su chi scrive codice più incomprensibile? Sicuramente saresti tra i primi in classifica.
  • 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();
    }
    
  • 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;
    }
  • 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