Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Σχετικά έγγραφα
Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Στοίβες με Δυναμική Δέσμευση Μνήμης

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Σημειώσεις όγδοης εβδομάδας

Δομές δεδομένων (2) Αλγόριθμοι

Ανάπτυξη και Σχεδίαση Λογισμικού

Συλλογές, Στοίβες και Ουρές

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Εισαγωγή στον Προγραμματισμό (με. τη C)

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Φροντιστήριο 4 Σκελετοί Λύσεων

Σημειώσεις έκτης και έβδομης εβδομάδας

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Προγραμματισμός Δομές Δεδομένων

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Διαδικασιακός Προγραμματισμός

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

ιαφάνειες παρουσίασης #5 (β)

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Προγραμματισμός Ι (ΗΥ120)

ιαφάνειες παρουσίασης #6 (α)

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Δείκτες και Δομές. Info. Link. typedef struct NodeTag { InfoField Info; struct NodeTag *Link; } NodeType;

Οντοκεντρικός Προγραμματισμός

υναµικές οµές εδοµένων

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Δομές Δεδομένων & Αλγόριθμοι

ΠΛΗ111. Ανοιξη Μάθηµα 4 ο. Στοίβα. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Εργαστήριο 5: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Διπλά Συνδεδεμένη Λίστα

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Διδάσκων: Παναγιώτης Ανδρέου

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

Διδάσκων: Παναγιώτης Ανδρέου

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Προγραµµατισµός Ι (ΗΥ120)

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Προγραμματισμός Υπολογιστών με C++

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Σημειώσεις ένατης εβδομάδας

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στον Προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

Βασικές Δομές Δεδομένων

Βασικές Έννοιες Δοµών Δεδοµένων

Δομές Δεδομένων και Αλγόριθμοι

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Φροντιστήριο 4 Σκελετοί Λύσεων

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Προγραμματισμός Ι (ΗΥ120)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Εργαστήριο 5. Εντολή if και παραλλαγές: if-else, πολλαπλές if, πολλαπλές if-else. Απλές και σύνθετες εντολές. Εντολή switch.

4. Συνδεδεμένες Λίστες

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

Προγραμματισμός Η/Υ. Ενότητα 9: Ειδικά θέματα Δομών Δεδομένων

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

Προγραμματισμός Ι (ΗΥ120)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Transcript:

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Τι είναι οι συνδεδεμένες λίστες (linked lists) Μια Συνδεδεμένη Λίστα (Σ.Λ.) είναι μια διάταξη από κόμβους που μπορούμε να τους διαχειριστούμε δυναμικά. Κάθε κόμβος, εκτός των δεδομένων, περιέχει και ένα τουλάχιστον δείκτη που δείχνει σε διεύθυνση άλλου κόμβου. Αν ο δείκτης κάποιου κόμβου είναι μηδενικός (NULL) τότε αυτός είναι ο τελευταίος (ή και ο πρώτος) κόμβος της λίστας. data next node data next node Κάθε κόμβος (εκτός του πρώτου και του τελευταίου φυσικά) έχει ένα προηγούμενο και ένα επόμενο κόμβο. Υλοποίηση μιας Σ.Λ.: Με χρήση τύπου δομής (structure). data next node Κάθε κόμβος δηλώνεται σαν δομή, καθώς ένας κόμβος μπορεί να περιέχει μεταβλητές με διάφορους τύπους δεδομένων. data NULL 2

Πλεονεκτήματα Μειονεκτήματα των Σ.Λ. Πλεονεκτήματα : Μπορούμε να προσθέσουμε ή ν αφαιρέσουμε κόμβους σε οποιοδήποτε σημείο της διάταξης (ή και ν αλλάξουμε τη θέση ενός κόμβου). Το πλήθος των κόμβων είναι δυναμικά αυξομειούμενο και δεν χρειάζεται να προσδιορίζουμε εξ αρχής. Οι κόμβοι μιας Σ.Λ. δεν χρειάζεται να τοποθετηθούν σε διαδοχικές θέσεις μνήμης όπως συμβαίνει με του πίνακες (λογική σειρά φυσική σειρά). Μειονεκτήματα: Δεν έχουμε άμεση πρόσβαση σε κάποιο κόμβο της διάταξης (random access). Θα πρέπει να επισκεφτούμε διαδοχικά τους προηγούμενους κόμβους μέχρι να φτάσουμε στον κόμβο που θέλουμε. Στη C απαιτούνται εντολές για δυναμική διαχείριση μνήμης και δείκτες, που σημαίνει πολύπλοκα προγράμματα και αυξημένες πιθανότητες λάθους. Υπάρχει μεγαλύτερο υπολογιστικό κόστος, καθώς οι κόμβοι δεσμεύονται δυναμικά και απαιτείται ένας δείκτης για κάθε κόμβο. 3

