Μάθημα - Απλά Συνδεδεμένες Λίστες

...ασύγχρονα μαθήματα γλώσσας C

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 06 Ιούλ 2011, 20:50

migf1 έγραψε:
Star_Light έγραψε:
[snip]
Δηλαδη πλεον ο list πρεπει να δειχνει στον dummy πιο πισω δεν υπαρχει τιποτα.
Βεβαια και να υπηρχε δεν θα μπορουσαμε γιατι δεν υπαρχει δευτερος δεικτης να δειχνει προς τα πισω... η λιστα ειναι απλα συνδεδεμενη... και οχι διπλά.
[snip]

Στην list_destroy() δεν έχεις κανένα λόγο να γυρίσεις πίσω μετά την καταστροφή ενός κόμβου, γιατί πάντα καταστρέφεις τον εκάστοτε 1ο κόμβο της λίστας μέσα στο loop. Απλά πριν τον καταστρέψεις, φροντίζεις να σώσεις τον επόμενό του (μέσω του dummy στην προκειμένη περίπτωση) ώστε να έχεις πρόσβαση μετά την καταστροφή, για να συνεχίσεις.

Τα υπόλοιπα μια χαρά τα λες :)


Εχω μια απορια εδω..... γιατι λες πριν??? αφου πρωτα κανεις free και μετα κανεις την εκχωρηση... list=dummy;
Πως παει δηλαδη η ροη των εντολων.... σΚαλωνω λιγο εδω εφοσον τον διαγραψαμε με την free πως τον ξαναχρησιμοποιουμε ????
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 20:58

Πριν κάνω free(list) βάζω τον dummy να δείχνει στο list->next
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 06 Ιούλ 2011, 23:19

migf1 έγραψε:Πριν κάνω free(list) βάζω τον dummy να δείχνει στο list->next


A ok καταλαβα. Ουσιαστικα με την free δεν καταστρέφεις τον δείκτη list... αλλα τον κομβο στον οποίο δείχνει ο
δείκτης list... θα πρεπει να διαβασω ξανα την τεκμηριωση για την free.....
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 23:27

Μη διαβάσεις για το free()... ενδέχεται να σε μπερδέψει χειρότερα. Κράτα αυτό που μόλις έγραψες ;) Συν ότι κάνοντας free έναν δείκτη δεν σημαίνει πως θα ισούται με NULL (είναι undefined με τι θα ισούται μετά το free). Μπορείς όμως να το κάνεις ξανά NULL μόνος σου:
Κώδικας: Επιλογή όλων

...
free(p);
p = NULL;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 06 Ιούλ 2011, 23:29

migf1 έγραψε:Μη διαβάσεις για το free()... ενδέχεται να σε μπερδέψει χειρότερα. Κράτα αυτό που μόλις έγραψες ;)


οκ. Αν και ειχα ανοιξει ηδη αυτη την τεκμηριωση... προς το παρον δεν ενιωσα μπερδεμα αλλα οκ θα ακολουθησω την συμβουλη σου.

οποιος θελει http://www.cplusplus.com/reference/clib ... dlib/free/

Π.Σ Ελαχιστα πραγματα πρεπει να θυμομαστε απεξω... το παν τελικα ειναι να μαθουμε πως πρεπει να διαβαζουμε....
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 23:31

Ναι!

ΥΓ. Έκανα ένα μικρό edit παραπάνω!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 06 Ιούλ 2011, 23:43

migf1 έγραψε:Ναι!

ΥΓ. Έκανα ένα μικρό edit παραπάνω!


To ειδα. ;)

Οκ ελευθερωνουμε δεικτες με την free() αλλα απο οσο καταλαβα εκεινο που κάνουμε
ειναι να σταματαμε να δείχνουμε σε μια δεδομενη θεση μνημης οπου εκει περιεχοταν
η δομη κομβου... το πραγματικο "clean" της μνήμης πως υλοποιείται????? Ειναι δουλεια γλωσσας
ακομη χαμηλοτερου επιπεδου ή καποιας λειτουργίας???/
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 07 Ιούλ 2011, 00:02

Λοιπον αμα επιλυσω και αυτο το λαθακι τελειωσα με το μερος 2ο και πρακτικα και μπαινω μερος 3ο....

Κώδικας: Επιλογή όλων

/*==========================================================
YLOPOIHSH LISTAS ME SUNARTHSEIS

5/7/11

==========================================================
*/
#include<stdio.h>
#include<stdlib.h>

typedef struct customer /*xreiazetai kai i leksi customer wste na kserei mesa sto swma
tou se ti tupo anaferetai o deiktis next */
{
int id;
struct customer *next;
} Customer;

