Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2018
    Messaggi
    10

    [C] Inserire zero dopo i valori dispari in una lista

    Ho questo codice che inserisce in una lista i valori e successivamente dovrebbe aggiungere 0 dopo tutti i valori dispari.
    Il problema è che inserisce zero dopo tutti i valori indiscriminatamente.
    Sapreste correggermi per favore. Grazie

    codice:
    #include "stdafx.h"
    #include <stdio.h>
    #include <malloc.h>
    
    
    typedef struct neg {
    	int info;
    	struct neg *next;
    }*p;
    typedef struct neg Neg;
    
    
    Neg *crea_lista(Neg*, int);
    void stampa(Neg*);
    void ins(Neg*, int, int);
    int dato, dove;
    
    
    main() { // MAIN
    	int v[5], i;
    	Neg *inizio = NULL;
    	Neg *in;
    	for (i = 0; i<5; i++) {
    		printf("Scrivi 5 elementi :\n\n");
    		scanf("%d", &v[i]);
    		if (v[i]>0) inizio = crea_lista(inizio, v[i]);
    	}
    	in = inizio;
    	stampa(inizio);
    
    
    
    
    		while (in) { //CHIAMATA FUNZ.INSERIMENTO
    			dove = in->info;
    			dato = 0 * in->info;
    			ins(in, dove, dato);
    			in = in->next->next;
    		
    	}
    
    
    	stampa(inizio);
    
    
    	fflush(stdin);
    	getchar();
    }
    
    
    Neg *crea_lista(Neg *inizio, int dato) //CREA LISTA
    {
    	Neg *p;
    
    
    	p = (Neg*)malloc(sizeof(Neg));
    
    
    	p->info = dato;
    	p->next = inizio;
    
    
    	return(p);
    }
    
    
    void ins(Neg *in, int dove, int dato) //INSERISCI
    {
    	Neg *q, *aux;
    
    
    	q = (Neg*)malloc(sizeof(Neg));
    
    
    	q->info = dato;
    	q->next = NULL;
    
    
    	aux = in;
    	while ((aux->info != dove) && (aux))
    		aux = aux->next;
    
    
    	if (aux) {
    		q->next = aux->next;
    		aux->next = q;
    	}
    	else printf("Elemento assente"); 
    
    
    	}
    
    
    
    
    void stampa(Neg *inizio) { //STAMPA
    
    
    	while (inizio) {
    		printf(" %d ", inizio->info);
    		inizio = inizio->next;
    	}
    	printf("\n\n");
    }

  2. #2
    Se con "valori dispari" intendi il primo, il terzo e il quinto, quando fai questo
    codice:
    in = in->next->next;
    devi tenere conto che c'è un nuovo elemento che hai inserito; quindi il primo next ti porta sullo 0 appena messo, il secondo sull'elemento che era successivo nella lista. Se vuoi fare una volta sì e una no devi avanzare ancora, a patto di non essere in fondo
    codice:
    if(in->next->next)
        in = in->next->next->next;

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2018
    Messaggi
    10
    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    Se con "valori dispari" intendi il primo, il terzo e il quinto, quando fai questo
    codice:
    in = in->next->next;
    devi tenere conto che c'è un nuovo elemento che hai inserito; quindi il primo next ti porta sullo 0 appena messo, il secondo sull'elemento che era successivo nella lista. Se vuoi fare una volta sì e una no devi avanzare ancora, a patto di non essere in fondo
    codice:
    if(in->next->next)
        in = in->next->next->next;
    Il problema è che i valori generati sono casuali e il programma deve stabilire se sono pari o dispari: non vengono necessariamente inseriti numeri in sequenza.
    scusami, mi sono spiegato male o sono stato poco chiaro

  4. #4
    Quindi con "valori dispari" intendi il numero che viene inserito nel campo info?
    In tal caso per forza non funziona, non c'è traccia neanche di un tentativo...
    Basta controllare se il numero è dispari o meno e andare vanti di conseguenza

    codice:
    if(dove % 2 == 1)
    	{	
    		ins(in, dove, dato);
    		in = in->next;
    	}
    	in = in->next;

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2018
    Messaggi
    10
    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    Quindi con "valori dispari" intendi il numero che viene inserito nel campo info?
    In tal caso per forza non funziona, non c'è traccia neanche di un tentativo...
    Basta controllare se il numero è dispari o meno e andare vanti di conseguenza

    codice:
    if(dove % 2 == 1)
        {    
            ins(in, dove, dato);
            in = in->next;
        }
        in = in->next;
    ho modificato il codice così, funziona ma inserisce zero solo dopo l'ultimo elemento inserito. non riesco a capire perché.
    intanto grazie per la dritta

    codice:
    if (dove % 2 == 1)
    		{
    			q->next = aux->next;
    			aux->next = q;
    		}

  6. #6
    Scusa ma non inventare te come cambiare.
    Se vuoi mantenere il tuo while dopo gli inserimenti adegua quello

    codice:
    while (in) { //CHIAMATA FUNZ.INSERIMENTO
                dove = in->info;
                dato = 0;
                if(dove % 2 == 1)
                {    
                    ins(in, dove, dato);
                    in = in->next;
                }
                in = in->next;
            }

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2018
    Messaggi
    10
    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    Scusa ma non inventare te come cambiare.
    Se vuoi mantenere il tuo while dopo gli inserimenti adegua quello

    codice:
    while (in) { //CHIAMATA FUNZ.INSERIMENTO
                dove = in->info;
                dato = 0;
                if(dove % 2 == 1)
                {    
                    ins(in, dove, dato);
                    in = in->next;
                }
                in = in->next;
            }
    Grazie. Hai ragione, non aveva senso, era ovvio che senza la condizione li avrebbe inseriti ovunque.
    se io volessi inserirli prima del valore piuttosto che dopo?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2018
    Messaggi
    10
    stavo pensando che se volessi inserire anche uno 0 prima dei valori pari inseriti; potrei inserire un altro if che, nel caso in cui next punti ad un numero pari, mi permetta di ripetere l'operazione

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2018
    Messaggi
    10
    Pensi che possa funzionare? Grazie ancora

  10. #10
    Se vuoi inserirli prima o li inserisci direttamente mentre fai la lista, prima di inserire il valore, visto che la funzione crea_lista fa un inserimento in testa, oppure, se vuoi mantenere l'approccio attuale, ti fai una funzione di inserimento prima di un certo numero da usare al posto di ins(...).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.