[C] Problema Liste con Puntatori

Pubblicità

francik

Nuovo Utente
Messaggi
2
Reazioni
0
Punteggio
20
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);

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!
 
Purtroppo - scusa la franchezza - temo che il problema principale non siano le liste ed i puntatori (ma è solo una prima impressione). Magari è solo un errore di copiatura, una parentesi trascritta male o altro... mi sono comunque permesso di formattarlo in modo più leggibile anche (ricordati di farlo tu usando il tag CODE, trovi qui come ;) ).

C:
#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);

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

I problemi sono molti, ad iniziare dalla definizione delle funzioni. Premesso ciò, che è l'aspetto su cui mi concentrerei, il problema della visita è questo:

C:
    void visit(struct list * ptr ){
        while (ptr->next!=NULL)
            printf("%f\n",ptr->value);
            
        ptr=ptr->next;
    }

L'assegnamento è fatto fuori dal ciclo, quindi stampi all'infinito ptr->value. Mi è caduto subito l'occhio qui quando l'ho formattato, ma non escludo altri problemi simili.

Non mi dilungo sul resto, attendendo prima tue eventuali domande specifiche. Se avessi dubbi su qualcosa o volessi spiegazioni saremmo ben lieti di venirti in aiuto. ;)
 
Pubblicità
Pubblicità
Indietro
Top