baskat Δημοσ. 12 Μαΐου 2013 Μέλος Δημοσ. 12 Μαΐου 2013 Εστω οτι το κανω με τον δικο μου τροπο. Μπορεις να με βοηθησεις λιγο με τον κωδικα διασυνδεσης?? Ο κωδικας θα γινει μεσα στη main ή οχι??
sonyxp Δημοσ. 12 Μαΐου 2013 Δημοσ. 12 Μαΐου 2013 struct s_stili { int stoixeio; struct s_stili *next; }; struct s_grammi { struct s_stili stili; struct s_grammi *next; }; Αν κατάλαβα καλά αυτό δεν είναι η δομή της φωτογραφίας ? Αυτό που σου έδωσε ο sonyxp (και που θα μπορούσες να δεις σε χιλιάδες sites στο internet) είναι έτοιμη η δομή αλλά για "μονή" λίστα. Από αυτό λοιπόν και από το σχηματικό σου δεν μπορούσες να φανταστείς πως θα ήταν η "διπλή" ? για τι είναι? Κάτσε, ίσως δεν κατάλαβα κάτι... νόμιζα ότι το παιδί μίλαγε για "Double Linked Lists". Τοπικ Σταρτερ: αυτό στην εικόνα δεν είναι DLL (Διπλά συνδεδεμένη λίστα)
imitheos Δημοσ. 12 Μαΐου 2013 Δημοσ. 12 Μαΐου 2013 για τι είναι? Κάτσε, ίσως δεν κατάλαβα κάτι... νόμιζα ότι το παιδί μίλαγε για "Double Linked Lists". Τοπικ Σταρτερ: αυτό στην εικόνα δεν είναι DLL (Διπλά συνδεδεμένη λίστα) Δεν εννοούσα singly και doubly linked list για αυτό έβαλα τα εισαγωγικά. Όπου διπλή εννοούσα τη λίστα του OP που τα δεδομένα της είναι και αυτά λίστα. Λάθος επιλογή όρων από μέρους μου για αυτό μπερδεύτηκες.
sonyxp Δημοσ. 12 Μαΐου 2013 Δημοσ. 12 Μαΐου 2013 Δεν εννοούσα singly και doubly linked list για αυτό έβαλα τα εισαγωγικά. Όπου διπλή εννοούσα τη λίστα του OP που τα δεδομένα της είναι και αυτά λίστα. Λάθος επιλογή όρων από μέρους μου για αυτό μπερδεύτηκες. It's ok! Βασικά μπερδεύτηκα με τον topic starter, με το "διασυνδεμένες" κατάλαβα "DLL"
migf1 Δημοσ. 12 Μαΐου 2013 Δημοσ. 12 Μαΐου 2013 Εστω οτι το κανω με τον δικο μου τροπο. Μπορεις να με βοηθησεις λιγο με τον κωδικα διασυνδεσης?? Ο κωδικας θα γινει μεσα στη main ή οχι?? Τη διασύνδεση μπορείς να την κάνεις όπου θεωρείς εσύ πιο χρήσιμο. Σου έγραψα λίγο κώδικα που δημιουργεί μια λίστα από 4 GrammiNodes, με το κάθε node να περιέχει στο dataList filed του τυχαία παραγόμενες λίστες από DataNodes. Χρησιμοποιεί τις δομές που έιπες πως θέλεις να κρατήσεις. Πιθανότατα να μου έχουν ξεφύγει τίποτα bugs, αλλά σου έβαλα αρκετά σχόλια (στα αγγλικά)... #include <stdio.h> #include <stdlib.h> #include <time.h> #define DBG_ERROR( msg ) \ fprintf( stderr, "*** %s|%s|%d: %s\n", __FILE__, __func__, __LINE__, (msg) ) typedef struct DataNode DataNode; struct DataNode { int stili; int stoixeio; DataNode *next; }; typedef struct GrammiNode GrammiNode; struct GrammiNode { int id; DataNode *dataList; GrammiNode *next; }; /* ----------------------------------- * Return a newly allocated DataNode containing the specified stili & stoixeio, * or return NULL on error. * * It is the caller's responsibility to free the node, when done using it. */ DataNode *make_data( int stili, int stoixeio ) { DataNode *ret = malloc( sizeof(DataNode) ); if ( NULL == ret ) return NULL; ret->stili = stili; ret->stoixeio = stoixeio; ret->next = NULL; return ret; } /* ----------------------------------- * Free all nodes in the list of DataNodes that starts at head. * head is passed by reference because it's set to NULL after completion. */ void dataList_free( DataNode **head ) { DataNode *temp = NULL; if ( !head || !*head ) return; temp = *head; while ( (*head)->next ) { temp = (*head)->next; free( *head ); *head = temp; } *head = NULL; } /* ----------------------------------- * Print the contents of all nodes in a list of DataNodes that starts at head. * * The title string is printed before anything else, unless it is passed as NULL. * The boolen indent controls whether priniting should be intended (1) or not (0). */ void dataList_print( const DataNode *head, const char *title, int indent ) { char c = indent ? '\t' : '\0'; /* prefix char for nested printout */ if ( title ) { printf( "%c%s", c, title ); fflush( stdout ); } if ( !head ) { DBG_ERROR( "EINVAL (NULL pointer arg)" ); return; } while ( head ) { printf( "%cstili : %d\n", c, head->stili ); printf( "%cstoixeio: %d\n", c, head->stoixeio ); printf( "%cnext : @0x%X\n", c, (unsigned long)head->next ); putchar( '\n' ); head = head->next; } } /* ----------------------------------- * Create a newly allocated DataNode containing the specified stili & stoixeio, * and prepend it before the head of a list of DataNodes. * * head which is passed by reference, represents the starting node in the list * of DataNodes. If its dereferneced value is NULL, then the list is created * with just the node allocated by this function. * It is the caller's responsibility to free this node when done using it. * * The function returns 1 (true) on success, 0 (false) otherwise. */ int dataList_prepend( DataNode **head, int stili, int stoixeio ) { DataNode *node = NULL; if ( !head ) { DBG_ERROR( "EINVAL (NULL pointer arg)" ); return 0; /* false */ } node = make_data( stili, stoixeio ); if ( NULL == node ) { DBG_ERROR( "ENOMEM (possible memory shortage)" ); return 0; /* false */ } node->next = *head; *head = node; return 1; /* true */ } /* ----------------------------------- * Create and return a list of nelems DataNodes, each one containing random * values for its stili & stoixeio fields (the values for stili are restriced * in the range [0, 255]). * * It is the caller's responsibility to free all nodes of the list, when done * using it. * * The function returns a pointer to the created list on success, NULL otherwise. */ DataNode *dataList_make_randomly( int nelems ) { int i = 0; DataNode *ret = NULL; if ( nelems < 1 ) { DBG_ERROR( "EINVAL (zero or negative value of nelems)" ); return NULL; } for (i=0; i < nelems; i++ ) { int stili = rand() % 256; int stoixeio = rand(); dataList_prepend( &ret, stili, stoixeio ); } return ret; } /* ----------------------------------- * Return a newly allocated GrammiNode containing the specified id. * or return NULL on error. * * It is the caller's responsibility to free the node, when done using it. */ GrammiNode *make_grammi( int id ) { GrammiNode *ret = malloc( sizeof(GrammiNode) ); if ( NULL == ret ) return NULL; ret->id = id; ret->dataList = NULL; ret->next = NULL; return ret; } /* ----------------------------------- * Free all nodes in the list of GrammiNodes that starts at head. * head is passed by reference because it's set to NULL after completion. */ void grammiList_free( GrammiNode **head ) { GrammiNode *temp = NULL; if ( !head || !*head ) return; temp = *head; while ( (*head)->next ) { temp = (*head)->next; if ( (*head)->dataList ) dataList_free( &(*head)->dataList ); free( *head ); *head = temp; } *head = NULL; } /* ----------------------------------- * Print the contents of all nodes in a list of GrammiNodes that starts at head. * The title c-string is printed before anything else, unless it is passed as NULL. */ void grammiList_print( const GrammiNode *head, const char *title ) { if ( title ) { printf( "%s", title ); fflush( stdout ); } if ( !head ) { DBG_ERROR( "EINVAL (NULL pointer arg)" ); return; } while ( head ) { printf( "id : %d\n", head->id ); printf( "dataList: @0x%X\n", (unsigned long)head->dataList ); if ( head->dataList ) dataList_print( head->dataList, "--- dataList ---\n", 1 ); printf( "next : @0x%X\n", (unsigned long)head->next ); putchar( '\n' ); head = head->next; } } /* ----------------------------------- * Create a newly allocated GrammiNode containing the specified id and dataList, * and prepend it before the head of a list of GrammiNodes. * * head which is passed by reference, represents the starting node in the list * of GrammiNodes. If its dereferneced value is NULL, then the list is created * with just the node allocated by this function. * It is the caller's responsibility to free this node when done using it. * * The function returns 1 (true) on success, 0 (false) otherwise. */ int grammiList_prepend( GrammiNode **head, int id, DataNode *dataList ) { GrammiNode *node = NULL; if ( !head ) { DBG_ERROR( "EINVAL (NULL pointer arg)" ); return 0; /* false */ } node = make_grammi( id ); if ( NULL == node ) { DBG_ERROR( "ENOMEM (possible memory shortage)" ); return 0; /* false */ } node->dataList = dataList; node->next = *head; *head = node; return 1; } /* ----------------------------------- * */ GrammiNode *grammiList_lookup_id( const GrammiNode *head, int id ) { GrammiNode *walk = (GrammiNode *) head; if ( !head ) return NULL; while ( walk ) { if ( walk->id == id ) return walk; } return NULL; } /* ----------------------------------- * Enrty point of the program */ int main( void ) { int i = 0; GrammiNode *grammiList = NULL; /* initialize seed for pseudo random generator */ srand( time(NULL) ); /* * Create grammiList as a list of 4 GrammiNodes, each one having its * dataList field set to a newly created list of DataNodes. Each one * of those DataNodes lists is populated by a random number of nodes * ranging from 1 to 5 (inclusive) via the function dataList_make_randomly(). * This function in turn, assign random values in the fields stili and * stoixeio of every node. */ for (i=0; i < 4; i++) { DataNode *dataList = dataList_make_randomly( rand() % 5 + 1 ); grammiList_prepend( &grammiList, i, dataList ); } grammiList_print( grammiList, "--- CONTENTS OF grammiList ---\n\n" ); grammiList_free( &grammiList ); system( "pause" ); /* Windows only */ return 0; } Ο κώδικας είναι σε C (και όχι σε C++) γιατί με αυτήν είμαι περισσότερο εξοικειωμένος οπότε μου βγαίνει πιο φυσικά (εννοώ πως δεν χρειάζεται να ανατρέχω συχνά σε τεκμηριώσεις). Έξοδος: --- CONTENTS OF grammiList --- id : 3 dataList: @0x3E2DF8 --- dataList --- stili : 250 stoixeio: 23383 next : @0x3E2DE0 stili : 84 stoixeio: 12452 next : @0x3E2DC8 stili : 237 stoixeio: 2794 next : @0x3E2DB0 stili : 117 stoixeio: 19264 next : @0x3E2D98 stili : 219 stoixeio: 12106 next : @0x0 next : @0x3E2D80 id : 2 dataList: @0x3E2D68 --- dataList --- stili : 49 stoixeio: 18424 next : @0x0 next : @0x3E2D50 id : 1 dataList: @0x3E2D38 --- dataList --- stili : 185 stoixeio: 18973 next : @0x3E2D20 stili : 64 stoixeio: 27495 next : @0x3E2D08 stili : 42 stoixeio: 17495 next : @0x3E2CF0 stili : 170 stoixeio: 21803 next : @0x3E2CD8 stili : 80 stoixeio: 15575 next : @0x0 next : @0x3E2CC0 id : 0 dataList: @0x3E2CA8 --- dataList --- stili : 143 stoixeio: 5869 next : @0x3E2C90 stili : 250 stoixeio: 2560 next : @0x0 next : @0x0 Press any key to continue . . .
cyberrobot Δημοσ. 12 Μαΐου 2013 Δημοσ. 12 Μαΐου 2013 Δεν ξέρω άμα σε ενδιαφέρει και αν σε βοηθάει αλλά στην C++ υπάρχει η βιβλιοθήκη boost, νομίζω ότι έχει κάτι σχετικό "έτοιμο", nice timing πάντως γιατί και εγώ ψάχνομαι για το συγκεκριμένο θέμα (linked lists). Από αύριο θα αρχίσω την υλοποίηση σε C... άμα έχεις υπομονή... Υπάρχει πάντως πάρα πολύ υλικό στο νετ!
Timonkaipumpa Δημοσ. 13 Μαΐου 2013 Δημοσ. 13 Μαΐου 2013 Ντε και καλά boost; http://www.cplusplus.com/reference/list/list/ Έχει πολύ πιο πολλά πράγματα η C++ έτοιμα και εύκολα, από ό,τι μπορεί να φανταστεί κάποιος που δεν την έχει λιώσει καμία δεκαετία. (όχι, εγώ δεν είμαι αυτός... μιας και εγώ κάθε φορά που βρίσκω νέα πράγματα λέω "μα πόσο μ@μ@τη η C++, πόσο μ@μ@τη;" ) Και εάν θέλει κανείς single linked... http://www.cplusplus.com/reference/forward_list/forward_list/
migf1 Δημοσ. 13 Μαΐου 2013 Δημοσ. 13 Μαΐου 2013 ... Και εάν θέλει κανείς single linked... http://www.cplusplus.com/reference/forward_list/forward_list/ Από τα μέχρι τώρα δεδομένα που μας έχει δώσει ο φίλος μάλλον την forward_list χρειάζεται. Το θέμα είναι αν τους επιτρέπουν να χρησιμοποιήσουν έτοιμα. Αν πρόκειται για εκπαίδευση, μάλλον θα τους έχουν ζητήσει να τα φτιάξουν μόνοι τους.
kostis89 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 Παιδιά καλησπέρα. Λοιπόν, έχω κι εγώ την ίδια άσκηση με το φίλο που ανέβασε το θέμα κι έχω δυσκολευτεί κι εγώ. Η άσκηση αυτή ζητάει να αναπαραστήσουμε έναν αραιό πίνακα(δηλαδή που τα περισσότερα στοιχεία του είναι μηδενικά) που εισάγει ο χρήστης, με τη βοήθεια λιστών. Χρειάζεται λέει μια λίστα(η κατακόρυφη που υπάρχει στη αρχική εικόνα) που περιέχει σαν κόμβους τις γραμμές του δοθέντος πίνακα , οι οποίες έχουν ένα τουλάχιστον μη μηδενικό στοιχείο. Ο κάθε κόμβος της λίστας αυτής θα συνδέεται με μια (οριζόντια) λίστα που θα περιέχει σε κάθε κόμβο της, τη στήλη και τον αριθμό που υπάρχει στον πίνακα. έτσι λοιπον έφτιαξα αυτές τις 2 δομές για αρχή: struct columns{ int columnumber; int value; columns* next; }; struct line{ int linenumber; line* next; columns* column; }; Έπειτα όπως θα δείτε στον παρακάτω κώδικα , φτίαχνω κάποιους τυχαίους κόμβους , και πάω να τους εκτυπώσω, και μου βγαίνουν ένα σωρό σφαλματα.. #include <cstdlib> #include <iostream> using namespace std; /* * */ int main(int argc, char** argv) { struct columns{ int columnumber; int value; columns* next; }; struct line{ int linenumber; line* next; columns* column; }; line* ln,lh,lt,pr; columns* cc,cn,ch,ct,prc; ln=new line; ln->linenumber=1; lt=*ln; lh=*ln; cn=new columns; cn.columnumber=1; cn.value=11; lt.column=cn; ct=cn; cn=new columns; cn.columnumber=4; cn.value=14; ct.next=*cn; ct=*cn; ln=new line; ln->linenumber=3; lt.next=ln; lt=*ln; cn=new columns; cn.columnumber=1; cn.value=11; lt.column=*cn; ct=*cn; cn=new columns; cn.columnumber=4; cn.value=14; ct.next=*cn; ct=*cn; cout <<"H stili twn grammwn einai:"; pr = lh; while(pr!=NULL){ cout << pr.linenumber << " "; cout <<"H stili twn stilwn einai:"; prc=cn; while(prc!=NULL){ cout << prc.columnumber << " "; pr = prc.next; } pr = *pr.next; cout<<endl; } return 0; } Και φυσικά θέλω βοήθεια!!
migf1 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 Καλησπέρα και καλώς όρισες στο φόρουμ. Τον κώδικα που έχω δώσει τον είδες (είναι σε spoiler, μαζί με την έξοδό του); Δεν σε βοηθάει; Χρησιμοποιεί ακριβώς τις ίδιες δομές.
defacer Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 Φίλε Κωστή, αν θέλεις να μάθεις θα πρέπει να αντιμετωπίζεις τα σφάλματα στα ίσια μέχρι να τα δαμάσεις -- διαφορετικά, μια ζωή θα πασαλείβεις. Ξεκίνα κάνοντας το πιο απλό: Βάλε σωστό formatting στον κώδικα που ποστάρεις. Επειδή ο editor στο insomnia είναι άθλιος, μπορείς ίσως να βάλεις τον κώδικα σε κάτι του στυλ pastebin.com και να δώσεις ένα link. Δεν έχουμε κρυστάλλινη σφαίρα. Αν θέλεις βοήθεια θα πρέπει να βοηθήσεις και συ. Κάνε copy/paste τα 3-4 πρώτα σφάλματα ακριβώς όπως στα δίνει ο compiler. Δεν έχει νόημα να τα ποστάρεις όλα αν είναι πολλά γιατί συνήθως, ειδικά στη c++, ένα λάθος προκαλεί χιονοστιβάδα μηνυμάτων οπότε μπορεί φτιάχοντας ένα πράγμα από 100 σφάλματα να πέσεις σε 10. Τα σφάλματα αναφέρουν αριθμούς γραμμών. Βεβαιώσου ότι στον κώδικα που πόσταρες είναι ξεκάθαρα σημειωμένο ποιά είναι κάθε γραμμή από αυτές που αναφέρονται στα σφάλματα. Βεβαιώσου ότι ο κώδικας που πόσταρες είναι 200% ίδιος με αυτόν που έκανες compile και σου έδωσε τα σφάλματα. Αν είναι δυνατόν, δώσε ένα SSCCE. Αν κάνεις τα παραπάνω σωστά σύντομα θα πάρεις απάντηση. Αφού την εφαρμόσεις, κάτσε κάτω και προσπάθησε να καταλάβεις ακριβώς ποιό ήταν το σφάλμα σου και για ποιό λόγο η λύση το διορθώνει. Αν δεν καταλαβαίνεις, ρώτα για λεπτομέρειες. Αν δεν το κάνεις αυτό, είσαι καταδικασμένος να κάνεις ξανά και ξανά τα ίδια λάθη. Go to 2.
kostis89 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 Καλησπέρα και καλώς όρισες στο φόρουμ. Τον κώδικα που έχω δώσει τον είδες (είναι σε spoiler, μαζί με την έξοδό του); Δεν σε βοηθάει; Χρησιμοποιεί ακριβώς τις ίδιες δομές. Καλώς σας βρήκα παίδες..Τον έχω κοιτάξει τον κώδικα που έχεις βάλει, αλλά σε χάνω σε πολλά σημεία ως προς την υλοποίηση λόγω μάλλον έλλειψης γνώσης που έχω. Βλέπεις είναι η πρώτη φορά που ασχολούμαι με λίστες, και τα βρήκα σκούρα.
migf1 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 1η φορά και σας έβαλαν τέτοια εργασία; Πολύ κουφό μου ακούγεται! Σας επιτρέπουν τουλάχιστον να χρησιμοποιήσετε έτοιμες templates της C++ ή πρέπει να τα φτιάξετε μόνοι σας;
kostis89 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 Γεια σου defacer! Εδώ είναι το link για τον editor με το μικρότερο δυνατό κώδικα, κάποια απο τα σφάλματα και αριθμημένες τις γραμμές. Ευχαριστώ για το χρόνο σας παιδιά 1η φορά και σας έβαλαν τέτοια εργασία; Πολύ κουφό μου ακούγεται! Σας επιτρέπουν τουλάχιστον να χρησιμοποιήσετε έτοιμες templates της C++ ή πρέπει να τα φτιάξετε μόνοι σας; Ναι δεν υπάρχει πρρόβλημα.Αλλά μπαίνεις σε αυτή τη διαδικασία όταν μιλάμε για αυτές τις δομές και μάλιστα όταν δε το κατέχεις;; Και να ήταν το μόνο κουφό που έχουμε συναντήσει καλα θα ήταν.
migf1 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 Το ναι πάει στο ότι σας επιτρέπουν να χρησιμοποιήσετε π.χ STL templates;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα