|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
c aiuto heap
ciao .
Ho il seguente problema... inserisco una serie di numeri in un array la cui dimensione la stabilisco io. Dopo di che da questo Array mi creo un Heap binario. Vado a cercare nell'array modificato come fosse un heap l'elemento che voglio cancellare. Se esiste allora lo cancello andando a sostituire l'elemento stesso con l'ultimo elemento dell'array e ridimensionando l'arraysize (arraysize -= 1). Quindi ordino gli elementi con l'heapsort e stampo i numeri contenuti tranne naturalmente l'ultimo elemento che è quello individuato e cancellato..ma ..la funzione per cancellare nn funziona.. dove sbaglio ? sono nuovo in C e nn riesco ancora ad entrare nella logica. Potete aiutarmi anche magari dandomi delle dritte su questo programma ? grazie mille .. codice #include <stdio.h> #include <stdlib.h> #define MAX 20 int arraysize,heapsize,tot; int left(int i) { return 2*i+1; } int right(int i) { return 2*i+2; } int p(int i) { return (i-1)/2; } void swap(int A[MAX], int i, int j) { int temp = A[i]; A[i] = A[j]; A[j] = temp; } void heapfy (int A[MAX], int i); void buildheap(int A[MAX]); int ricerca (int A[MAX],int el); void cancella (int A[MAX],int ind); void heapsort(int A[MAX]); void heapfy(int A[MAX], int i) { int l,r,largest; l=left(i); r=right(i); if (l<heapsize && A[l]>A[i]) largest=l; else largest=i; if (r<heapsize && A[r] > A[largest]) largest=r; if (largest != i ) { swap (A,i,largest); heapfy(A,largest); } } void buildheap(int A[MAX]) { int i,el; heapsize=arraysize; for (i=arraysize/2;i>=0;i--) heapfy(A,i); printf("\n inserisci l'elemento da cancellare: "); scanf ("%d",&el); ricerca(A,el); } int ricerca (int A[MAX],int el) { int i,x ; i=x=0; while ((i<= MAX) && (x=0)) { if (el <= A[i]) { if (A[i] = el) { cancella (A,i); x=1; } else i+=1; } else x=1; } } void cancella (int A[MAX],int ind) { swap (A,ind,arraysize); arraysize -=1; } void heapsort(int A[MAX]) { int i; buildheap(A); for (i=arraysize-1;i>=1; i--) { swap (A,0,i); heapsize--; heapfy(A,0); } } main() { int A[MAX],k; printf("\n quanti elementi deve contenere l'array?"); scanf("%d",&tot); while (tot>MAX) { printf("\n max 20 elementi: "); scanf ("%d",&tot); } for (k=0; k<tot; k++) { printf("\n inserire il %d° elemento: ",k+1); scanf("%d",&A[k]); } heapsize=arraysize=tot; heapsort(A); printf("\n array ordinato:"); for (k=0;k<arraysize;k++) printf("%d",A[k]); scanf("%d"); system ("\n pause"); }
__________________
![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
Ti dispiacerebbe utilizzare i tag code?
![]() Sarebbe molto più leggibile...
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
cos'e' il tag code ?cosi' ? (vedi allegato)
__________________
![]() Ultima modifica di Tony Hak : 05-10-2007 alle 20:55. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
Basta scrivere il codice all'interno di {CODE}{/CODE} (con le parentesi quadre al posto delle graffe)
Es: Codice:
questo è del codice
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
guarda ci ho provato ma nn va
![]() ![]() ![]()
__________________
![]() Ultima modifica di Tony Hak : 05-10-2007 alle 21:03. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
Codice:
#include <stdio.h> #include <stdlib.h> #define MAX 20 int arraysize,heapsize,tot; int left(int i) { return 2*i+1; } int right(int i) { return 2*i+2; } int p(int i) { return (i-1)/2; } void swap(int A[MAX], int i, int j) { int temp = A[i]; A[i] = A[j]; A[j] = temp; } void heapfy (int A[MAX], int i); void buildheap(int A[MAX]); int ricerca (int A[MAX],int el); void cancella (int A[MAX],int ind); void heapsort(int A[MAX]); void heapfy(int A[MAX], int i) { int l,r,largest; l=left(i); r=right(i); if (l<heapsize && A[l]>A[i]) largest=l; else largest=i; if (r<heapsize && A[r] > A[largest]) largest=r; if (largest != i ) { swap (A,i,largest); heapfy(A,largest); } } void buildheap(int A[MAX]) { int i,el; heapsize=arraysize; for (i=arraysize/2;i>=0;i--) heapfy(A,i); printf("\n inserisci l'elemento da cancellare: "); scanf ("%d",&el); ricerca(A,el); } int ricerca (int A[MAX],int el) { int i,x ; i=x=0; while ((i<= MAX) && (x=0)) { if (el <= A[i]) { if (A[i] = el) { cancella (A,i); x=1; } else i+=1; } else x=1; } } void cancella (int A[MAX],int ind) { swap (A,ind,arraysize); arraysize -=1; } void heapsort(int A[MAX]) { int i; buildheap(A); for (i=arraysize-1;i>=1; i--) { swap (A,0,i); heapsize--; heapfy(A,0); } } main() { int A[MAX],k; printf("\n quanti elementi deve contenere l'array?"); scanf("%d",&tot); while (tot>MAX) { printf("\n max 20 elementi: "); scanf ("%d",&tot); } for (k=0; k<tot; k++) { printf("\n inserire il %d° elemento: ",k+1); scanf("%d",&A[k]); } heapsize=arraysize=tot; heapsort(A); printf("\n array ordinato:"); for (k=0;k<arraysize;k++) printf("%d",A[k]); scanf("%d"); system ("\n pause"); } ![]() ![]() ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
Codice:
int ricerca (int A[MAX],int el) { int i,x ; i=x=0; while ((i<= MAX) && (x=0)) { if (el <= A[i]) { if (A[i] = el) { cancella (A,i); x=1; } else i+=1; } else x=1; } }
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
ok .. dmn li correggo e provo a farlo girare...
![]() ps ... la x inzialmente doveva essere una flag booleana..ma nn so come si dichiara il tipo boolean in C .. .
__________________
![]() |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
Quote:
![]()
__________________
![]() ![]() |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
puoi ovviare dichiarando una variabile di tipo intero , e assegnarli 0 o 1, rispettivamente per False e True.
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
eheh .. come avevo pensato di fare...ua ma davvero nn si possono dichiarare boolean ? ...cacchio ! cmq ora provo il programma cambiando quelle cose ...
![]()
__________________
![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
niente... nn va ... help
![]()
__________________
![]() Ultima modifica di Tony Hak : 06-10-2007 alle 07:45. |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
Quote:
![]()
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
Quote:
giusto ![]() ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
Codice:
#include <stdio.h> #include <stdlib.h> #define MAX 20 int arraysize,heapsize,tot; int left(int i) { return 2*i+1; } int right(int i) { return 2*i+2; } int p(int i) { return (i-1)/2; } void swap(int A[MAX], int i, int j) { int temp = A[i]; printf ("A[i] = %d", A[i]); printf ("A[j] = %d", A[j]); A[i] = A[j]; A[j] = temp; } void heapfy (int A[MAX], int i); void buildheap(int A[MAX]); int ricerca (int A[MAX],int el); void cancella (int A[MAX],int ind); void heapsort(int A[MAX]); void heapfy(int A[MAX], int i) { int l,r,largest; l=left(i); r=right(i); if (l<heapsize && A[l]>A[i]) largest=l; else largest=i; if (r<heapsize && A[r] > A[largest]) largest=r; if (largest != i ) { swap (A,i,largest); heapfy(A,largest); } } void buildheap(int A[MAX]) { int i,el; heapsize=arraysize; for (i=arraysize/2;i>=0;i--) heapfy(A,i); printf("\n inserisci l'elemento da cancellare: "); scanf ("%d",&el); ricerca(A,el); } int ricerca (int A[MAX],int el) { int i,x ; i=x=0; while ((i<= arraysize) && (x==0)) { if (el <= A[i]) { if (A[i] == el) { cancella (A,i); x=1; return arraysize-=1; } else i+=1; } else x=1; } } void cancella (int A[MAX],int ind) { int k=0; swap (A,ind,arraysize); for (k=0;k<arraysize;k++) printf("%d",A[k]); } void heapsort(int A[MAX]) { int i; buildheap(A); for (i=arraysize-1;i>=1; i--) { swap (A,0,i); heapsize--; heapfy(A,0); } } main() { int A[MAX],k; printf("\n quanti elementi deve contenere l'array?"); scanf("%d",&tot); while (tot>MAX) { printf("\n max 20 elementi: "); scanf ("%d",&tot); } for (k=0; k<tot; k++) { printf("\n inserire il %d° elemento: ",k+1); scanf("%d",&A[k]); } heapsize=arraysize=tot; printf ("l'arrayzizze e' %d",arraysize); heapsort(A); printf ("l'arrayzizze e' %d",arraysize); printf("\n array ordinato:"); for (k=0;k<arraysize;k++) printf("%d",A[k]); scanf("%d"); system ("\n pause"); } ps i vari printf sono come test
__________________
![]() |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Feb 2006
Città: Villa di Briano (CE)
Messaggi: 408
|
sono il prof aniello murano
ti ho sgamato furbacchione! ![]() ![]() ![]()
__________________
Ho acquistato da: battalion75, [Riot]-kyashan, Tedio, silentmodena, dorcon, Damianoo, lantony, evl, max7_4, elpampa19, fa, Sclergio, maui_, Vastx, no_side_fx, jokervero e... dimentico sempre qualcuno. Ho venduto a TNOTB, Ryujimihira, marcus24 e schumyFast per ora. |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
hihi .. nn sapevo che Lei avesse 22 anni
![]()
__________________
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:09.