PDA

Visualizza la versione completa : [C] Inserire zero dopo i valori dispari in una lista


odraneb
10-07-2018, 12:55
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



#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");
}

scimmiaparlante
10-07-2018, 16:31
Se con "valori dispari" intendi il primo, il terzo e il quinto, quando fai questo


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


if(in->next->next)
in = in->next->next->next;

odraneb
10-07-2018, 16:52
Se con "valori dispari" intendi il primo, il terzo e il quinto, quando fai questo


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


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

scimmiaparlante
10-07-2018, 17:42
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...:confused:
Basta controllare se il numero dispari o meno e andare vanti di conseguenza



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

odraneb
11-07-2018, 10:25
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...:confused:
Basta controllare se il numero dispari o meno e andare vanti di conseguenza



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



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

scimmiaparlante
11-07-2018, 10:42
Scusa ma non inventare te come cambiare.
Se vuoi mantenere il tuo while dopo gli inserimenti adegua quello



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

odraneb
11-07-2018, 12:06
Scusa ma non inventare te come cambiare.
Se vuoi mantenere il tuo while dopo gli inserimenti adegua quello



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?

odraneb
11-07-2018, 12:14
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

odraneb
11-07-2018, 12:15
Pensi che possa funzionare? Grazie ancora

scimmiaparlante
11-07-2018, 12:15
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(...).

Loading