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

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

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

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

ΛΟΙΠΟΝ το παραπανω μπορεις να μου το απαντησεις οποτε θελεις.... ξαναγυρισα στο 2ο μερος για να τα ξαναδιαβασω καλυτερα τα ολα οσα εχεις γραψει με βοηθησε αρκετα και το διαγραμμα της σελιδας 8 με τον head ακριβως πανω απο τους κομβους να δειχνει....

στη συνεχεια κοιταω τον κωδικα σου για την διαγραφη της λιστας..... βασικα λιγο πριν τον διαβασω.... δεν κοιταζα και πηρα κολλα αναφορας να δω αμα θα μπορεσω να το συνταξω μονος μου με βαση τα ως τωρα δεδιδαγμενα (σωστα το λεω??? εχω και πατερα φιλολογο λολ) και τελικα το εφτιαξα οπως το γραφεις και εσυ!!!!! Παμε πολυ καλα.... λοιπον

με δεδομενη λοιπον την συναρτηση list_destroy θελω να σε ρωτησω το εξης.... γιατι στο τελος βαζεις ξανα τον dummy μεσα στον list. Ειναι αναγκαιο???? δεν θα μπορουσες να συνεχιζεις να παιζεις με τον dummy??? που ουτως η αλλως τον εβαλες στον μεθεπομενο κομβο...... να δειχνει ενα αυτο


και δευτερον οκ καταλαβα την κληση με τιμη και με αναφορα..... ΑΛΛΑ τι ακριβως γινεται πιο βαθεια???? ο δεικτης εχει μια δεξια και μια αριστερη τιμη απλα η διαφορα του με τις αλλες μεταβλητες ειναι πως και οι 2 τιμες ειναι διευθυνσεις.... δηλαδη περνας εσυ σαν ορισμα μεσα στην συναρτηση οταν την καλεις στην main την διευθυνση της μεταβλητης δεικτη??? δηλαδη την αριστερη του τιμη ωστε να εχεις απευθειας προσβαση στα περιεχομενα του??? που ειναι η δεξια τιμη και εκει βρισκεται μια αλλη διευθυνση μιας αλλης μεταβλητης.
Γνώσεις ⇛ 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, 02:23

Star_Light έγραψε:

OK! Aλλα τωρα μου πεταει segmentation fault πχ

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

[snip]
for(head=NULL; head->next; head=head->next)
[snip]

Τρως segmentation γιατί ξεκινάς βάζοντας τον head να ισούται με NULL, κι αμέσως μετά αναφέρεσαι στο: head->next... δηλαδή στο: NULL->next ( !!!BOOM !!! :))

NULL σημαίνει κενό!

ΥΓ. Άσχετο, μέσα στον κώδικά σου "βοσκει" ένα ξέμπαρκο: void list_print(Customer *head); (πάνω από τα free)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Λοιπον νομιζω πως το καταλαβα.....

Εστω οι κομβοι 1 , 2 , 3
αρχικα ο head δειχνει στον 1 οποτε ο head->next δειχνει στον 2.
Και εστω οτι θελω να διαγραψω τον κομβο 2.

Αν εγω βαλω head=head->next ουσιαστικα μετακινω
τον head και τωρα αυτος δειχνει στον 2 ενω ο επομενος δεικτης του κομβου head δειχνει στον 3. (Η δομη του κομβου αποτελειται αποκλειστικα απο τα δεδομενα - id - value το αλλο ειναι απλα δεικτης... ειναι μεν και αυτο δεδομενο αλλα δεδομενο αποτυπωμενο οτι ξερεις εδω υπαρχει ενας δεικτης που θα δειξει καπου στον επομενο δηλαδη)

επομενως αν εγω θεσω dummy = head->next ειναι σαν να εχω θεσει απευθειας 1-> 3 συνδεση - ζευξη οποτε ειναι αυτο που θελουμε.

Στην συνεχεια θα ελευθερωσω τον 2 με την free(2); αλλα επειδη ο 2 περιγραφοταν απο τον απλο list τοτε δινω free(list)

