ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Σχετικά έγγραφα
ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αρχές Προγραμματισμού

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Ηλεκτρονικοί Υπολογιστές

Εισαγωγή στον δομημένο προγραμματισμό

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Προέλευση της Pazcal ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Επεξεργασία κειμένου και συμβολοσειρών σε C

Δομημένος Προγραμματισμός

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Δομημένος Προγραμματισμός

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

Δομές Δεδομένων Ενότητα 3

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

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

Εισαγωγή στον δομημένο προγραμματισμό

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

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Εισαγωγή στους Υπολογιστές

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ.

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

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

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

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

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

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

Αρχές Προγραμματισμού

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προχωρημένες έννοιες προγραμματισμού σε C

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

ΣΤΑΤΙΣΤΙΚΗ ΑΝΑΛΥΣΗ ΜΕ ΧΡΗΣΗ Η/Υ

Δομημένος Προγραμματισμός

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

Δομές Δεδομένων Ενότητα 4

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Εισαγωγή στον δομημένο προγραμματισμό

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

Ευφυής Προγραμματισμός

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δείκτες Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

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

Υπολογιστικά Συστήματα

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

Ευφυής Προγραμματισμός

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΒΟΗΘΗΤΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

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

Γλώσσα Προγραμματισμού C

Οργάνωση Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Ασκήσεις 7: Πρόγραμμα Συνδεδεμένης Λίστας και Διαδικασιών. Μανόλης Γ.Η.

Μεθόδων Επίλυσης Προβλημάτων

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

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

Transcript:

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 16 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών & Τεχνολογίας Υπολογιστών

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Ceative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τυπου άδειας χρησης, η άδεια χρησης αναφερεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου των διδασκόντων καθηγητών. Το έργο «Ανοικτά Ακαδήμαϊκά Μαθήματα στο Πανεπιστήμιο Πατρών» έχει χρηματοδοτηθεί μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκη Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικους πόρους. 3

Ανάπτυξη Το παρόν εκπαιδευτικό υλικό αναπτύχθηκε στο τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών του Πανεπιστημίου Πατρών 4

Σκοπός Στόχος της παρακάτω ενότητας είναι η εισαγωγη σε β ασικες αρχες και εννοιες των Αρχων Προγραμματισμ ού. 5

Σχετικά με το εργαστήριο 3 Μια προσέγγιση Διάβασε κείμενο από αρχείο σε πίνακα Διάβασε λεξικό από αρχείο σε πίνακα Τροποποίησε πίνακες Γράψε πίνακες σε αρχείο Άλλη προσέγγιση Προσθέτω λέξεις στο λεξικό κατευθείαν στο αρχεί ο 6

Δυναμική διαχείριση μνήμης στη C Δέσμευση μνήμης: void *malloc(size_t size); Επιστρέφει δείκτη σε εξασφαλισμένη περιο χή μεγέθους size bytes ή NULL αν δεν υπά ρχει τέτοια. Απελευθέρωση μνήμης: void fee(void *pointe); 7

Πώς δουλεύει ο μηχανισμός; Χρησιμοποιεί δεδομένα στο heap Λεπτομερή διαχείριση ανά block Διεύθυνση αρχής Μέγεθος Μοιράζεται πληροφορία μεταξύ διαφορετικών συναρ τήσεων malloc ( ), fee ( ) Πώς γίνεται αυτό; 8

Παράδειγμα #include <stdio.h> #include <stdlib.h> #define N 10 main ( ) { matix[n]; scanf("%s", matix); pintf("hello %s!\n", matix); 9

Παράδειγμα #include <stdio.h> #include <stdlib.h> #define N 10 main ( ) { matix[n]; *dynamicdata; scanf("%s", matix); pintf("hello %s!\n", matix); dynamicdata = ( *) malloc( N * sizeof ()); scanf("%s", dynamicdata); pintf("hello dynamic %s!", dynamicdata); 10

Παράδειγμα #include <stdio.h> #include <stdlib.h> #define N 10 main ( ) { matix[n]; *dynamicdata; int i; scanf("%s", matix); pintf("hello %s!\n", matix); dynamicdata = ( *) malloc( N * sizeof ()); scanf("%s", dynamicdata); pintf("hello dynamic %s!\n", dynamicdata); fo (i=0;dynamicdata[i]!=0;i++) pintf("%c\n", dynamicdata[i]); 11

