PDA

View Full Version : Problemi con script in c


Linux2004
29-11-2005, 15:44
Ho provato a compilare questo codice:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct ListNode{
int data;
struct ListNode *nextPtr;
}ListNode;

typedef ListNode *ListNodePtr;

double averageList(ListNodePtr a);
void insert(ListNodePtr *sPtr, int value);
void printList(ListNodePtr currentPtr);

int main(){
ListNodePtr listPtr = NULL;
int i;
srand(time(NULL));


for(i = 1; i <= 25; i++) insert(&listPtr, rand()%100);
printf("The list is:\n");
printList(listPtr);

printf("The average is %f\n", averageList(listPtr));
return 0;
}

double averageList(ListNodePtr a){
int somma=0;
while(a->nextPtr != NULL){
somma += a->data;
a = a->nextPtr;
}
return somma/25;
}

void insert(ListNodePtr *sPtr, int value){

ListNodePtr newPtr;
newPtr = (ListNodePtr)malloc(sizeof(ListNode));
newPtr->data = value;
newPtr->nextPtr = NULL;

if(*sPtr == NULL) *sPtr = newPtr;
else{
while(sPtr->nextPtr != NULL) sPtr = sPtr->nextPtr;
sPtr->nextPtr = newPtr;
}
return;

}

void printList(ListNodePtr currentPtr){
while(currentPtr->nextPtr != NULL){
printf("%d ", currentPtr->data);
currentPtr = currentPtr->nextPtr;
}
return;
}


il compilatore che mi restituisce questo messaggio di errore:
Pointer to structure required on left side of -> or ->* in function insert

Grazie per l'aiuto! :)

andbin
29-11-2005, 16:30
il compilatore che mi restituisce questo messaggio di errore:
Pointer to structure required on left side of -> or ->* in function insert

Grazie per l'aiuto! :)
Ciao, ho provato a compilare il tuo codice su linux e il gcc mi riporta:

prova.c: In function `insert':
prova.c:48: request for member `nextPtr' in something not a structure or union
prova.c:48: request for member `nextPtr' in something not a structure or union
prova.c:49: request for member `nextPtr' in something not a structure or union

Il motivo è semplice: alla funzione insert() passi un puntatore alla ListNodePtr, quindi un puntatore ad un puntatore a ListNode. Per questo motivo devi dereferenziare il puntatore ogni volta:

while((*sPtr)->nextPtr != NULL) *sPtr = (*sPtr)->nextPtr;
(*sPtr)->nextPtr = newPtr;

andbin
29-11-2005, 16:54
Ah, prima avevo solo risolto il problema di compilazione ma non avevo fatto attenzione a tutto il resto del programma (e al funzionamento).
Ora ho provato il tuo programma e c'è un piccolo problema. Quando arriva al punto di stampare la lista, stampa solo 1 valore, perché nel main la variabile listPtr non punta più al primo elemento della lista!!!

Questo lo puoi mettere a posto facendo una piccola modifica nella funzione insert(), tra l'altro ignorando la modifica che ti ho detto prima (che risolveva il problema di compilazione ma non il concetto!).

Linux2004
29-11-2005, 16:55
Con questa istruzione:
*sPtr = (*sPtr)->nextPtr;
Non modifichi la root della lista?

andbin
29-11-2005, 17:04
Il puntatore sPtr nella insert() lo devi settare solo quando fai, giustamente:
if(*sPtr == NULL) *sPtr = newPtr;
Altrimenti non lo devi toccare.

E già che ci sono ti segnalo anche che la funzione printList() non è proprio giusta in quanto stampa un elemento in meno rispetto a quanto dovrebbe. Nel test del while non devi testare se il currentPtr->nextPtr è NULL ma solo se currentPtr è NULL.

Spero di esserti stato utile. Ciao.

andbin
29-11-2005, 19:44
Il puntatore sPtr nella insert() lo devi settare solo quando fai, giustamente:
if(*sPtr == NULL) *sPtr = newPtr;
Altrimenti non lo devi toccare.
Ciao, prima, per la fretta :doh: , forse non mi sono espresso bene. Intendevo dire che il valore a cui fa riferimento l'espressione *sPtr lo devi giustamente impostare una volta sola quando crei il primo elemento. Dopodiché ogni volta che devi aggiungere un elemento in coda non lo devi più toccare. Quindi nella insert() dovresti usare una variabile temporanea per scansionare la lista per trovare l'ultimo elemento.
Spero di essermi espresso meglio. ;)

Linux2004
29-11-2005, 23:44
Ciao, prima, per la fretta :doh: , forse non mi sono espresso bene. Intendevo dire che il valore a cui fa riferimento l'espressione *sPtr lo devi giustamente impostare una volta sola quando crei il primo elemento. Dopodiché ogni volta che devi aggiungere un elemento in coda non lo devi più toccare. Quindi nella insert() dovresti usare una variabile temporanea per scansionare la lista per trovare l'ultimo elemento.
Spero di essermi espresso meglio. ;)
Si si ... è proprio quello che avevo in mente... grazie per il supporto! :)