Απλά Συνδεδεμένες Λίστες (Α.Σ.Λ.) Κάθε κόμβος έχει ένα δείκτη ο οποίος δείχνει στον επόμενο κόμβο. Ο δείκτης του τελευταίου κόμβου δείχνει στο NULL (μηδενικός). D next D next D next. D next D NULL head tail Για τη ευκολότερη διαχείριση μιας Α.Σ.Λ. χρησιμοποιείται ένας δείκτης που δείχνει στον αρχικό (head) κόμβο. Ορισμένες φορές, χρησιμοποιείται και δείκτης και που δείχνει στο τελευταίο (tail) κόμβο. Παράδειγμα δήλωσης κόμβου: typedef struct node { int data; struct node * next; sll_node; Προφανώς μπορούμε να βάλουμε όσες μεταβλητές θέλουμε για δεδομένα 4

Διπλά Συνδεδεμένες Λίστες (Δ.Σ.Λ.) Έχουμε δύο δείκτες σε κάθε κόμβο: o ένας δείχνει στον προηγούμενο και ο άλλος στο επόμενο κόμβο. NULL D next prev D next prev D next. prev D next prev D NULL Δυο επιπλέον πλεονεκτήματα: η Δ.Σ.Λ. μπορεί να διαβαστεί και προς τις δυο κατευθύνσεις και η διάταξη διατρέχεται ακόμα και αν καταστραφεί κάποιος σύνδεσμος. Παράδειγμα δήλωσης κόμβου: typedef struct node { struct node * prev; int data; struct node * next; dll_node; 5

Κυκλικά Συνδεδεμένες Λίστες (Κ.Σ.Λ.) Ίδιες με τις Α.Σ.Λ με την διαφορά ότι: ο τελευταίος κόμβος δείχνει στον πρώτο αντί στο NULL D next D next D next. D next D next Για τη ευκολότερη διαχείριση μιας Κ.Σ.Λ. χρησιμοποιείται ένας δείκτης που δείχνει στον τελευταίο (tail) κόμβο. tail 6

Βασικές λειτουργίες σε Σ.Λ. Παρεμβολή ενός νέου κόμβου D next D next D next. D next D NULL Διαγραφή κόμβου D next D next D next D next. D next D NULL Μετακίνηση κόμβου D next D next D next D next D next D NULL Αναζήτηση κόμβου 7

Μια απλοϊκή συνάρτηση για δημιουργία μιας Α.Σ.Λ. struct node* Build123() { struct node* first ; Χρειάζεται int data; struct node* second; μόνο στη C++ ; struct node* third ; first = (struct node*) malloc(sizeof(struct node)); // μνήμη για 1 ο κόμβο second = (struct node*) malloc(sizeof(struct node)); // μνήμη για 2 ο κόμβο third = (struct node*) malloc(sizeof(struct node)); // μνήμη για 3 ο κόμβο first ->data = 1; // δίνουμε τιμή στα δεδομένα του 1 ου κόμβου first ->next = second; // ο δείκτης του 1 ου κόμβου δείχνει στον 2 ο κόμβο second->data = 2; // δίνουμε τιμή στα δεδομένα του 2 ου κόμβου second->next = third; // ο δείκτης του 2 ου κόμβου δείχνει στον 3 ο κόμβο third->data = 3; // δίνουμε τιμή στα δεδομένα του 3 ου κόμβου third->next = NULL; // ο δείκτης του 3 ου κόμβου δείχνει στον NULL return first; //επιστρέφει τη διεύθυνση του 1 ου κόμβου 1 next 2 next 3 NULL struct node { struct node * next; Δημιουργεί 3 κόμβους, καταχωρίζει τιμές (1,2,3) στις μεταβλητές δεδομένων και τους διασυνδέει ώστε να σχηματίζουν μια Α.Σ.Λ. 8

Τι συμβαίνει στο σωρό όταν εκτελείται η Βuild123(); 1 struct node* Build123() { struct node* first ; struct node* second; struct node* third ; first = malloc(sizeof(struct node)); second = malloc(sizeof(struct node)); third = malloc(sizeof(struct node)); first ->data = 1; first ->next = second; second->data = 2; second->next = third; third->data = 3; third->next = NULL; return first; first second third Ad-first Ad-second Ad-third stack memory heap memory 9

Τι συμβαίνει στο σωρό όταν εκτελείται η Βuild123(); 2 struct node* Build123() { struct node* first ; struct node* second; struct node* third ; first = malloc(sizeof(struct node)); second = malloc(sizeof(struct node)); third = malloc(sizeof(struct node)); first ->data = 1; first ->next = second; second->data = 2; second->next = third; third->data = 3; third->next = NULL; return first; first Ad-first addr1 second Ad-second addr2 third Ad-third addr3 malloc-1 addr1 malloc-2 addr2 malloc-3 addr3 stack memory heap memory 10

Τι συμβαίνει στο σωρό όταν εκτελείται η Βuild123(); 3 struct node* Build123() { struct node* first ; struct node* second; struct node* third ; first = malloc(sizeof(struct node)); second = malloc(sizeof(struct node)); third = malloc(sizeof(struct node)); first ->data = 1; first ->next = second; second->data = 2; second->next = third; third->data = 3; third->next = NULL; return first; 1 next 2 next 3 NULL first Ad-first addr1 second Ad-second addr2 third Ad-third addr3 malloc-1 addr1 1 addr2 malloc-2 addr2 2 addr3 malloc-3 addr3 3 NULL stack memory heap memory 11

Δημιουργήθηκε όντως μια Α.Σ.Λ με την Βuild123(); void Printlist(struct node* head) { struct node* curr; //προσωρινός κόμβος curr=head; // ο προσωρινός κόμβος δείχνει όπου και ο 1ος κόμβος while (curr!= NULL){ //μέχρι να φτάσω στον τελευταίο κόμβο printf("data:%d\n", curr->data); //εμφάνιση δεδομένων τρέχοντος κόμβου curr=curr->next; // ο προσωρινός κόμβος δείχνει στον επόμενο κόμβο int Length(struct node* head) { struct node* current = head; //προσωρινός κόμβος που δείχνει όπου και ο 1ος κόμβος int count = 0; //μετρητής κόμβων της Α.Σ.Λ. while (current!= NULL) { //μέχρι να φτάσω στον τελευταίο κόμβο count++; //αυξάνω κατά 1 τον μετρητή κόμβων της Α.Σ.Λ. current = current->next; // ο προσωρινός κόμβος δείχνει στον επόμενο κόμβο return count; συνάρτηση για εμφάνιση των κόμβων μιας Α.Σ.Λ. συνάρτηση για να βρεθεί ο αριθμός των κόμβων μιας Α.Σ.Λ. 12

Και το κυρίως πρόγραμμα που καλεί την Βuild123() struct node { int data; struct node* next; ; struct node* Build123(); int Length(struct node* head); void Printlist(struct node* head); void Freelistmem(struct node* head); main() { int howmany; struct node* head; head=build123(); //δημιουργία Α.Σ.Λ. howmany=length(head); //Πόσους κόμβους έχει η Α.Σ.Λ. printf("there are %d nodes\n",howmany); printf("these are:\n"); //αποδέσμευση της μνήμης της Α.Σ.Λ. void Freelistmem(struct node* head) { struct node *curr, *tmp; curr=head; while (curr!= NULL){ tmp=curr; curr=curr->next; free(tmp); Printlist(head); //εμφάνιση των δεδομένων των κόμβων της Α.Σ.Λ. Freelistmem(head); //αποδέσμευση της μνήμης της Α.Σ.Λ. getchar();getchar(); 13

Εισαγωγή νέου κόμβου στην αρχή υφιστάμενης Α.Σ.Λ. Προϋπόθεση: Για τη ευκολότερη διαχείριση της Α.Σ.Λ. χρησιμοποιείται ένας δείκτης που δείχνει στον πρώτο (head) κόμβο. struct node { Διαδικασία: int data; Δέσμευση μνήμης για τον νέο κόμβο: struct node* curr; //προσωρινός κόμβος ; curr=(struct node*)malloc(sizeof(struct node)); Δίνουμε τιμές στις μεταβλητές δεδομένων του νέου κόμβου: curr->data=5; //δίνω μια τιμή στη μεταβλητή πχ 5 Καταχωρίζουμε στο δείκτη του νέου (προσωρινού) κόμβου την διεύθυνση του 1ου κόμβου στη Α.Σ.Λ.: curr->next=head; //ο επόμενος κόμβος είναι ο υφιστάμενος 1ος Αλλάζουμε το περιεχόμενο του δείκτη διαχειριστή (head): head=curr; //τώρα ο head δείχνει στο νέο 1 ο κόμβο struct node * next; 14

Εισαγωγή νέου κόμβου στην αρχή υφιστάμενης Α.Σ.Λ. 1 head!= NULL head haddr add1 Η δομή: struct node { int data; struct node * next; ; addr1 3 addr2 head 3 next 4 NULL addr2 4 NULL 15

Εισαγωγή νέου κόμβου στην αρχή υφιστάμενης Α.Σ.Λ. 2 head!= NULL Η δομή: struct node { int data; struct node * next; ; head haddr add1 addr1 3 addr2 3 next addr2 4 head 4 NULL NULL stuct node *curr; curr= (struct node *) malloc(sizeof (sruct node)); new naddr curr curr caddr naddr 16

Εισαγωγή νέου κόμβου στην αρχή υφιστάμενης Α.Σ.Λ. 3 head!= NULL Η δομή: struct node { int data; struct node * next; ; head haddr add1 addr1 3 addr2 head curr->data= 5; 3 next 4 NULL addr2 4 NULL new naddr 5 curr 5 curr caddr naddr 17

Εισαγωγή νέου κόμβου στην αρχή υφιστάμενης Α.Σ.Λ. 4 head!= NULL Η δομή: struct node { int data; struct node * next; ; head haddr add1 addr1 3 addr2 head curr->next=head; 3 next 4 NULL addr2 4 NULL new naddr 5 addr1 curr 5 next curr caddr naddr 18

Εισαγωγή νέου κόμβου στην αρχή υφιστάμενης Α.Σ.Λ. 5 head!= NULL Η δομή: struct node { int data; struct node * next; ; head haddr naddr addr1 3 addr2 head=curr; head 3 next 4 NULL addr2 4 NULL new naddr 5 addr1 curr 5 next curr caddr naddr 19

Συνάρτηση για εισαγωγή νέου κόμβου σε Α.Σ.Λ. με head //δήλωση της δομής typedef struct node { int data; struct node *next; sll_node; sll_node *head; //δημιουργία head //κλήση της συνάρτησης από το main() scanf("%d",&x); fflush(stdin); add2list(x); // ορισμός της συνάρτησης για εισαγωγή νέου κόμβου void add2list (int d) //d η τιμή για τη μεταβλητή data του κόμβου { sll_node *curr; curr=(struct node*)malloc(sizeof(struct node)); curr->data=d; curr->next=head; head=curr; Δουλεύει η συνάρτηση όταν η Α.Σ.Λ είναι κενή -δηλ. έχουμε head=null? 20

Εισαγωγή κόμβου στην αρχή υφιστάμενης κενής Α.Σ.Λ. 1 head == NULL head haddr NULL Η δομή: struct node { int data; struct node * next; ; NULL head 21

Εισαγωγή κόμβου στην αρχή υφιστάμενης κενής Α.Σ.Λ. 2 head == NULL head haddr NULL Η δομή: struct node { int data; struct node * next; ; NULL head new naddr stuct node *curr; curr= (struct node *) malloc(sizeof (sruct node)); curr curr caddr naddr 22

Εισαγωγή κόμβου στην αρχή υφιστάμενης κενής Α.Σ.Λ. 3 head == NULL head haddr NULL Η δομή: struct node { int data; struct node * next; ; NULL head new naddr 5 curr->data= 5; curr 5 curr caddr naddr 23

Εισαγωγή κόμβου στην αρχή υφιστάμενης κενής Α.Σ.Λ. 4 head == NULL head haddr NULL Η δομή: struct node { int data; struct node * next; ; NULL curr->next=head; curr head 5 next new naddr 5 NULL curr caddr naddr 24

Εισαγωγή κόμβου στην αρχή υφιστάμενης κενής Α.Σ.Λ. 5 head == NULL head haddr naddr Η δομή: struct node { int data; struct node * next; ; NULL head=curr; curr head 5 next new naddr 5 NULL curr caddr naddr 25

Δημιουργία Α.Σ.Λ. με head το πλήρες πρόγραμμα #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; sll_node; sll_node *head; // head node void add2list(int); void printlist(); void freelistmem(); main() { int x; head=null; while (1) { printf("enter number to insert : "); scanf("%d",&x);fflush(stdin); if (x<0) break; //stops the program add2list(x); printlist(); freelistmem(); void printlist() { //εμφάνιση Α.Σ.Λ sll_node *curr; curr=head; while (curr!= NULL){ printf("data:%d\n", curr->data); curr=curr->next; void freelistmem() { //αποδέσμευση μνήμης sll_node *curr, *tmp; curr=head; while (curr!= NULL){ tmp=curr; curr=curr->next; free(tmp); Πρόγραμμα για τη δημιουργία μιας Α.Σ.Λ. Κάθε νέος κόμβος εισάγεται στη αρχή. Σταματά όταν δοθεί αρνητικός αριθμός 26

Υλοποίηση μηχανισμού στοίβας (stack) Μια στοίβα είναι ένας μηχανισμός LIFO (Last In, First Out) : (το τελευταίο στοιχείο που μπαίνει στη στοίβα είναι και το πρώτο που βγαίνει) Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση για την εισαγωγή νέου κόμβου στην αρχή μιας Α.Σ.Λ. που εξετάσαμε προηγουμένως (Last In). Στη ορολογία της στοίβας αυτή η διαδικασία ονομάζεται push. Θα εξετάσουμε μια άλλη συνάρτηση για να εξάγουμε το πρώτο στοιχείο της Α.Σ.Λ. (First Out). Πρόκειται για τον τελευταίο (πιο πρόσφατο) νέο κόμβο. Στη ορολογία της στοίβας αυτή η διαδικασία ονομάζεται pop. Για τη ολοκλήρωση του προγράμματος θα δημιουργήσουμε κάποιες ακόμα χρήσιμες συναρτήσεις: για την εμφάνιση όλων των στοιχείων της στοίβας και για την εμφάνιση του 1 ου στοιχείου τη στοίβας. 27

Η στοίβα ως μηχανισμός LIFO Η στοίβα είναι άδεια 4ο 3ο 2ο 1ο ΣΤΟΙΒΑ (stack) 28

Η στοίβα ως μηχανισμός LIFO 1 στοιχείο στη στοίβα 4ο 3ο 2ο Ώθηση (push) 1ο ΣΤΟΙΒΑ (stack) 29

Η στοίβα ως μηχανισμός LIFO 2 στοιχεία στη στοίβα 4ο 3ο 2ο Ώθηση (push) 1ο ΣΤΟΙΒΑ (stack) 30

Η στοίβα ως μηχανισμός LIFO 3 στοιχεία στη στοίβα 4ο 3ο Ώθηση (push) 2ο 1ο ΣΤΟΙΒΑ (stack) 31

Η στοίβα ως μηχανισμός LIFO 2 στοιχεία στη στοίβα 4ο 3ο 2ο 1ο απώθηση (pop) ΣΤΟΙΒΑ (stack) 32

Η στοίβα ως μηχανισμός LIFO 1 στοιχείο στη στοίβα 4ο 3ο 2ο απώθηση (pop) 1ο ΣΤΟΙΒΑ (stack) 33

Υλοποίηση μηχανισμού στοίβας η συνάρτηση push() // ορισμός της συνάρτησης για εισαγωγή νέου κόμβου //d η τιμή για τη μεταβλητή data του κόμβου int push(int d) { stack_node *tmp; tmp = (struct node*)malloc(sizeof(struct node)); if (tmp==null) return 0; //έλεγχος για επαρκή μνήμη tmp->data=d; tmp->next = top; top =tmp; return 1; //εισήχθη επιτυχώς Η δομή: typedef struct node { int data; struct node *next; stack_node; stack_node *top = NULL; Η συνάρτηση push() είναι ίδια με τη συνάρτηση add2list(). Αντί για curr έχουμε tmp Αντί για head έχουμε top void add2list (int d) { sll_node *curr; curr=(struct node*)malloc(sizeof(struct node)); curr->data=d; curr->next=head; head=curr; 34

Υλοποίηση μηχανισμού στοίβας η συνάρτηση pop() void pop() { Η δομή: stack_node *temp; typedef struct node { int d; int data; if (isempty()){ //Έλεγχος αν η στοίβα είναι άδεια struct node *next; puts("empty stack\n"); stack_node; return; stack_node *top = NULL; printf("the number:%d has been removed!\n",top->data); temp = top->next; //ο temp δείχνει στον 2 ο κόμβο free(top); //αποδέσμευση μνήμης top = temp; // ο top δείχνει στον 2 ο κόμβο //Έλεγχος αν η στοίβα είναι άδεια int isempty() { if (top==null) return 1; else return 0; 35

Υλοποίηση μηχανισμού στοίβας άλλες συναρτήσεις //Συνάρτηση για εμφάνιση της στοίβας void displaystack() { stack_node *curr; curr=top; while (curr!= NULL){ printf(" %d\n", curr->data); curr=curr->next; //Αποδέσμευση μνήμης στοίβας void freestackmem() { stack_node *curr, *tmp; curr=top; while (curr!= NULL){ tmp=curr; curr=curr->next; free(tmp); Η δομή: typedef struct node { int data; struct node *next; stack_node; stack_node *top = NULL; //Εμφανίζει τον 1 ο κόμβο της στοίβας void showtop() { if (isempty()) puts("empty stack\n"); else printf("now top is:%d\n", top->data); 36

Υλοποίηση μηχανισμού στοίβας όλο το πρόγραμμα #include <stdio.h> #include <stdlib.h> //Define stack typedef struct node { int data; struct node *next; stack_node; // Initialize stack stack_node *top = NULL; // Used functions void pop(); int push(int d); int isempty(); void showtop(); void displaystack(); void freestackmem(); int main(void) { char ch; int num; while (1) { system("cls"); printf("\n0: Exit\n1: Push\n2: Pop\n3: Show top\n4: Display stack\n"); printf("your choice:"); scanf("%c",&ch);fflush(stdin); switch(ch) { case '0': freestackmem(); exit(0); case '1': printf("number to push into:"); scanf("%d",&num);fflush(stdin); if (push(num)==0) puts("no mor memory!\n"); break; case '2': pop(); getchar(); break; case '3': showtop(); getchar(); break; case '4': displaystack(); getchar(); break; default: puts("please try again"); break; system("pause"); 37

Εισαγωγή νέου κόμβου στο τέλος υφιστάμενης Α.Σ.Λ. (με head & tail) Προϋπόθεση: Για τη ευκολότερη διαχείριση της Α.Σ.Λ. χρησιμοποιούνται 2 δείκτες, ένας για την αρχή (head) και ένας για το τέλος της λίστας (tail). Διαδικασία: Δέσμευση μνήμης για τον νέο κόμβο: curr=(struct node*)malloc(sizeof(struct node)); Ο δείκτης του τελευταίου κόμβου δείχνει στον νέο κόμβο: tail->next=curr; Δίνουμε τιμές στις μεταβλητές δεδομένων του νέου κόμβου: curr->data=5; Ο νέος κόμβος δείχνει στο NULL (θα είναι ο τελευταίος): curr->next=null; Αλλάζουμε το περιεχόμενο του δείκτη διαχειριστή (tail): tail = curr; //τώρα ο tail δείχνει στον τελευταίο κόμβο Παρατήρηση: Ο δείκτης στον πρώτο κόμβο (head) δεν αλλάζει. 38

Εισαγωγή νέου κόμβου στο τέλος υφιστάμενης Α.Σ.Λ. (με head & tail) 1 head!= NULL struct node { unsigned int data struct node *next 3 next head 4 NULL head haddr add1 tail taddr add2 addr1 3 addr2 addr2 4 NULL tail 39

Εισαγωγή νέου κόμβου στο τέλος υφιστάμενης Α.Σ.Λ. (με head & tail) 2 head!= NULL struct node { unsigned int data struct node *next 3 next curr head haddr add1 tail taddr add2 addr1 3 addr2 head 4 NULL addr2 4 NULL tail curr= (struct node *) malloc(sizeof (sruct node)); new naddr curr caddr naddr 40

Εισαγωγή νέου κόμβου στο τέλος υφιστάμενης Α.Σ.Λ. (με head & tail) 3 head!= NULL struct node { unsigned int data struct node *next 3 next curr head haddr add1 tail taddr add2 addr1 3 addr2 head 4 naddr addr2 4 naddr tail tail->next=curr; new naddr curr caddr naddr 41

Εισαγωγή νέου κόμβου στο τέλος υφιστάμενης Α.Σ.Λ. (με head & tail) 4 head!= NULL struct node { unsigned int data struct node *next 3 next curr head haddr add1 tail taddr add2 addr1 3 addr2 head 4 naddr 5 addr2 4 naddr tail new naddr 5 curr->data=5; curr caddr naddr 42

Εισαγωγή νέου κόμβου στο τέλος υφιστάμενης Α.Σ.Λ. (με head & tail) 5 head!= NULL head haddr add1 struct node { unsigned int data struct node *next 3 next curr tail taddr add2 addr1 3 addr2 head 4 naddr 5 ΝULL addr2 4 naddr tail curr->next=null; new naddr 5 NULL curr caddr naddr 43

Εισαγωγή νέου κόμβου στο τέλος υφιστάμενης Α.Σ.Λ. (με head & tail) 6 head!= NULL head haddr add1 struct node { unsigned int data struct node *next 3 next curr tail taddr naddr addr1 3 addr2 head 4 naddr 5 ΝULL addr2 4 naddr tail = curr; tail new naddr 5 NULL curr caddr naddr 44

Εισαγωγή νέου κόμβου σε κενή Α.Σ.Λ. με head & tail Προϋπόθεση: Για τη ευκολότερη διαχείριση της Α.Σ.Λ. χρησιμοποιούνται 2 δείκτες, ένας για την αρχή (head) και ένας για το τέλος της λίστας (tail). Διαδικασία: Δέσμευση μνήμης για τον νέο κόμβο: curr=(struct node*)malloc(sizeof(struct node)); Ο δείκτης στον πρώτο κόμβο δείχνει στο νέο κόμβο: head = curr; Δίνουμε τιμές στις μεταβλητές δεδομένων του νέου κόμβου: curr->data=5; Ο νέος κόμβος δείχνει στο NULL (θα είναι ο τελευταίος): curr->next=null; Αλλάζουμε το περιεχόμενο του δείκτη διαχειριστή (tail): tail = curr; //τώρα ο tail δείχνει στον τελευταίο κόμβο 45

Εισαγωγή νέου κόμβου σε κενή Α.Σ.Λ. με head & tail 1 head == NULL struct node { unsigned int data struct node *next head haddr NULL tail taddr NULL head tail 46

Εισαγωγή νέου κόμβου σε κενή Α.Σ.Λ. με head & tail 2 head == NULL struct node { unsigned int data struct node *next curr head haddr NULL tail taddr NULL head tail new naddr curr= (struct node *) malloc(sizeof (sruct node); curr caddr naddr 47

Εισαγωγή νέου κόμβου σε κενή Α.Σ.Λ. με head & tail 3 head == NULL struct node { unsigned int data struct node *next curr head haddr naddr tail taddr head tail new naddr head = curr; curr caddr naddr 48

Εισαγωγή νέου κόμβου σε κενή Α.Σ.Λ. με head & tail 4 head == NULL struct node { unsigned int data struct node *next curr head haddr naddr tail taddr 5 head tail new naddr 5 curr ->data= 5; curr caddr naddr 49

Εισαγωγή νέου κόμβου σε κενή Α.Σ.Λ. με head & tail 5 head == NULL struct node { unsigned int data struct node *next curr head haddr naddr tail taddr 5 NULL head tail curr ->next= NULL; new naddr 5 NULL curr caddr naddr 50

Εισαγωγή νέου κόμβου σε κενή Α.Σ.Λ. με head & tail 6 head == NULL struct node { unsigned int data struct node *next curr head haddr naddr tail taddr 5 NULL head tail new naddr 1 NULL tail = curr; curr caddr naddr 51

Η νέα συνάρτηση add2list() // ορισμός της συνάρτησης για εισαγωγή νέου κόμβου void add2list (int d) //d η τιμή για τη μεταβλητή data του κόμβου { sll_node *curr; curr=(struct node*)malloc(sizeof(struct node)); if (head ==NULL) head=curr; else tail->next=curr; curr->data=d; curr->next=null; tail=curr; 52