Παράδειγμα #include <stdio.h> #include <stdlib.h> #define N 10 main ( ) { matix[n]; *dynamicdata; int i, ns; scanf("%s", matix); pintf("hello %s!\n", matix); while (1) { pintf("how many s?"); scanf("%d", &ns); dynamicdata = ( *) malloc( ns * sizeof ()); scanf("%s", dynamicdata); pintf("hello dynamic %s!\n", dynamicdata); fo (i=0;dynamicdata[i]!=0;i++) pintf("%c\n", dynamicdata[i]); fee(dynamicdata); 12

13 * * * * **

** * * * * Δημιούργησε χώρο για τη νέα λέξη Δημιούργησε χώρο για τη διεύθυνση της νέας λέξης Αποθήκευσε τη διεύθυνση της νέας λέξης 14

#include <stdio.h> #include <stdlib.h> #include <sting.h> #define CHARS 10 int main(int agc, *agv[]) { **mytext = NULL; int wods = 0; wod[chars] = ""; int i; ealloc while (scanf("%s", wod), stcmp(wod,"telos")) { wods++; mytext = ealloc(mytext, wods*sizeof( *)); mytext[wods-1] = malloc (CHARS*sizeof()); stcpy(mytext[wods-1], wod); fo (i=0; i<wods; i++) pintf("%s\n", mytext[i]); etun 0; 15

malloc #include <stdio.h> #include <stdlib.h> #include <sting.h> #define CHARS 10 int main(int agc, *agv[]) { **mytext = NULL; int wods = 0; *wod; int i; while (scanf("%s", wod=malloc(chars*sizeof())),stcmp(wod,"telos")) { wods++; mytext = ealloc(mytext, wods*sizeof( *)); mytext[wods-1] = wod; fo (i=0; i<wods; i++) pintf("%s\n", mytext[i]); etun 0; 16

Δυναμικές δομές δεδομένων Διασυνδεδεμένες λίστες Διαχείριση μνήμης (memoy management) 17

Στατικές και δυναμικές δομές δεδομένων Στατικές: θέση και μέγεθος καθορίζονται στη μεταγλ ώτ τιση. int aay[10]; Δυναμικές: θέση και μέγεθος καθορίζονται κατά την εκτέλεση. Απλούστερος τύπος: η λίστα Λίστα: Έτοιμη σε C++/Java, σε C γράφουμε κώδικα 18

Λίστες και στοιχεία τους Αρχή (όνομα) NULL 19

Eισαγωγή στοιχείου Αρχή (όνομα) NULL 20

Διαγραφή στοιχείου Αρχή (όνομα) NULL Τι γίνεται με τη μνήμη την οποία το στοιχείο καταλάμβανε; 21

Στοιχείο λίστας Δεδομένα προβλήματος #define N 10 stuct elem { value[ν]; int count ; stuct elem *next; ; typedef stuct elem Element; Θέση επόμενου στοιχείου 22

