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

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

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

Διάλεξη 18η: Διαχείρηση Αρχείων

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

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

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

Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου ( ) gepap@aueb.gr

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

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

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

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

Περιεχόμενα. Πρόλογος... 21

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

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

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

i M-1 1. ij f(i, j) N-1. (pixel) 2. M N (x, y) (x, y ) = 256. R(x, y), G(x, y), B(x, y)

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

Περιεχόμενα. Πρόλογος... 17

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

FILE *fopen(const char *fname, const char *mode) void fclose(file *f) void fflush(file *f)

Ενδεικτική περιγραφή μαθήματος

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

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

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

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

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

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

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

Εργαστήριο 9: Αρχεία

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

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

C: Από τη Θεωρία στην Εφαρμογή

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

Προγραμματισμός σε C. Αρχεία κειμένου (Text files)

Φροντιςτήριο. Linked-List

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

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

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

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

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

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

Περιεχόµενα. Πρόλογος... 15

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

Βιβλιοθήκη stdio. Προγραμματισμός II 1

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

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

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

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

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

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

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

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

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

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

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

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

Βιβλιοθήκη stdio. Προγραμματισμός II 1

ΑΡΧΕΙΑ ΚΕΙΜΕΝΟΥ ΣΤΗΝ C

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

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

Επεξεργασία Αρχείων Κειµένου

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

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

Προγραµµατισµός. Αρχεία

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

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

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

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

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

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

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός σε C. Αρχεία κειμένου (Text files)

4ο σετ σημειώσεων - Χειρισμός αρχείων και structs

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

Αρχεία εδοµένων. Προγραµµατισµός Ι 1

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

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

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

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

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

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

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

Συναρτήσεις πρότυπης βιβλιοθήκης 1. Μερικές συνήθεις συναρτήσεις βιβλιοθήκης int atoi(const char *p) int fclose(file *fp)

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

Δομημένος Προγραμματισμός (ΤΛ1006)

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

Η γλώσσα προγραμματισμού C Χειρισμός αρχείων

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

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

Transcript:

Αρχές Προγραμματισμού https://eclass.upatras.gr/courses/ee806/index.php Βασίλης Παλιουράς paliuras@ece.upatras.gr ΠΕΡΙΣΣΟΤΕΡΑ ΓΙΑ ΑΡΧΕΙΑ 1

