|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2005
Messaggi: 41
|
Problemi con script in c
Ho provato a compilare questo codice:
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;
}
Pointer to structure required on left side of -> or ->* in function insert Grazie per l'aiuto! |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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: Codice:
while((*sPtr)->nextPtr != NULL) *sPtr = (*sPtr)->nextPtr; (*sPtr)->nextPtr = newPtr;
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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!).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: May 2005
Messaggi: 41
|
Con questa istruzione:
Codice:
*sPtr = (*sPtr)->nextPtr; |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Il puntatore sPtr nella insert() lo devi settare solo quando fai, giustamente:
Codice:
if(*sPtr == NULL) *sPtr = newPtr; 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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
, 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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: May 2005
Messaggi: 41
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:50.











, 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.








