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
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