[C] Problema Liste con Puntatori

francik

Nuovo Utente
2
0
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!
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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. ;)
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili