PDA

View Full Version : [C] Problema Liste con Puntatori


francik
07-04-2018, 19:27
Buonasera!
Sto sviluppando un semplice programma con le liste in C, in particolare con liste collegati con puntatori, ma sto trovando diversi problemi.

Problema:
Il problema è semplicemente di conversione da un array definito attraverso dati da tastiera a una lista in forma collegata con puntatori.
La lista ottenuta dovrà avere il quadrato dei valori dell'array nell'ordine inverso.

Vi posto il codice che ho sviluppato:
#include <stdio.h>
#include <stdlib.h>

struct list * arrayToList(float * V,int size);
void init (struct list ** ptrptr);
void preInsert(struct list ** ptrptr, float val);
void visit(struct list * ptr);


int main()
{
int i,n;
float * V;
struct list * head;
struct list ** headp;

struct list{
float value;
struct list * next;
};
void init(struct list ** ptrptr){
*ptrptr=NULL;
}
void preInsert(struct list ** ptrptr, float val){
struct list * temp=*ptrptr;
*ptrptr=(struct list *)malloc(sizeof(struct list));
(*ptrptr)->value=val;
(*ptrptr)->next=temp;
}
struct list * arrayToList(float * V, int size){
int count;
struct list * head;
init (&head);
for(count=0;count<size;count++)
preInsert(&head,V[count]*V[count]);
return head;
}
void visit(struct list * ptr ){
while (ptr->next!=NULL)
printf("%f\n",ptr->value);
ptr=ptr->next;
}


printf("Inserire dimensioni dell'array:\n");
scanf("%d",&n);
V=(float *)malloc(sizeof(float)*n);

printf("Inserire valori dell'array:\n");
for (i=0;i<n;i++)
scanf("%f",&V[i]);


head=arrayToList(V,n);
visit(&head);



}


Ecco, il mio problema è sostanzialmente che il puntatore nell'operazione di visita mi entra in loop e restituisce o 0 all'infinito o altri valori random in base a piccole modifice. Non capisco proprio dove sia l'errore o gli errori, penso sia un qualcosa relativo alla definizione del puntatore head ma non so più cosa inventarmi.
Qualcuno che sa come potrei risolvere il problema?

Grazie in anticipo!

monte.cristo
08-04-2018, 09:13
Premetto che sono molti anni che non programmo più in C, ma personalmente non capisco la necessità di dichiarare

struct list ** headp;

In questo caso, per inserire elementi nella lista e visitarla, secondo me basterebbe scrivere il codice utilizzando dei puntatori alla struct list

francik
08-04-2018, 12:49
personalmente non capisco la necessità di dichiarare...

Effettivamente mi ero scordato di cancellare quella dichiarazione


In questo caso, per inserire elementi nella lista e visitarla, secondo me basterebbe scrivere il codice utilizzando dei puntatori alla struct list

E come diresti di fare? per la visita già utilizzo un puntatore alla lista ma penso che si looppi su NULL e mi dia 0 per questo motivo, ma non riesco a capire dove sia il problema..

melko
08-04-2018, 15:58
un problema è il seguente:

prova.c:38:7: note: expected ‘struct list *’ but argument is of type ‘struct list **’



Ecco, il mio problema è sostanzialmente che il puntatore nell'operazione di visita mi entra in loop e restituisce o 0 all'infinito o altri valori random in base a piccole modifice.

Guardando il ciclo nella funzione visit, c'è qualcosa che non va. Se ci fai caso nel while stai solo facendo la printf, senza spostare mai il puntatore.

monte.cristo
08-04-2018, 19:30
Come già detto, secondo me i puntatori a puntatori sono inutili in un esercizio così semplice. Io riscriverei completamente il codice limitandomi ad usare dei puntatori alla struct.

Inviato dal mio SM-N9005 utilizzando Tapatalk

Final50
09-04-2018, 12:38
un problema è il seguente:

prova.c:38:7: note: expected ‘struct list *’ but argument is of type ‘struct list **’




Guardando il ciclo nella funzione visit, c'è qualcosa che non va. Se ci fai caso nel while stai solo facendo la printf, senza spostare mai il puntatore.

Esatto, il while così scritto eseguirà solamente il printf non scambiando mai i puntatori e quindi non arriverà mai alla condizione di fine del ciclo dato che il puntatore non sarà mai null. Comunque a parer mio c'è un po' di confusione sui puntatori, non mi è chiaro perchè utilizzi alternativamente dei puntatori singoli e puntatori doppi.