Χρήσιμοι συμβολισμοί stuct test { int a ; stuct test *next; atest, *atest_pt, *btest_pt; Διεύθυνση στοιχείου μετά το atest atest.next atest.a = 4; /* δείκτης σε δομή */ atest_pt = atest.next; btest_pt = &atest; (*btest_pt).a ++; /* το ίδιο με το προηγούμενο */ (btest_pt->a)++ ; 23

Αναφορά σε πολλά στοιχεία Με στατικό τρόπο stuct test atest, btest, ctest ; stuct test manytests[10] ; Ή δυναμικά Πώς μπορεί να δημιουργεί «μεταβλητές» την ώρα της εκτέλεσης; Βασική ιδέα: δε δημιουργεί νέα ονόματα μεταβλητών, Αλλά δεσμεύει αναλυτικά κατάλληλες περιοχές μνήμης και κρατάει αναφορές σε αυτές 24

Όχι πραγματική λίστα, ενδιάμεσο βήμα #include <stdio.h> #define L 30 stuct listelement { name[l]; int age; stuct listelement *next; ; typedef stuct listelement Listelement; int main(int agc, *agv[]) { /* Initialize */ Listelement c = { "Giannis", 5, NULL, b = { "Maia", 10, NULL, a = { "Vassilis", 3, NULL; Listelement *iteato; /* Connect to list*/ a.next = &b; b.next = &c; /* Access elements */ fo (iteato = &a; iteato!= NULL ; iteato = (*iteato).next) { pintf( "name: %s\n", (*iteato).name); pintf("age: %d\n", (*iteato).age); etun 0; 25

Απλοποιημένος συμβολισμός stuct mystuct *test; (*test).next test->next 26

(*iteato).next Listelement c = { "Giannis", 5, NULL, b = { "Maia", 10, NULL, a = { "Vassilis", 3, NULL; Listelement *iteato; a b c NULL NULL NULL a.next = &b; b.next = &c; iteato = &a iteato = &b iteato = &c fo (iteato = &a; iteato!= NULL ; iteato = iteato->next) 27

Λίστα Δεν χρησιμοποιήθηκαν τα ονόματα a, b, c για να επεξεργαστούμε τη λίστα! Αρκεί η διεύθυνση του πρώτου στοιχείου μόνο! Η διεύθυνση του επόμενου στοιχείου είναι iteato->next 28

Λίστα Στατική δήλωση Listelement c = { "Giannis", 5, NULL; Δυναμική δήλωση στοιχείου της λίστας Listelement *element_pt; element_pt = (Listelement *) malloc ( sizeof (Listelement)); stcpy((*element_pt).name,"ntina"); (*element_pt).age = 9; (*element_pt).next = NULL; Άλλος συμβολισμός, ενδεικτικά: element_pt->name αντί (*element_pt).name Listelement *element_pt; element_pt = (Listelement *) malloc ( sizeof (Listelement)); stcpy(element_pt->name,"ntina"); element_pt->age = 9; element_pt->next = NULL; 29

Παράδειγμα #include <stdio.h> #include <stdlib.h> #include <sting.h> #define L 30 stuct listelement { name[l]; int age; stuct listelement *next; ; typedef stuct listelement Listelement; typedef Listelement * Listelement_pt; int main(int agc, *agv[]) { /* Initialize */ Listelement_pt iteato=null, element_pt, pevious_pt, fist_pt; put them to list*/ element_pt = (Listelement_pt) malloc ( sizeof (Listelement)); stcpy(element_pt->name,"ntina"); element_pt -> age = 9; element_pt -> next = NULL; fist_pt = element_pt; pevious_pt = element_pt; element_pt = (Listelement_pt) malloc ( sizeof (Listelement)); stcpy(element_pt->name,"giannis"); element_pt -> age = 6 ; pevious_pt -> next = element_pt; /* Access elements */ fo (iteato = fist_pt; iteato!= NULL ; iteato = iteato->next) { pintf( "name: %s\n", iteato->name); pintf("age: %d\n", iteato->age); etun 0; /* ceate elements and 30

mytypes.h #define L 30 stuct listelement { name[l]; int age; stuct listelement *next; ; typedef stuct listelement Listelement; typedef Listelement * Listelement_pt; typedef Listelement * List; 31

#include <sting.h> #include <stdlib.h> #include "mytypes.h" Δημιουργία στοιχείου Listelement_pt ceatenewelement( wod[], int numbe) { Listelement_pt newelement_pt; newelement_pt = (Listelement_pt) malloc ( sizeof (Listelement)); stcpy(newelement_pt->name, wod); newelement_pt -> age = numbe; newelement_pt -> next = NULL; etun newelement_pt; 32

Διατρέχει όλα τα στοιχεία της λίστας #include <stdio.h> #include "mytypes.h" void epotlist(list const alist) { Listelement_pt iteato= alist; fo (; iteato!= NULL ; iteato = iteato->next) { pintf( "name: %s\n", iteato->name); pintf("age: %d\n", iteato->age); NULL 33

Προσθήκη στοιχείου στο τέλος λίστας NULL #include <stdio.h> #include "mytypes.h" Παράμετρος δείκτης σε λίστα ή διπλός δείκτης σε στοιχείο void addtolist (List *list, Listelement_pt elem_pt ) { Listelement_pt iteato = *list; if (*list==null) /* handle empty list*/ *list = elem_pt; else { /* if not empty, move to last element list*/ fo (; iteato->next!= NULL; iteato = iteato->next); /* append element to list */ iteato->next = elem_pt; Όταν βγει από το βρόχο, ο iteato δείχνει στο τελευταίο στοιχείο 34

Παράδειγμα #include <stdio.h> #include <stdlib.h> #include <sting.h> #include "mytypes.h Listelement_pt ceatenewelement( *, int); Listelement_pt findelementbyname(list, []); void epotlist( List const); void addtolist(list *, Listelement_pt); void deleteelement(list *, Listelement_pt); int main(int agc, *agv[]) { /* Initialize */ Listelement_pt iteato=null, element_pt, pevious_pt; List nameslist = NULL; name[50]; /* ceate elements and put them to list*/ element_pt = ceatenewelement("ntina", 10); addtolist (&nameslist, element_pt); element_pt = ceatenewelement("giannis", 5); addtolist( &nameslist, element_pt); element_pt = ceatenewelement("maia", 7); addtolist( &nameslist, element_pt); epotlist(nameslist); /* find, delete, epot */ do { pintf("name: "); scanf("%s", name); element_pt = findelementbyname(nameslist, name); if (element_pt) { pintf("found it. data: %d\n", element_pt->age); deleteelement(&nameslist, element_pt); epotlist(nameslist); while (nameslist!=null) ; etun 0; 35

Παράδειγμα #include <stdio.h> #include <stdlib.h> #include "mytypes.h" Παράμετρος: δείκτης σε λίστα ή διπλός δείκτης σε στοιχείο λίστας int deleteelement(list *alist, Listelement_pt element) { Listelement_pt iteato = *alist, todelete_pt; if (element == NULL *alist == NULL) etun -1 ; if (element== *alist) { /* if equied, delete fist element */ *alist = element->next ; fee(element); else { /* find the element befoe the one to be deleted */ fo(; iteato->next!= element; iteato = iteato->next) ; iteato->next = element->next; fee(element); etun 0; 36

Λίστες στη C #define N 10 stuct elem { value[ν]; int count ; stuct elem *next; ; typedef stuct elem Element; Τα στοιχεία της λίστας είναι τύπου Element int FindWod(const *, Element *); void AppendWod(const *, Element **); void DeleteWod(const *, Element **); void RepotList(Element * const); Element *CeateNode (void ); Υπάρχουν διαδικασίες που μπορεί να αλλάξουν την αρχική διεύθυνση (διαγραφή πρώτου στοιχείου, προσθήκη πρώτου στοιχείου) 37

Δέσμευση μνήμης για στοιχείο λίστας Element *CeateNode (void ) { etun (Element *) malloc (sizeof (Element)) ; 38

Προσθήκη στοιχείου στη λίστα void AppendWod(const *wod, Element **list_pt) { Element *item_iteato = *list_pt; Element *new_wod = CeateNode(); Αν η λίστα υπάρχει, να βάλεις το νέο στοιχείο στο τέλος if (*list_pt!=null) { fo( ; item_iteato->next!=null;item_iteato=item_iteato->next) ; item_iteato->next = new_wod; else { Αν η λίστα δεν υπάρχει, να είναι αυτό το πρώτο στοιχείο *list_pt = new_wod; stcpy(new_wod->value, wod); new_wod->next=null; 39

Παράδειγμα void RepotList(Element * const list) { Element *item_iteato = list; if (list == NULL) { pintf("empty list\n"); else { fo(;item_iteato!=null;item_iteato=item_iteato->next) pintf("wod: %s\n", item_iteato->value); 40

Αναζήτηση στη λίστα int FindWod(const *s, Element *alist) { Element *test = alist; int found = 0; while ((test->next!= NULL) &&(!found)) { pintf("%s ", test->value); found =!stcmp (s, test->value); if (found) (test->count)++; test = test->next; etun found; 41

Διαγραφή στοιχείου/αποδέσμευση μνήμης void DeleteWod(const *wod, Element **list_pt) { Element *test = *list_pt, *pev; int found = 0; pev = NULL; pintf("deleting...\n"); while ((test!= NULL) &&(!found)) { pintf("%s ", test->value); found =!stcmp (wod, test->value); if (found) (test->count)++; else { pev = test; test = test->next; if (found) { pintf("wod found: %s.\n", test->value); if (pev == NULL) *list_pt = test->next; else { pintf("pevious wod: %s\n", pev->value); pev->next = test->next; fee(test); 42

Σημείωμα αναφοράς Copyight Πανεπιστήμιο Πατρών, Παλιουράς Βασίλειος, Δερματάς Ευάγγελος «Αρχές Προγραμματισμού». Έκδοση: 1.0. Πάτρα 2015 Διαθέσιμο από τη δικτυακιακή διέυθυνση https://eclass.upatas.g/modules/ 43