Δημοσιεύτηκε: 22 Ιουν 2011, 20:28
Μια χαρά δουλεύει ο κώδικά σου, αλλά αντί για...
υποθέτω ήθελες να γράψεις...
ή αν όντως ήθελες να βάλεις n, αρχικοποίησέ το σε μια τιμή όταν το πρωτο-ορίζεις, γιατί χωρίς αρχικοποίηση ο κάθε compiler βάζει ότι θέλει ως αρχική τιμή.
Η βασική διαφορά του δικού σου κώδικα από τον δικό μου σε επίπεδο λογικής, είναι πως εσύ το p το προσθέτεις στην αρχή της λίστας, ενώ εγώ στο τέλος της.
Με τον... δικό μου τρόπο, αυτό γράφεται ως εξής:
που ουσιαστικά κάνει το ίδιο πράγμα
Τώρα, σχετικά με το for-loop, όσο δεν σου χρειάζεται να "θυμάσαι" τον εκάστοτε προηγούμενο κόμβο όταν μετακινείσαι στον επόμενο, τότε το for είναι ok. Αν όμως χρειάζεται να "θυμάσαι" τον εκάστοτε προηγούμενο κόμβο (όπως π.χ. όταν πρέπει να εισαγάγεις τους νέους κόμβους στο τέλος της λίστας ή να τους εισαγάγεις ταξινομημένα απευθείας στη σωστή τους θέση), τότε το while είναι σαφώς πιο κατάλληλο, και κυρίως πιο κατανοητό.
Ένας άλλος τρόπος για να μη χρειάζεται να "θυμάσαι" τον εκάστοτε προηγούμενο κόμβο όταν διατρέχεις τη λίστα, είναι αντί για απλή συνδεδεμένη λίστα να χρησιμοποιήσεις διπλά συνδεδεμένη λίστα (doubly linked list), στην οποία ο κάθε κόμβος εκτός από δείκτη next έχει και δείκτη prev.
- Κώδικας: Επιλογή όλων
p->val = n;
υποθέτω ήθελες να γράψεις...
- Κώδικας: Επιλογή όλων
p->val = i;
ή αν όντως ήθελες να βάλεις n, αρχικοποίησέ το σε μια τιμή όταν το πρωτο-ορίζεις, γιατί χωρίς αρχικοποίηση ο κάθε compiler βάζει ότι θέλει ως αρχική τιμή.
Η βασική διαφορά του δικού σου κώδικα από τον δικό μου σε επίπεδο λογικής, είναι πως εσύ το p το προσθέτεις στην αρχή της λίστας, ενώ εγώ στο τέλος της.
Με τον... δικό μου τρόπο, αυτό γράφεται ως εξής:
- Κώδικας: Επιλογή όλων
/* ------------------------------------------------------------------
* Insert 'data' as 'list's First node
*/
Bool list_insfirst( List **list, int data )
{
List *new = calloc(1, sizeof(struct node) );
if ( !new )
return FALSE;
new->data = data;
new->next = *list;
*list = new;
return TRUE;
}
που ουσιαστικά κάνει το ίδιο πράγμα
Τώρα, σχετικά με το for-loop, όσο δεν σου χρειάζεται να "θυμάσαι" τον εκάστοτε προηγούμενο κόμβο όταν μετακινείσαι στον επόμενο, τότε το for είναι ok. Αν όμως χρειάζεται να "θυμάσαι" τον εκάστοτε προηγούμενο κόμβο (όπως π.χ. όταν πρέπει να εισαγάγεις τους νέους κόμβους στο τέλος της λίστας ή να τους εισαγάγεις ταξινομημένα απευθείας στη σωστή τους θέση), τότε το while είναι σαφώς πιο κατάλληλο, και κυρίως πιο κατανοητό.
Ένας άλλος τρόπος για να μη χρειάζεται να "θυμάσαι" τον εκάστοτε προηγούμενο κόμβο όταν διατρέχεις τη λίστα, είναι αντί για απλή συνδεδεμένη λίστα να χρησιμοποιήσεις διπλά συνδεδεμένη λίστα (doubly linked list), στην οποία ο κάθε κόμβος εκτός από δείκτη next έχει και δείκτη prev.