Richiesta di chiarimenti

di il
1 risposte

Richiesta di chiarimenti

Ciao a tutti ho implementato questo programma in C: ritorna la media di una lista di puntatori. Funziona ma, si arresta dopo l'inserimento di un solo valore. Non riesco a capire cos'è che sbaglio. Grazie e tutti

/*
Data una lista di valori interi in forma collegata con
puntatori, scrivere una funzione che :
• a.Calcoli la media dei valori.
*/


#include "stdafx.h"
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef unsigned short int Boolean; //definizioni per l'uso di booleani 
#define TRUE 1 
#define FALSE 0 

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

void init(struct list ** ptrptr);
void pre_insert(struct list ** ptrptr, int value);//uso inserimento in testa
float meanList(struct list * ptr);
void getvalue(float *value_ptr);
void notify_selection_failure(char selection);

main()
{
	struct list *lista;
	int size, value;
	size = 5;
	char selection[10];
	Boolean exit_required = FALSE;
	int inserimento = 0;
	int numeroElem = 0;
	float sum = 0;
	init(&lista);


	printf("Digita uno dei seguenti caratteri:\n");
	printf("-A per avere la media degli alementi nella lista\n");
	printf("-a per fare un inserimento in testa\n");
	printf("-x per uscire dal programma\n");

	do
	{
		printf("\nChe operazione vuoi fare? ");
		scanf("%s", selection);
		switch (selection[0])
		{
		case 'A'://Calcolo del valore medio degli elementi nella lista
			sum = meanList(lista);
			printf("Ecco la media: %f", sum);
			break;
		case 'a':
			getvalue(&value); //inserimento in testa
			pre_insert(&lista, value);
			break;
		case 'x':
			exit_required = TRUE;
			break;
		default:
			notify_selection_failure(selection[0]);
		}

	}
	while (exit_required == FALSE);
}

	//lista collegata con puntatori
	void init(struct list **ptrptr)
	{
		*ptrptr = NULL;
	}

	//inserimento in testa
	void pre_insert(struct list ** ptrptr, int value) {
		
		while (*ptrptr != NULL) {
			ptrptr = &((*ptrptr)->next_ptr);
		}
		pre_insert(ptrptr, value);
	}
	
	float meanList(struct list * ptr) {
		float sum = 0;
		int numElem = 0;
		while (ptr != NULL)
		{
			sum += ptr->value;
			numElem++;
			ptr = ptr->next_ptr;
		}
		return sum / numElem;
	}
	
	void getvalue(int *value_ptr) 
	{
		//acquisisce un float da tastiera (passaggio per puntatore)
		printf("Inserisci un valore: ");
		scanf("%d", value_ptr);
	}
	
	void notify_selection_failure(char selection)
	{
		//notifica il fallimento della selezione
		printf("\n%c Selezione non legale!!", selection);
	}

1 Risposte

  • Re: Richiesta di chiarimenti

    Funziona ma si arresta? Quindi non funziona ...

    Il compilatore mi restituisce questo avviso ...

    warning C4717: 'pre_insert': funzione ricorsiva su tutti i percorsi di controlli, provocherà un overflow dello stack in fase di esecuzione

    Fossi in te, ne terrei conto ...
Devi accedere o registrarti per scrivere nel forum
1 risposte