Linguaggio C, stampare il capofila di una lista SCL

di Anonimizzato14377 il
9 risposte
Una volta che ho inserito i dati nella lista, devo stampare il capofila.

Ma il capofila è il primo elemento che inserisco o l'ultimo?.. Il primo, giusto?

Io inserisco:

Nome: a
Nome: b
Nome: c


Poi richiamo la funzione:
Persona* capofila(filaSCL fila)
{
	if(fila == NULL)
		return NULL;
	else
		return &fila -> elemento;

}
La quale mi ritorna in valore che stampo nel main, ovvero c.

Oppure questa:
Persona* capofila(filaSCL fila)
{
	if(fila == NULL)
		return NULL;
	else
	{
		while(fila -> != NULL)
		{
			fila = fila -> next;
		}
		return &fila -> elemento;
	}

}
La quale mi ritorna a da stampare.

è quest'ultima quella giusta da usare, vero? Perché il capofila è il numero uno della fila, ovvero quello che viene inserito per prima.. Mi è venuto il dubbio

9 Risposte

  • Dipede come inserisci. il capo file è il primo cioè fila->elemento
  • Questo è il mio inserimento:
    	int n;
    	printf("n: "); scanf("%d", &n);
    	while(i < n)
    	{
    		f = malloc(sizeof(nodoFilaSCL));
    		printf("Nome: "); scanf("%s", f->elemento.nome);
    		
    		f -> next = punt_f;
    		punt_f = f;	
    		
    		i++;
    	
    	}
  • Tu inserisci in testa per forza che il primo elemento è l'ultimo inserito.
  • Ma va bene così?
  • Dipende cosa vuoi raggiungere. Se vuoi che il primo elemento inserito rimanga primo devi rivedere il codice dell'inserimento. Ovvero quando inserisci un elemento devi scorrere fino alla fine della coda e poi inserire il nuovo.
     
    Coda *p = testa;
    
    while(p->next); //scorre fino all'ultimo elemento
    
    Coda *nuovo = malloc(......) ecc;
    nuovo->next = NULL;
    p->next = nuovo;
    
    return testa;
          
           
    così l'inserimento viene fatto in coda
  • Andrebbe bene così l'inserimento in coda?
    #include <stdio.h>
    #include <stdlib.h>
    
    struct el{
    	int n;
    	struct el *next;
    
    };
    
    typedef struct el nodoFila;
    typedef nodoFila *F;
    
    int main()
    {
    	F lista, nuovo;
    	//Inserimento in coda
    	lista = malloc(sizeof(nodoFila));
    	lista->n = 5;
    	while(lista->next);
    	nuovo = malloc(sizeof(nodoFila));
    	nuovo -> n = 4;
    	nuovo -> next = NULL;
    	lista -> next = nuovo;
    	
    	while(lista != NULL)
    	{
    		printf("el: %d", lista->n);
    		lista = lista -> next;
    	}
    }
    E se volessi metterlo dentro ad un for? Non ci riesco
  • Ho sbagliato anch'io nel while (ho creato un giro infinito), infatti avevo in mente il for.
    Cmq il while dev'essere modificato così
    while(lista->next)
    lista = lista ->next;
    Invece col for
    for(;lista->next;lista = lista->next);
    Da notare che quando inserisci un nuovo elemento devi prima impostare il suo campo next a NULL come nel mio esempio.
  • Il tuo esempio
        #include <stdio.h>
        #include <stdlib.h>
    
        struct el{
           int n;
           struct el *next;
    
        };
    
        typedef struct el nodoFila;
        typedef nodoFila *F;
        F inserisciElem(F testa,int n);
    
        int main()
        {
           F lista = NULL;
           //Inserimento in coda
           for(int i = 0; i < 5; i++)
                  lista = inserisciElem(lista,i);
           
           while(lista != NULL)
           {
              printf("el: %d", lista->n);
              lista = lista -> next;
           }
        }
    
    F inserisciElem(F testa, int n)
    {
           F p = malloc(sizeof(nodoFila));
           p->n = n;
           p->next = NULL;
           if(testa == NULL)
               return p;
           F temp = NULL;
           for(temp = testa; temp->next; temp = temp->next);
           temp->next = p;
           return testa;
    }
  • Ok, ho capito. Grazie mille!
Devi accedere o registrarti per scrivere nel forum
9 risposte