PDA

Visualizza la versione completa : [C] puntatori e definizioni


keykode20
14-02-2012, 18:10
ciao a tutti ho una struttura cosi definita



typedef struct elem{
int info;
struct elem *next;
}elist;

typedef elist* plist;


l'esercizio in particolare chiede di creare una lista casuale di numeri interi compresi fra 0 e 1, il che non è un problema... ma ho notato che sulle dispense il professore spesso dichiara metodi come "InserisciInTesta(plist *p, int n)"
oppure "inserisciInCoda(plist *p,int n)"
non capisco se si è confuso con questo plist *p oppure se ha un significato particolare... cioè un puntatore di un puntatore... qualcuno sa levarmi questo dubbio?

oregon
14-02-2012, 18:16
Non ho capito bene il problema.

keykode20
14-02-2012, 18:20
cerco di spiegarmi meglio...
ho una struttura di nome elist e ho definito il suo puntatore, chiamandolo plist
quindi se scrivo plist p questo equivale a elist *p

ho notato che, nonostante questa definizione, chi ha scritto il programma usa dichiarazioni come plist *p.
La mia domanda è:
Ha un significato questo plist *p?
oppure si è semplicemente sbagliato per cui bastava dichiarare plist p?

oregon
14-02-2012, 18:31
plist *p

è un doppio puntatore, ma se si è sbagliato e intendeva scrivere

plist p

chi può saperlo se non si esamina il resto del codice e come viene usato p?

keykode20
14-02-2012, 18:42
ho notato che questo plist *p viene usato per la modifica della lista ti copio un pezzetto di codice



// funzione per inserire in testa ad una lista un nuovo nodo
void inserisciInTesta(plist* l, char n){
plist temp = (plist)malloc(sizeof(elist));
temp->info = n;
temp->next = *l;
*l = temp;
}

//funzione per inserire in coda ad una lista un nuovo nodo
void inserisciInCoda(plist* l, int n){
plist temp = (plist)malloc(sizeof(elist));
temp->info = n;
temp->next = NULL;
if (*l == NULL) *l = temp;
else {
plist temp2 = *l;
while (temp2->next != NULL)
temp2 = temp2->next;
temp2->next=temp;
}
}



mentre appare plist p quando ,per esempio, deve stampare su video o fare delle operazioni che non modificano la lista



int confrontaDNA(plist L1, plist L2, int t) {
int DIM1 = lungLista(L1);
int DIM2 = lungLista(L2);

t = t - abs(DIM1-DIM2);

while ((t >= 0) && ((L1!=NULL) && (L2!=NULL))) {
if (L1->info != L2->info) t--;
L1 = L1->next; L2 = L2->next;
}
return (t >= 0);

}



inizio a pensare questo plist *p, essendo un puntatore di un puntatore sia necessario per la modifica della lista...
e che quindi non basti scrivere plist p

keykode20
14-02-2012, 18:43
ho scritto plist *p ma lui spesso usa plist *l spero sia chiaro uguale...

oregon
14-02-2012, 18:54
E' un doppio puntatore ed è corretto perché per modificare il puntatore alla lista hai bisogno di un puntatore a tale puntatore.

Loading