PDA

View Full Version : [C] aiuto per programma


Parru
20-07-2012, 19:47
Salve,
sto facendo una serie di esercizi per un esame e mi sono trovato in difficoltà nella realizzazione di un programma. Questo programma deve avere una funzione che verifica le occorrenze dei valori in un array di N interi e le memorizza in una lista che contiene due campi: uno del valore e l'altro dell'occorrenza. Inoltre se un valore della lista non è presente nell'array deve essere eliminato dalla lista. Qui si seguito il codice che ho scritto


#include <stdio.h>
#include <stdlib.h>
typedef unsigned short int Boolean;
#define TRUE 1
#define FALSE 0


struct list {
int value;
int occ;
struct list * next_ptr;
};

void init( struct list ** ptrptr );
void visit( struct list * ptr );
void pre_insert(struct list ** ptrptr, int value, int occ);
void suf_insert( struct list ** ptrptr, int value, int occ );
void conta_occorrenze (struct list **ptrptr, int *V, int N);
int main( int argc, char *argv[] )
{
Boolean itera = TRUE, found = FALSE;
int value;
int scelta;
struct list * list1_ptr;
int occ;
occ=0;
int i=0;
int N=0;
int *V;
init( &list1_ptr );

do{



printf( "1. inserisci elemento lista 1\n" );
printf( "2. inserisci il vettore\n" );

printf( "3. conta occorrenze vettore\n");
printf( "4. esci\n" );
scanf( "%d", &scelta );
system("cls");
switch ( scelta ) {
case 1:
printf( "\ninserisci valore: " );
scanf( "%d",&value,"%d",&occ);
pre_insert( &list1_ptr, value, occ);
break;
case 2:

printf("inserisci dimensione del vettore: ");
scanf("%d", &N);


int i;
V=malloc(N*sizeof(int));
for(i=0; i<=N-1; i++){
printf("inserisci elemento V[%d]: ", i);
scanf("%d", &(V[i]));

}
break;
case 3:
conta_occorrenze(&list1_ptr, V, N);
break;

case 4: itera = FALSE;
break;
default:
printf( "\nscelta errata!" );
break;
}
} while ( itera );
visit( list1_ptr );

if(N!=0){
for(i=0; i<=N-1; i++)
printf("\nV[%d]=%d\n", i, V[i]);


}


system("PAUSE");
return 0;
}
void init( struct list ** ptrptr )
{
*ptrptr = NULL;
}

void visit( struct list * ptr )

{
while ( ptr != NULL ) {
printf("%d %d, %d", ptr->value, ptr->occ);

ptr = ptr->next_ptr;

}
;
}

void suf_insert( struct list ** ptrptr, int value, int occ )

{
while ( *ptrptr != NULL ) {
ptrptr = &((*ptrptr)->next_ptr);
}
pre_insert( ptrptr, value, occ);
}

void pre_insert( struct list ** ptrptr, int value, int occ )

{
struct list * tmp_ptr;

tmp_ptr = *ptrptr;
*ptrptr = (struct list *) malloc( sizeof(struct list));
(*ptrptr)->value = value;
(*ptrptr)->occ = occ;
(*ptrptr)->next_ptr = tmp_ptr;
}
void conta_occorrenze(struct list ** ptrptr, int *V, int N)
{
struct list * tmp;
int j;
while(*ptrptr!=NULL || N!=0){
for(j=0;j<N;j++){
if((*ptrptr)->value==V[j]){
((*ptrptr)->occ)++;
*ptrptr=(*ptrptr)->next_ptr;
}
else {

tmp = *ptrptr;
*ptrptr = (*ptrptr)->next_ptr;
free( tmp );}

}
}
visit(*ptrptr);
system("PAUSE");
}



in fase di compilazione non ci sono problemi ma quando vado ad eseguire il programma ho un errore e non riesco a capire da cosa derivi. Spero che possiate essermi d'aiuto. Grazie

ingframin
21-07-2012, 08:51
Posta l'errore, altrimenti come facciamo ad aiutarti? :)

Parru
21-07-2012, 14:24
anche te hai ragione :muro:
io lancio l'applicazione e una volta inseriti da tastiera i valori dell'array e della lista, quando chiamo la funzione conta_occorrenze il programma mi va in crash. L'errore è sicuramente in quella funzione ma non riesco a capire dove, forse nel passaggio dei paratri