/*void list_print(Customer *head);*/
int main ()
{
Customer *head ,*newnode;

head = NULL;
newnode=NULL;

{
head= calloc(1,sizeof(Customer));
head->id=1;
head->next = NULL;
}

newnode= calloc(1,sizeof(Customer));
newnode->id=2;
newnode->next=NULL;
head->next=newnode;


/*while(head)
{
printf("%d \n\n", head->id);
head=head->next;
}*/

while(head)
{
printf("\n\n");
list_print(head);
head=head->next; /*Epeidi to au8entiko antigrafo tou head paramenei stin main() prepei na kiniseis pali ton deikti */
}


free(newnode->next); /*Katastrofi komvou ston opoio deixnei o newnode->next*/
free(newnode);
free(head);

if(head!=NULL)
printf("H free dn ekane kala tin douleia tis \n");
else
printf("H mnimi eleutherwthike!");


return 0;
}

void list_print(Customer *head)
{
while(head)
{
printf("%d",head->id);
head=head->next;
}
putchar('\n');
return;
}

/* BGAZEI SAN EKSODO 12 KAI 2 enw kanonika tha eprepe 1 kai 2*/


θα το ψαξω και μονος μου ταυτοχρονα.....
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 07 Ιούλ 2011, 00:12

Star_Light έγραψε:
[snip]
Οκ ελευθερωνουμε δεικτες με την free() αλλα απο οσο καταλαβα εκεινο που κάνουμε
ειναι να σταματαμε να δείχνουμε σε μια δεδομενη θεση μνημης οπου εκει περιεχοταν
η δομη κομβου... το πραγματικο "clean" της μνήμης πως υλοποιείται????? Ειναι δουλεια γλωσσας
ακομη χαμηλοτερου επιπεδου ή καποιας λειτουργίας???/

Ανάποδα το είπες! Με τη free ελευθερώνουμε (καταστρέφουμε) αυτό στο οποίο δείχνουν οι δείκτες.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 07 Ιούλ 2011, 00:30

Star_Light έγραψε:Λοιπον αμα επιλυσω και αυτο το λαθακι τελειωσα με το μερος 2ο και πρακτικα και μπαινω μερος 3ο....

Κώδικας: Επιλογή όλων

[snip]



Ρόιδο τα έκανες εδώ :(

Σου έβαλα σχόλια με θαυμαστικά όπου υπάρχει πρόβλημα!

Κώδικας: Επιλογή όλων

/*==========================================================
YLOPOIHSH LISTAS ME SUNARTHSEIS

5/7/11

==========================================================
*/
#include<stdio.h>
#include<stdlib.h>

typedef struct customer /*xreiazetai kai i leksi customer wste na kserei mesa sto swma
tou se ti tupo anaferetai o deiktis next */
{
int id;
struct customer *next;
} Customer;

void list_print(Customer *);

// ---------------------------------------------------------------------------------
int main( void )
{
Customer *head = NULL, *newnode = NULL;

// insert 1st node
head = calloc(1, sizeof(Customer) );
head->id = 1;
head->next = NULL;

// insert 2nd node
newnode= calloc(1,sizeof(Customer));
newnode->id = 2;
newnode->next = NULL;
head->next = newnode;


/* !!! ΜΕΤΑ ΑΠΟ ΑΥΤΟ ΤΟ LOOP ΧΑΝΕΙΣ ΤΗΝ ΕΠΑΦΗ ΣΟΥ ΜΕ ΤΗΝ ΑΡΧΗ ΤΗΣ ΛΙΣΤΑΣ !!! */
while ( head )
{
printf("\n\n");
list_print( head );
head = head->next; /*Epeidi to au8entiko antigrafo tou head paramenei stin main() prepei na kiniseis pali ton deikti */
}

/* !!! Ο newnode->next ΕΔΩ ΙΣΟΥΤΑΙ ΜΕ NULL, ΠΡΙΝ ΚΑΝ ΤΟΝ ΚΑΝΕΙΣ free !!! */
free(newnode->next); /*Katastrofi komvou ston opoio deixnei o newnode->next*/

free(newnode);

/* !!! Ο head ΕΔΩ ΙΣΟΥΤΑΙ ΜΕ NULL, ΠΡΙΝ ΚΑΝ ΤΟΝ ΚΑΝΕΙΣ free !!! */
free(head);

/* !!! ΜΕΤΑ ΤΟ FREE() ΔΕΝ ΕΠΙΤΡΕΠΕΤΑΙ ΝΑ ΣΥΚΡΙΝΟΥΜΕ ΑΝ Ο HEAD ΙΣΟΥΤΑΙ ΜΕ NULL !!! */
if( head != NULL )
printf("H free dn ekane kala tin douleia tis \n");
else
printf("H mnimi eleutherwthike!");

return 0;
}

// ---------------------------------------------------------------------------------
void list_print(Customer *head)
{
while ( head )
{
printf("%d", head->id );
head = head->next;
}
putchar('\n');

return;
}

/* BGAZEI SAN EKSODO 12 KAI 2 enw kanonika tha eprepe 1 kai 2*/

Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Μαθήματα C