ertyiopos Δημοσ. 27 Φεβρουαρίου 2014 Δημοσ. 27 Φεβρουαρίου 2014 Καλησπέρα σας! Έχω φτιάξει το ακόλουθο πρόγραμμα (λίστα) σε c++ #include <iostream> using namespace std; class node{ public: node(); void insert(); void print(); private: int value; int size=0; node *next; node *head; node *tail; }; node::node(){ head = 0, tail = 0; } int main(){ node ll; while (1){ cout << "1. Insert\n2. Print All "; int opt; cin >> opt; switch(opt){ case 1: ll.insert(); break; case 2: ll.print(); break; }//end switch }//end while return 0; }//end main void node::insert(){ node *temp = new node; cout << "Value: "; cin >> temp->value; temp -> next = 0; //insert at tail. if (head != NULL && tail != NULL)\ { tail->next = temp; tail = temp; } else { head = temp; tail = temp; } size++; } void node::print(){ node *h = head; while (h!= NULL){ cout << h->value << endl; h = h->next; } cout << "Size is: " << size << endl; } (Ελπίζω να έφτιαξα καλά την στοίχιση του προγράμματος ) Θέλω να φτιάξω μια συνάρτηση που θα μεταφέρει όλα τα values της λίστας μια θέση προς τα πίσω. π.χ: πείτε οτι δίνω στην αρχή 1234 θελώ μετά την χρησιμοποίηση τις συνάρτησης να γίνετε 234. Όποια λύση ευπρόσδεκτη ευχαριστώ εκ των προτέρων!
Bluezy Δημοσ. 27 Φεβρουαρίου 2014 Δημοσ. 27 Φεβρουαρίου 2014 Είναι κακογραμμένος ο κώδικας σου με την έννοια ότι δεν βγαίνει εύκολα νόημα καθώς τα έχεις βάλει όλα μαζί και δεν μπορεί να διαχειριστεί εύκολα... Αρχικά δημιούργησε μια class Lista η οποία αποθηκεύει αντικείμενα τύπου Node, όπου θα έχει τα firstNode και lastNode που θα αντιστοιχούν στον πρώτο και στον τελευταίο Node της Lista και θα είναι τύπου Node Επίσης θα έχει τις function print() η οποία θα εμφανίζει όλους τους κόμβους της Lista και την insert() που θα εισάγει έναν Node στην Lista... Επίσης κάθε αντικείμενενο τύπου Node θα έχει το value του, τον nextNode και τον previousNode τα οποία θα είναι τύπου Node και μια function printValue() που θα εμφανίζει την τιμή του κόμβου... Έτσι δημιουργώντας την Lista και τον Node ξεχωριστά θα μπορείς να τα διαχεριστείς πολύ πιο εύκολα σε σχέση με το πως το έχεις γράψει εσύ... 1
ertyiopos Δημοσ. 27 Φεβρουαρίου 2014 Μέλος Δημοσ. 27 Φεβρουαρίου 2014 (επεξεργασμένο) Είναι κακογραμμένος ο κώδικας σου με την έννοια ότι δεν βγαίνει εύκολα νόημα καθώς τα έχεις βάλει όλα μαζί και δεν μπορεί να διαχειριστεί εύκολα... Αρχικά δημιούργησε μια class Lista η οποία αποθηκεύει αντικείμενα τύπου Node, όπου θα έχει τα firstNode και lastNode που θα αντιστοιχούν στον πρώτο και στον τελευταίο Node της Lista και θα είναι τύπου Node Επίσης θα έχει τις function print() η οποία θα εμφανίζει όλους τους κόμβους της Lista και την insert() που θα εισάγει έναν Node στην Lista... Επίσης κάθε αντικείμενενο τύπου Node θα έχει το value του, τον nextNode και τον previousNode τα οποία θα είναι τύπου Node και μια function printValue() που θα εμφανίζει την τιμή του κόμβου... Έτσι δημιουργώντας την Lista και τον Node ξεχωριστά θα μπορείς να τα διαχεριστείς πολύ πιο εύκολα σε σχέση με το πως το έχεις γράψει εσύ... δηλαδή να φτιάξω μια κλάση που να έχει μια struct μέσα? Έτσι όπως το έχω φτιάξει (χωρι struct) το ίδιο δεν είναι? αφου κάνει οτι κάνει και μια λίστα.. Επεξ/σία 27 Φεβρουαρίου 2014 από ertyiopos
ertyiopos Δημοσ. 28 Φεβρουαρίου 2014 Μέλος Δημοσ. 28 Φεβρουαρίου 2014 Προσπάθησα να την κάνω διπλά συνδεδεμένη και έκανα class node { private: int id; node *next; node *prev; node *head; node *tail; public: node(); void insert(); void print(); }; και επείδη δεν ξέρω πώς ακριβώς είναι η διπλά συνδεδεμένη υπέθεσα οτι το insert θα είναι κάπως έτσι: void node::insert() { node * temp = new node; cout << "Value: " ; cin >> temp->id; temp -> next = 0; temp -> prev = 0; if( head!= NULL && tail!= NULL ) { tail -> next = temp; tail -> prev = tail; tail = temp; } else { head = temp; tail = temp; } } το temp θα μπεί στον επόμενο του ήδη υπάρχον tail άρα ο προήγουμενος του temp θα είναι το υπάρχον tail και μετά το καινουργιο tail θα είναι το temp (έτσι το σκέφτηκα ελπίζω να είναι σωστό) αλλά όταν πάω να εκτυπώσω απ πίσω πρως τα μπρος χρησημοποιώντας τον ακόλουθο κώδικα void node::print(){ node *h = tail; while (h!= NULL){ cout << h->id << endl; h = h->prev; } } βάζοντας σαν values π.χ 1,2,3 μου εμφανίζει μόνο το 3 και σταματάει γιατί όμως? Αφού το καινούργιο h θα ειναι ο προηγούμενος δεν θα έπρεπε να βγάλει το 2? ( νομίζω οτι στο Insert έχω κάνει λάθος και δεν μπαίνει τπτ στο prev ) χρειάζομαι τα φώτα σας plz
Bluezy Δημοσ. 28 Φεβρουαρίου 2014 Δημοσ. 28 Φεβρουαρίου 2014 void node::insert() { node * temp = new node; cout << "Value: " ; cin >> temp->id; temp -> next = 0; temp -> prev = 0; if( head!= NULL && tail!= NULL ) { tail -> next = temp; tail -> prev = tail; tail = temp; } else { head = temp; tail = temp; } } Στον παραπάνω κώδικα το tail -> prev = tail; άλλαξε το σε temp -> prev =tail;
ertyiopos Δημοσ. 28 Φεβρουαρίου 2014 Μέλος Δημοσ. 28 Φεβρουαρίου 2014 Ναι το έκανα έτσι και δούλεψε ευχαριστώ πολύ!! Όσο για το αλλό που λέγαμε δηλαδή να φτιαξω μια συνάρτηση που να μεταφέρει όλα κατα 1 πίσω δήλαδη να βάζω 1,2,3,4 και να μου βγάζει 2,3,4,1 σκέφτηκα το εξής πρόγραμμα void node::resume() { node *h = head, *current = head, *temp = NULL; while ( current != NULL ) { h = h->next; next = h->next; prev = temp; temp = current; current = current->next; } } το h το έχω βάλει να είναι ίσο με τον επομενό του γιατί σκέφτηκα ότι θα πρεπεί το next να είναι ίσο με τον επόμενο του επόμενου του αφόυ αμα μπεί για την πρώτη θέση ο επόμενος της θα πρέπει να είναι το 3 αφόυ στη θέση πρώτη τώρα πια είναι το 2. Μετά ο προηγούμενος της πρώτης θέσης είναι πάντα ίσος με NULL και ετσί έφτιαξα μια μεταβλητή temp που στην αρχή θα είναι ΝULL αλλά στη επομενη επανάληψη θα αλλάζει.Τέλος το current το κάνω ίσο με το επομενό του αφου η πρώτη θέση θα πρέπει να έχει το 2. Δεν μου λειτουργεί καθόλου όμως και δεν μπορώ να σκεφτώ καποιό καλύτερο τρόπο.Μπορείτε να μου γράψετε κάποια συνάρτηση που να κάνει αυτό που θέλω?
DeltaLover Δημοσ. 28 Φεβρουαρίου 2014 Δημοσ. 28 Φεβρουαρίου 2014 - Το tail το χρειαζεσαι οπωσδηποτε? - Τι γινεται την μνημη που κανεις allocate στο heap?
Bluezy Δημοσ. 1 Μαρτίου 2014 Δημοσ. 1 Μαρτίου 2014 void node::resume() { node *h = head; int number = head->id; head->id = head->next->id; node *current = head->next; while(current!=tail){ current->id = current->next->id; current = current->next; } current->id = number; }
ertyiopos Δημοσ. 2 Μαρτίου 2014 Μέλος Δημοσ. 2 Μαρτίου 2014 void node::resume() { node *h = head; int number = head->id; head->id = head->next->id; node *current = head->next; while(current!=tail){ current->id = current->next->id; current = current->next; } current->id = number; } ευχαριστώ πολύ!!
ertyiopos Δημοσ. 5 Μαρτίου 2014 Μέλος Δημοσ. 5 Μαρτίου 2014 Καλησπέρα και πάλι μου δημιουργήθηκε το ακόλουθο πρόβλημα θέλω να φτίαξω τον δημιουργό της κλάσεις μου να παιρνει μια μεταβλητή π.χ: node::node( int x ): size(x) { } αυτό είναι στην main: N = atoi(argv[1]); node players(N): νομίζω σωστά τα έχω αλλά ο compiler μου βγάζει πρόβλημα στην συνάρτηση insert και λέει no matching function call to node::node() η insert είναι αυτή: void node::insert() { node *temp = new node; cout << "Give the player id: "; cin >> temp -> id; temp -> next = 0; if ( head != NULL && tail != NULL ) { tail->next = temp; tail = temp; } else { head = temp; tail = temp; } } τι πρέπει να φτιάξω???
Bluezy Δημοσ. 5 Μαρτίου 2014 Δημοσ. 5 Μαρτίου 2014 Τον προηγούμενο constructor σου node::node(){ head = 0, tail = 0; } τον έσβησες και στην θέση του έγραψες τον καινούργιο με την παράμετρο ή τον κράτησες?
ertyiopos Δημοσ. 5 Μαρτίου 2014 Μέλος Δημοσ. 5 Μαρτίου 2014 Τον προηγούμενο constructor σου node::node(){ head = 0, tail = 0; } τον έσβησες και στην θέση του έγραψες τον καινούργιο με την παράμετρο ή τον κράτησες? όχι τον κράτησα. Πρέπει μέσα στα άγκιστρα να μην υπάρχει τπτ?
Bluezy Δημοσ. 5 Μαρτίου 2014 Δημοσ. 5 Μαρτίου 2014 Τότε μάλλον δεν έχεις τον προηγούμενο constructor δηλωμένο στην node. Η node θα πρέπει να έχει δηλωμένους τους constructor έτσι : public: node(); node(int);
ertyiopos Δημοσ. 5 Μαρτίου 2014 Μέλος Δημοσ. 5 Μαρτίου 2014 Τότε μάλλον δεν έχεις τον προηγούμενο constructor δηλωμένο στην node. Η node θα πρέπει να έχει δηλωμένους τους constructor έτσι : public: node(); node(int); έτσι των δήλωσα τον constructor class node { public: node(int); ~node(); } και στο .cpp αρχείο είναι node::node(int x):size(x) { head = 0; tail = 0; }
Bluezy Δημοσ. 5 Μαρτίου 2014 Δημοσ. 5 Μαρτίου 2014 class node { public: node(int); ~node(); } Το παραπάνω είναι ένας constructor με παράμετρο int και ένας deconstructor... Σου ξαναλέω ότι θες μέσα στην node και το node() δηλαδή έναν constructor χωρίς καμία παράμετρο.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα