Problema col programma[C]

di il
2 risposte

Problema col programma[C]

Ragazzi ho fatto questo programma però non fa quello richiesto dalla consegna. Qualcuno me lo potrebbe correggere??? E' l'unico esercizio che mi manca per completare tutti i vecchi esami del mio professore. Grazie per eventuali risposte.
/*Scrivere il codice di una funzione C che permetta di contare il numero
di valori diversi inseriti in una lista di interi.*/
#include<stdio.h>
#include<stdlib.h>

typedef struct nodo{
       int info;
       struct nodo *next;
       }Nodo;

Nodo *crea_lista();
void stampa_lista(Nodo *);
int controlla(Nodo *);

int main(){ 
     int num;
     Nodo *lista;
     lista=crea_lista();
     stampa_lista(lista);
     num = controlla(lista);
     printf("Il numero di valori diversi e': %d\n",num);
     system("pause");
     return 0;
     }
     
Nodo *crea_lista(){
     Nodo *p;
     Nodo *successivo;
     int i,n;
     printf("Quanti elementi si vogliono inserire \n");
     scanf("%d",&n);
     if(n==0)  
		   p=NULL;  
		 else{
		 	  p =(Nodo*)calloc(n,sizeof(Nodo));
			   printf("Inserisci il primo valore\n");
			   scanf("%d",&p->info); 
			   successivo = p; 
			 for(i=2;i<=n;++i){
			 			successivo->next=(Nodo*)malloc(sizeof(Nodo));
						successivo = successivo->next;
						printf("Inserisci l'elemento numero %d\n", i);
						scanf("%d",&successivo->info);
						}
						successivo->next=NULL;
						}
						return(p);
						}

void stampa_lista(Nodo *p){
	 printf("nlista--->");
	 while(p!=NULL){
		    printf("%d",p->info);
		    printf("--->");
		    p = p->next;
			}
			printf("\n");
			return;
			}

int controlla(Nodo *p){
    Nodo *successivo;
    successivo=p;
    int cnt=0;
    while(successivo->next!=NULL){
        if(p->info == successivo->next->info){                 
          while(p->info == successivo->next->info){
                      cnt+=0;
                      successivo = successivo->next;
                              }}
                   else{
                   cnt+=1;
                   successivo = successivo->next;
                   }}
                   return(cnt);
}

2 Risposte

  • Re: Problema col programma[C]

    1. Usare i tags code vedi punto 4 del regolamento
    4. Formattare il codice sorgente
    Visto gli argomenti trattati in questo forum vengono spesso inseriti stralci di codice sorgente.
    Per rendere facilmente leggibile tale codice bisogna formattarlo utilizzando il pulsante "Code".
    da aggiungere:
    
    void elimina_lista(Nodo * p)
    {
      Nodo *next;
      while (p != NULL)
      {
        next = p->next;
        free(p);
        p = next;
      }
      return;
    }
    
    da verificare, comprendere e riscrivere:
    
    int controlla(Nodo * p)
    {
      Nodo *successivo;
      int n = 0, cnt = 0;
      
      for (;p;p=p->next,n++)
    	for (successivo=p->next;successivo;successivo=successivo->next)
    	  if (p->info == successivo->info)
    		{cnt++; break;}
      
      return (n - cnt);
    }
    
  • Re: Problema col programma[C]

    Ciao innanzi tutto grazie della risposta. Ho capito tutto della funzione che hai scritto tranne 1 cosa, potresti spiegarmela:
    1)for (;p;p=p->next,n++) : questo ciclo dovrebbe dire per p che parte dalla la radice, e p che si mantiene diverso da zero, aumenta p ed n???
Devi accedere o registrarti per scrivere nel forum
2 risposte