Problema di programmazione C

di Anonimizzato15852 il
13 risposte
Il problema è questo;
una funzione main che chiede all'utente di inserire un int n e mette n valori in una lista collegata con puntatori e calcola il massimo tra essi.

io l'ho fatto così ma ancora non sono per niente pratico:

#include <stdlib.h>
#include <stdio.h>
main()
{
int n;
printf("inserire il valore di n:");
scanf("%d", &n);

struct list{
int value;
struct list *next_ptr;
};
struct list *ptr;
ptr=(struct list*)malloc(n*sizeof(int));

void massimo(struct list*ptr);
int max;
max=ptr->value;
while (ptr!=NULL){
if(max<&ptr->next_ptr){
max=&ptr->next_ptr;
}
printf("il massimo valore è :%d", max);
}
}
premetto: ci saranno sicuramente degli errori, vorrei delle dritte...

13 Risposte

  • nickbellucci ha scritto:


    una funzione main che chiede all'utente di inserire un int n e mette n valori in una lista collegata con puntatori e calcola il massimo tra essi.
    Ma questi n valori sono casuali o li deve inserire l'utente? In ogni caso, nel tuo codice non c'è alcun inserimento nella lista...
  • Presumo dal testo sia una lista di n valore (n da la dimensione della lista), ma i valori sono casuali; sicuramente non li ho inseriti in una lista, devo fare come un inserimento in testa?
  • Sì, l'inserimento in testa mi sembra una buona idea. Fai una funzione che si occupi dell'inserimento e poi la richiami n volte, ad esempio con un ciclo for, passandole valori casuali. Poi passi al problema del massimo.
  • Sto provando a farlo ma sono in alto mare...
  • nickbellucci ha scritto:


    Sto provando a farlo ma sono in alto mare...
    Andiamo bene...

    Ecco qui: prova a proseguire.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    
    typedef struct nodo_t {
    	int val;
    	struct nodo_t* next;
    } Nodo;
    
    typedef Nodo* Lista;
    
    Lista aggiungi_testa(Lista L, int n_val) {
    	Nodo* nuovo_nodo = malloc(sizeof(Nodo));
    	nuovo_nodo->val = n_val;
    	nuovo_nodo->next = L;
    	return nuovo_nodo;
    }
    
    void stampa_lista(Lista L) {
    	for(; L; L = L->next) {
    		printf("%d  ", L->val);
    	}
    	printf("\n");
    }
    
    
    int main(int argc, char const *argv[])
    {
    	// inizializzo il generatore di numeri casuali
    	srand(time(NULL));
    
    	Lista L = NULL;
    
    	int N;
    	printf("Inserire il numero di elementi: ");
    	scanf("%d", &N);
    
    	int i;
    	for(i=0; i<N; ++i) {
    		L = aggiungi_testa(L, rand() % 100);
    	}
    
    	stampa_lista(L);
    
    	return 0;
    }
    
  • Scusami per il disturbo, ho visto il tuo programma, nel tuo usi la typedef, nel mio testo non me lo fanno usare, mi scuso che non sono ad un buon livello e devo confrontarmi per capire meglio; ho provato a fare il programma senza type def, inoltre i valori sono assunti da tastiera:
    #include <stdio.h>
    #include <stdlib.h>

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

    struct list* inserisci(struct list**ptrptr, int valore){
    struct list*tmp_ptr;
    tmp_ptr=*ptrptr;
    *ptrptr=(struct list*)malloc(sizeof(struct list));
    (*ptrptr)->value=valore;
    (*ptrptr)->next=tmp_ptr;
    return (*ptrptr);
    }
    void massimo(struct list*ptr){
    int max;
    max=ptr->value;
    while(ptr!=NULL){
    if(max<&(ptr->next)){
    max=&(ptr->next);
    ptr=ptr->next;
    }
    }
    printf("il valore massimo è %d\n", max);
    }

    int main(){
    int n, valore;
    printf("Inserire il numero di elementi n: \n");
    scanf("%d", &n);
    struct list * ptr;
    ptr=NULL;
    int i;
    for(i=0; i<n; ++i){
    printf("inserisci un valore: \n");
    scanf("%d", &valore);
    ptr=inserisci(&ptr, valore);
    }
    massimo(ptr);
    }
    il programma mi esegue tutto, l'assunzione di valori e di n, ma non mi stampa il massimo...
  • Ma questo cosa vorrebbe dire?
    if(max<&(ptr->next))
    Il valore max va confrontato con il campo che hai chiamato "value", non con next.
  • Il mio intento era confrontare max, al quale ho assegnato il campo value, con il successivo...come lo scrivo?
  • 
    if(max < ptr->next->value) ...
    
  • Ok, scusami se abuso del tuo tempo, modificando la funzione che cerca il massimo con quello che mi hai scritto lo riscrivo:

    void massimo(struct list*ptr){
    int max;
    max=ptr->value;
    while(ptr!=NULL){
    if(max<ptr->next->value){
    max=ptr->next->value;
    ptr=ptr->next;
    }
    }
    printf("il valore massimo è %d\n", max);
    probabilmente nel programma completo ci sarà qualche errore perchè ancora non mi stampa il massimo, mi potresti dire dove? ti ringrazio ancora
  • nickbellucci ha scritto:


    void massimo(struct list*ptr){
    int max;
    max=ptr->value;
    while(ptr!=NULL){
    if(max<ptr->next->value){
    max=ptr->next->value;
    ptr=ptr->next;
    }
    }
    printf("il valore massimo è %d\n", max);
    E' ancora questa funzione a non essere corretta. Esegui l'avanzamento ptr = ptr->next dentro all'if, ma quell'istruzione va eseguita in ogni caso! Prova con
    
    void massimo(struct list*ptr){
    	int max;
    	max=ptr->value;
    	while(ptr!=NULL){
    		if(max<ptr->value){
    			max=ptr->value;
    		}
    		ptr=ptr->next;
    	}
    	printf("il valore massimo è %d\n", max);
    }
    
  • FUNZIONA!! grazie mille per l'aiuto!
  • Prego!
Devi accedere o registrarti per scrivere nel forum
13 risposte