και τελος μιας και εχω προχωρησει ενα βημα μπροστα πλεον μπορω να θεσω 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 - ΔΕΙΚΤΕΣ

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

αν το παραπανω ειναι οκ δωσε οκ να το σημειωσω στο τετραδιο

δεν ειναι για να χανονται αυτα! ΛΟΛ
Γνώσεις ⇛ 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, 02:38

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

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

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

migf1 έγραψε:Super :)

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

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

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

Λοιπόν, άμα σου πως πως δεν μπορώ να συγκεντρωθώ να καταλάβω την εξήγησή σου τι θα μου πεις; Νομίζω πως τα λες σωστά, αλλά είμαι πολυ κουρασμένος για να το εξετάσω συγκεντρωμένα.

Εν τω μεταξύ με μπέρδεψες, γιατί νόμιζα πως πήγαινες να εξηγήσεις την list_destroy() αλλά αυτό που περιγράφεις εσύ είναι η διαγραφή ενός ενδιάμεσου κόμβου.

Η list_destroy() λειτουργεί ως εξής: επειδή όταν καταστρέψεις έναν κόμβο (με free) χάνεις την δυνατότητα να πας στον επόμενο (δεν υπάρχουν πια πεδία, είναι κατεστραμμένος ο κόμβος) πριν τον καταστρέψεις χρησιμοποιείς τον dummy, τον οποίον τον βάζεις να δείξει στον επόμενο κόμβο (dummy = head->next).

Οπότε, τώρα καταστρέφεις τον τρέχων κόμβο ( free(head) ) και με το head = dummy βάζεις τον head να φύγει από τον κατεστραμμένο κόμβο και να πάει σε αυτόν που δείχνει κι ο dummy (δλδ αυτόν που πριν την καταστροφή ήταν ο επόμενος).

Κι επαναλαμβάνεις τη διαδικασία (μέσα στο while) μέχρι ο head να γίνει NULL (οπότε δεν θα μπει στο loop, άρα δεν θα εκτελεστεί και το: dummy = head->next που θα έδινε seg-fault).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Kαλως! Δεν θα σε κουρασω αλλο.... τα υπολοιπα αυριο.... :D Καλη ξεκουραση
Γνώσεις ⇛ 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 » 06 Ιούλ 2011, 03:45

Λοιπον οκ... θα το γραψω τωρα να το δεις αυριο migf1 δεν θελω να σε κουρασω αλλο... λοιπον εχεις δικιο με πριν εγω πηγα απευθειας στο να διαγραψω εναν ενδιαμεσο κομβο. Ουσιαστικα δεν προσεξα πως η free σβηνει τον δεικτη list μιας και τον παιρνει σαν παραμετρο και οτι στο παραδειγμα σου ως τωρα έχουμε 2 κομβους τον 52 και τον 62. Οποτε αναδιατυπωνω

Αρχικα στην main() έχεις ορισει list να δειχνει στο 52. επομενως το list->next εξορισμου δειχνει στο 62.
θετουμε το list->next στον dummy και αμεσως μετα ελευθερωνουμε απλα τον list που δειχνει στον 52 αρα ο κομβος 52 διαγραφεται.
και τελος παρομοια με την πριν εξηγηση μου (αλλα οπως ειπε και ο migf1 για οποιον την διαβασει δεν ειναι ακριβως η διαγραφη που περιγραφουμε εδω αλλα αναφερεται σε ενδιαμεσο κομβο) μετα την free το χαος!!! Δηλαδη πλεον ο list πρεπει να δειχνει στον dummy πιο πισω δεν υπαρχει τιποτα.
Βεβαια και να υπηρχε δεν θα μπορουσαμε γιατι δεν υπαρχει δευτερος δεικτης να δειχνει προς τα πισω... η λιστα ειναι απλα συνδεδεμενη... και οχι διπλά.

Συμπερασμα σημερινής μέρας : Στον προγραμματισμό και ειδικα εδω στις δομές δεδομένων θα πρεπει να παίζεις και στο χαρτί με διαγράμματακια ωστε να καταλαβαίνει τι πας να προγραμματίσεις μετα.
Γνώσεις ⇛ 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, 12:13

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

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

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

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

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