int main ( ) { int i; int num; FILE *data ; if ((data = fopen ("dataout.txt", "wt") )==NULL) { printf("cannot create file.\n"); exit(1); for ( i = 0; i < 10 ; i++) fprintf (data, "number i: %d\n", i); fclose(data); if((data = fopen ("numbers.txt", "rt"))==null) { printf("cannot read from file.\n"); exit(1); ; while (fscanf(data, "%d", &num)!=eof) printf("%d ", num); fclose(data); int main(int argc, char *argv[]) { int n; FILE * pfile; char buffer [27]; pfile = fopen ("test.txt","w+"); for ( n='a' ; n<='z' ; n++) fputc ( n, pfile); rewind (pfile); fread (buffer,1,26,pfile); fclose (pfile); buffer[26]='\0'; puts (buffer); 2

fwrite ( ) size_t fwrite ( const void * ptr, size_t size, size_t count, FILE *stream ); Γράφει περιοχή μνήμης στη ροή stream Παράμετροι ptr Δείκτης σε πίνακα στοιχείων προς εγγραφή. size μέγεθος κάθε στοιχείου σε bytes count πλήθος στοιχείων καθένα μεγέθους size bytes. stream Δείκτης σε FILE size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); Παράμετροι Ptr Δείκτης σε μπλοκ μνήμης ελάχιστου μεγέθους (size*count) bytes. Size Μέγεθος σε bytes κάθε στοιχείου προς ανάγνωση. Count Πλήθος στοιχείων καθένα μεγέθους size bytes. Stream Δείκτης σε FILE 3

typedef struct data{ int a; char name[10]; Data; int main(int argc, char *argv[]) { Data mydata[] = {{5, "red", {10, "black", {11,"yellow"; Data mycopy[10]; FILE *testio; int i; testio = fopen ("mydata.bin", "wb"); fwrite (mydata, sizeof (Data), 3, testio); fclose(testio); testio = fopen ("mydata.bin", "rb"); fread(mycopy, sizeof (Data), 3, testio); fclose(testio); for (i=0;i<3;i++) printf("value: %d\nname: %s\n", mycopy[i].a, mycopy[i].name); int fseek ( FILE * stream, long int offset, int origin ); Παράμετροι Δείκτης σε FILE. Offset πλήθος bytes για πρόσθεση στο origin. Origin τρέχουσα θέση στην οποία προστίθεται το offset. Μπορεί να είναι μια από τις σταθερές: SEEK_SET Αρχή αρχείου SEEK_CUR Τρέχουσα θέση SEEK_END Τέλος αρχείου 4

typedef struct data{ int a; char name[10]; Data; int main(int argc, char *argv[]) { FILE * testio; long filesize; Data * mycopy; size_t result; int numberofelems; int i; testio = fopen ( "mydata.bin", "rb" ); if (testio == NULL) printf("failed to open\n"); else printf("stream open\n"); fseek(testio, 0, SEEK_END); filesize = ftell (testio); rewind (testio); mycopy = (Data *) malloc (sizeof (char)*filesize); result = fread(mycopy,1,filesize,testio); if (result!= filesize) { fputs ("Reading error",stderr); exit(3); fclose (testio); numberofelems=(filesize)/(sizeof(data)); printf("data elements read: %d\n", numberofelems); for (i=0;i<numberofelems;i++) printf( "value: %d\nname: %s\n", mycopy[i].a, mycopy[i].name); free (mycopy); system("pause"); ΕΠΙΣΤΡΟΦΗ ΣΕ ΛΙΣΤΕΣ 5

Στατική δήλωση Listelement c = { "Giannis", 5, NULL; Δυναμική δήλωση στοιχείου της λίστας Listelement *element_ptr; element_ptr = (Listelement *) malloc ( sizeof (Listelement)); strcpy((*element_ptr).name,"ntina"); (*element_ptr).age = 9; (*element_ptr).next = NULL; Άλλος συμβολισμός, ενδεικτικά: element_ptr->name αντί (*element_ptr).name Listelement *element_ptr; element_ptr = (Listelement *) malloc ( sizeof (Listelement)); strcpy(element_ptr->name,"ntina"); element_ptr->age = 9; element_ptr->next = NULL; 11 #include <string.h> #define L 30 struct listelement { char name[l]; int age; struct listelement *next; ; typedef struct listelement Listelement; typedef Listelement * Listelement_ptr; int main(int argc, char *argv[]) { /* Initialize */ Listelement_ptr iterator=null, element_ptr, previous_ptr, first_ptr; /* create elements and put them to list*/ element_ptr = (Listelement_ptr) malloc ( sizeof (Listelement)); strcpy(element_ptr->name,"ntina"); element_ptr -> age = 9; element_ptr -> next = NULL; first_ptr = element_ptr; previous_ptr = element_ptr; element_ptr = (Listelement_ptr) malloc ( sizeof (Listelement)); strcpy(element_ptr->name,"giannis"); element_ptr -> age = 6 ; previous_ptr -> next = element_ptr; /* Access elements */ for (iterator = first_ptr; iterator!= NULL ; iterator = iterator->next) { printf( "name: %s\n", iterator->name); printf("age: %d\n", iterator->age); 12 6

mytypes.h #define L 30 struct listelement { char name[l]; int age; struct listelement *next; ; typedef struct listelement Listelement; typedef Listelement * Listelement_ptr; typedef Listelement * List; 13 Τύποι λίστας στο mytypes.h Listelement Στοιχείο λίστας (struct listelement) Listelement_ptr Δείκτης σε στοιχείο λίστας. Ίδιο με struct listelement * Listelement * List Δείκτης σε στοιχείο λίστας Μεταβλητές αυτού του τύπου δείχνουν Στο πρώτο στοιχείο της λίστας ή Έχουν την τιμή NULL (κενή λίστα). 7

Δημιουργία στοιχείου #include <string.h> Listelement_ptr createnewelement(char word[], int number) { Listelement_ptr newelement_ptr; newelement_ptr = (Listelement_ptr) malloc ( sizeof (Listelement)); strcpy(newelement_ptr->name, word); newelement_ptr -> age = number; newelement_ptr -> next = NULL; return newelement_ptr; 15 Διατρέχει όλα τα στοιχεία της λίστας void reportlist(list const alist) { Listelement_ptr iterator= alist; for (; iterator!= NULL ; iterator = iterator->next) { printf( "name: %s\n", iterator->name); printf("age: %d\n", iterator->age); NULL 16 8

(*iterator).next Listelement_ptr iterator = alist; alist NULL Αφού το iterator γίνει NULL, ο βρόχος τερματίζεται. Έχει διατρέξει ΟΛΑ τα στοιχεία της λίστας. iterator = alist iterator=null for (; iterator!= NULL ; iterator = iterator->next) 17 Προσθήκη στοιχείου στο τέλος λίστας NULL Παράμετρος δείκτης σε λίστα ή διπλός δείκτης σε στοιχείο void addtolist (List *list, Listelement_ptr elem_ptr ) { Listelement_ptr iterator = *list; if (*list==null) /* handle empty list*/ *list = elem_ptr; else { /* if not empty, move to last element list*/ for (; iterator->next!= NULL; iterator = iterator->next); /* append element to list */ iterator->next = elem_ptr; Όταν βγει από το βρόχο, ο iterator δείχνει στο τελευταίο στοιχείο 18 9

iterator->next Listelement_ptr iterator = *list; *list NULL Αφού το iterator->next γίνει NULL, ο βρόχος τερματίζεται. To iterator δείχνει στο Τελευταίο στοιχείο. iterator = *list iterator->next=null for (; iterator->next!= NULL ; iterator = iterator->next) 19 #include <string.h> #include "mytypes.h Listelement_ptr createnewelement(char *, int); Listelement_ptr findelementbyname(list, char []); void reportlist( List const); void addtolist(list *, Listelement_ptr); void deleteelement(list *, Listelement_ptr); int main(int argc, char *argv[]) { /* Initialize */ Listelement_ptr iterator=null, element_ptr, previous_ptr; List nameslist = NULL; char name[50]; /* create elements and put them to list*/ element_ptr = createnewelement("ntina", 10); addtolist (&nameslist, element_ptr); element_ptr = createnewelement("giannis", 5); addtolist( &nameslist, element_ptr); element_ptr = createnewelement("maria", 7); addtolist( &nameslist, element_ptr); reportlist(nameslist); /* find, delete, report */ do { printf("name: "); scanf("%s", name); element_ptr = findelementbyname(nameslist, name); if (element_ptr) { printf("found it. data: %d\n", element_ptr->age); deleteelement(&nameslist, element_ptr); reportlist(nameslist); while (nameslist!=null) ; Παράδειγμα χρήσης συναρτήσεων 20 10

Λίστα ως παράμετρος με αναφορά void addtolist (List *, Listelement_ptr ); List nameslist = NULL; Listelement_ptr = element_ptr; element_ptr = createnewelement("ntina", 10); addtolist (&nameslist, element_ptr); Τιμές πριν την εκτέλεση της addtolist Τιμές μετά την εκτέλεση της addtolist Η nameslist αποθηκεύεται στη θέση 22FE48. Η τιμή της nameslist αλλάζει μετά την κλήση της addtolist. (όχι η θέση της!) Τύπος της nameslist: List Τύπος της θέσης της: List * Θέση της namelist ( ή &nameslist) 22FE48 Τιμή της namelist 2F7BB0 NULL Πριν την κλήση της addtolist Μετά την κλήση της addtolist 11

Διαγραφή στοιχείου Παράμετρος: δείκτης σε λίστα ή διπλός δείκτης σε στοιχείο λίστας int deleteelement(list *alist, Listelement_ptr element) { Listelement_ptr iterator = *alist, todelete_ptr; if (element == NULL *alist == NULL) return -1 ; if (element== *alist) { /* if required, delete first element */ *alist = element->next ; free(element); else { /* find the element before the one to be deleted */ for(; iterator->next!= element; iterator = iterator->next) ; iterator->next = element->next; free(element); 23 int deleteelement(list *alist, Listelement_ptr todelete_ptr) { Listelement_ptr iterator = *alist; if (todelete_ptr == NULL *alist == NULL) return -1 ; if (todelete_ptr == *alist) { *alist = todelete_ptr->next ; free(todelete_ptr); else { Διαγραφή με πρόβλεψη το στοιχείο να μην υπάρχει στη λίστα Όσο δείχνεις σε στοιχείο της λίστας (iterator!=null) ΚΑΙ το επόμενο στοιχείο δεν είναι το προς διαγραφή (iterator->next!= todelete_ptr), πήγαινε στο επόμενο στοιχείο for(; iterator!= NULL && iterator->next!= todelete_ptr ; iterator = iterator->next) ; if (iterator!=null) { iterator->next = todelete_ptr->next; free(todelete_ptr); else { printf("element not in list"); return -1; Αν μετά το βρόχο το iterator δείχνει σε στοιχείο (!=NULL), αυτό είναι το ακριβώς προηγούμενο από το προς διαγραφή. 12

int deleteelement(list *alist, Listelement_ptr todelete_ptr) { Listelement_ptr iterator = *alist; Διαγραφή με πρόβλεψη το στοιχείο να μην υπάρχει στη λίστα if (todelete_ptr == NULL *alist == NULL) return -1 ; if (todelete_ptr == *alist) { /* if required, delete first element*/ *alist = todelete_ptr->next ; Πρώτα χρησιμοποιώ το todelete_ptr free(todelete_ptr); Μετά αποδεσμεύεται με free else { /* find the element before the one to be deleted or continue until no more elements in list */ for(; iterator!= NULL && iterator->next!= todelete_ptr ; iterator = iterator->next) ; if (iterator!=null) { iterator->next = todelete_ptr->next; free(todelete_ptr); else { printf("element not in list"); return -1; Τι θα γίνει αν γράψουμε iterator->next!=todelete_ptr && iterator!=null αντί για iterator!=null && iterator->next!=todelete_ptr Χρήσιμα σημεία σε συναρτήσεις επεξεργασίας λίστας Η λίστα ως παράμετρος Αναφερόμαστε σε λίστα με τη διεύθυνση του πρώτου στοιχείου Μερικές συναρτήσεις αλλάζουν τη διεύθυνση του πρώτου στοιχείου (προσθέτουν, διαγράφουν, ) Άλλες όχι (εκτύπωση, καταμέτρηση, αναζήτηση ) Πρώτα χρησιμοποιώ, μετά διαγράφω Βρίσκω και καλύπτω ειδικές περιπτώσεις Ενδεικτικά: άδεια λίστα, πρώτο στοιχείο, κενό στοιχείο ως είσοδος 13

Αναδρομική αναζήτηση σε λίστα #include <string.h> Listelement_ptr recfind(list alist, char name[]) { if (alist == NULL) return NULL; else if (!strcmp(alist->name, name)) return alist; else return recfind(alist->next, name); Διαγραφή στοιχείου Παράμετρος: δείκτης σε λίστα ή διπλός δείκτης σε στοιχείο λίστας int deleteelement(list *alist, Listelement_ptr element) { Listelement_ptr iterator = *alist, todelete_ptr; if (element == NULL *alist == NULL) return -1 ; if (element== *alist) { /* if required, delete first element */ *alist = element->next ; free(element); else { /* find the element before the one to be deleted */ for(; iterator->next!= element; iterator = iterator->next) ; iterator->next = element->next; free(element); 28 14

int deleteelement(list *alist, Listelement_ptr todelete_ptr) { Listelement_ptr iterator = *alist; Διαγραφή με πρόβλεψη το στοιχείο να μην υπάρχει στη λίστα if (todelete_ptr == NULL *alist == NULL) return -1 ; if (todelete_ptr == *alist) { *alist = todelete_ptr->next ; free(todelete_ptr); else { Όσο δείχνεις σε στοιχείο της λίστας (iterator!=null) ΚΑΙ το επόμενο στοιχείο δεν είναι το προς διαγραφή (iterator->next!= todelete_ptr), πήγαινε στο επόμενο στοιχείο for(; iterator!= NULL && iterator->next!= todelete_ptr ; iterator = iterator->next) ; if (iterator!=null) { iterator->next = todelete_ptr->next; free(todelete_ptr); else { printf("element not in list"); return -1; Αν μετά το βρόχο το iterator δείχνει σε στοιχείο (!=NULL), αυτό είναι το ακριβώς προηγούμενο από το προς διαγραφή. int deleteelement(list *alist, Listelement_ptr todelete_ptr) { Listelement_ptr iterator = *alist; Διαγραφή με πρόβλεψη το στοιχείο να μην υπάρχει στη λίστα if (todelete_ptr == NULL *alist == NULL) return -1 ; if (todelete_ptr == *alist) { /* if required, delete first element*/ *alist = todelete_ptr->next ; Πρώτα χρησιμοποιώ το todelete_ptr free(todelete_ptr); Μετά αποδεσμεύεται με free else { /* find the element before the one to be deleted or continue until no more elements in list */ for(; iterator!= NULL && iterator->next!= todelete_ptr ; iterator = iterator->next) ; if (iterator!=null) { iterator->next = todelete_ptr->next; free(todelete_ptr); else { printf("element not in list"); return -1; Τι θα γίνει αν γράψουμε iterator->next!=todelete_ptr && iterator!=null αντί για iterator!=null && iterator->next!=todelete_ptr 15

Χρήσιμα σημεία σε συναρτήσεις επεξεργασίας λίστας Η λίστα ως παράμετρος Αναφερόμαστε σε λίστα με τη διεύθυνση του πρώτου στοιχείου Μερικές συναρτήσεις αλλάζουν τη διεύθυνση του πρώτου στοιχείου (προσθέτουν, διαγράφουν, ) Άλλες όχι (εκτύπωση, καταμέτρηση, αναζήτηση ) Πρώτα χρησιμοποιώ, μετά διαγράφω Βρίσκω και καλύπτω ειδικές περιπτώσεις Ενδεικτικά: άδεια λίστα, πρώτο στοιχείο, κενό στοιχείο ως είσοδος Αναδρομική αναζήτηση σε λίστα #include <string.h> Listelement_ptr recfind(list alist, char name[]) { if (alist == NULL) return NULL; else if (!strcmp(alist->name, name)) return alist; else return recfind(alist->next, name); 16