Δημοσιεύτηκε: 22 Ιουν 2011, 18:33
Υποχρεωτικό δεν είναι, αλλά κάνει την υλοποίηση πολύ πιο εύκολη στην συντήρηση, πολύ πιο ευέλικτη σε βελτιώσεις, πολύ πιο δομημένη ως λογική και σε γλιτώνει κι από επαναλαμβανόμενο κώδικα. Όπως δηλαδή συμβαίνει πάντα με τις συναρτήσεις. Δεν νοείται στοιχειωδώς σοβαρό πρόγραμμα χωρίς συναρτήσεις
Σου παραθέτω ξανά τον κώδικα, γεμάτο από σχόλια στα Ελληνικά (σχεδόν σε κάθε γραμμή). Όπου έχεις απορία, γράψε συγκεκριμένα κι αναλυτικά τι θα ήθελες να ξεκαθαρίσουμε (έστω κι αν χρειαστεί να το πάμε γραμμή-γραμμή
)
ΥΓ. Σίμο ναι, αισθάνομαι πως με πιέζεις και με αυτό τον τρόπο ενεργοποιείς όλα τα αρνητικά μου αντανακλαστικά. Κάποια στιγμή, όπως σου έγραψα, θα κάτσω να μάθω κάποιο από τα αποθετήρια (όχι κατά ανάγκη το git). Αυτό όμως θα συμβεί όταν θα αισθανθώ ότι μου χρειάζεται και όχι επειδή προσπαθεί να μου το επιβάλλει κάποιος. Ελπίζω να με κατανοείς, κι εννοείται πως δεν έχω κανένα πρόβλημα να το χρησιμοποιείτε όσοι θεωρείτε πως σας διευκολύνει
Σου παραθέτω ξανά τον κώδικα, γεμάτο από σχόλια στα Ελληνικά (σχεδόν σε κάθε γραμμή). Όπου έχεις απορία, γράψε συγκεκριμένα κι αναλυτικά τι θα ήθελες να ξεκαθαρίσουμε (έστω κι αν χρειαστεί να το πάμε γραμμή-γραμμή

- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
typedef enum { FALSE=0, TRUE } Bool; // πρόσθετος τύπος δεδομένων για Boolean τιμές
// (εφόσον FALSE=0, το TRUE ισούται με 1)
typedef struct node { // δομή δεομέμων για κάθε κόμβο της λίστας
int data; // τα δεδομένα του κόμβου
struct node *next; // δείκτης προς τον επόμενο κόμβο
} List;
/* ------------------------------------------------------------------
* Insert 'data' as Last node of 'list'
*/
Bool list_insert( List **list, int data )
{
List *head = NULL, *dummy = NULL; // αρχικοποίηση 2 βοηθητικών δεικτών
List *new = calloc(1, sizeof(struct node) ); // δέσμευση μνήμης για νέο κόμβο
if ( !new ) // αποτυχία της calloc (new == NULL)
return FALSE;
new->data = data; // εκχώρηση του data στον νέο κόμβο
new->next = NULL; // αρχικοποίηση
if ( !*list ) { // η λίστα είναι κενή (*list == NULL)
*list = new; // κάνε τον νέο κόμβο αρχή της λίστας
return TRUE;
}
/* Εισαγωγή του νέου κόμβου στο τέλος της λίστας.
*
* Αλγοριθμος:
* Ο head διατρέχει τη λίστα μέχρι το τέλος της (μέχρι δλδ ο head να βρει NULL)
* κάθε φορά που ο head πάει στον επόμενο κόμβο, ο dummy δείχνει στον κόμβο που
* ήταν ο head πριν πάει στον επόμενο. Όταν τελειώσει το loop, ο head είναι
* NULL και ο dummy δείχνει στον τελευταίο κόμβο της λίστας
*/
head = dummy = *list; // οι head & dummy δείχνουν στην αρχή της λίστας
while ( head ) { // όσο ο head δεν είναι NULL
dummy = head; // εκχώρησέ τον στον dummy (θυμήσου τον)
head = head->next; // μετακίνησε τον στον επόμενο κόμβο
}
// σε αυτό το σημείο ο dummy δείχνει στον τελευταίο κόμβο της λίοτας
dummy->next = new; // κάνε τον να δείχνει στον new
return TRUE;
}
/* ------------------------------------------------------------------
* Print 'list' contents
*/
void list_print( List *list )
{
if ( !list ) // η λίστα είναι κενή
return;
while ( list ) { // όσο ο list δεν είναι NULL
printf("%d ", list->data ); //τύπωσε τα δεδομένα του κόμβου του list
list = list->next; // μετακίνησε τον list στον επόμενο κόμβο
}
return;
}
/* ------------------------------------------------------------------
* Free memory reserved for 'list'
*/
void list_destroy( List **list )
{
if ( !*list ) // η λίστα είναι κενή
return;
List *dummy = NULL; // αρχικοποίηση βοηθητικού δείκτη
while ( *list ) { // όσο ο *list δεν είναι NULL
dummy = *list; // εκχώρησέ τον στον dummy (θυμήσου τον)
*list = (*list)->next; // μετακίνησε τον στον επόμενο κόμβο
free( dummy ); // αποδέσμευσε τον προηγούμενο κόμβο
}
return;
}
/* ------------------------------------------------------------------
*
*/
int main( void )
{
register int i=0; // προσωρινός μετρητής
List *list = NULL; // αρχικοποίηση της λίστας
// εισαγωγή 10 ακεραίων στην λίστα (από το 19 έως το 9)
for (i=19; i>9; i--)
list_insert( &list, i);
list_print( list ); // τύπωμα των περιεχομένων της λίστας
list_destroy( &list ); // αποδεσμευση μνήμης για όλους τους κόμβους της λίστας
fflush(stdin); getchar();
return 0;
}
Star_Light έγραψε:ειναι υποχρεωτικο να χρησιμοποιησει συναρτησεις καποιος για να υλοποιήσει την δημιουργια , την εισαγωγη και την διαγραφη????
Κοιτα οι μονες μου αποριες οπως εχω πει και στον λινους ειναι σε 2-3 δεικτες... απλα σε τετοια προγραμματα ειναι ευκολο να χασεις
την μπαλα.
ΥΓ. Σίμο ναι, αισθάνομαι πως με πιέζεις και με αυτό τον τρόπο ενεργοποιείς όλα τα αρνητικά μου αντανακλαστικά. Κάποια στιγμή, όπως σου έγραψα, θα κάτσω να μάθω κάποιο από τα αποθετήρια (όχι κατά ανάγκη το git). Αυτό όμως θα συμβεί όταν θα αισθανθώ ότι μου χρειάζεται και όχι επειδή προσπαθεί να μου το επιβάλλει κάποιος. Ελπίζω να με κατανοείς, κι εννοείται πως δεν έχω κανένα πρόβλημα να το χρησιμοποιείτε όσοι θεωρείτε πως σας διευκολύνει
