Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σας!

 

Έχω φτιάξει το ακόλουθο πρόγραμμα (λίστα) σε 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.

 

Όποια λύση ευπρόσδεκτη ευχαριστώ εκ των προτέρων!

Δημοσ.

Είναι κακογραμμένος ο κώδικας σου με την έννοια ότι δεν βγαίνει εύκολα νόημα καθώς τα έχεις βάλει όλα μαζί και δεν μπορεί να διαχειριστεί εύκολα...

 

Αρχικά δημιούργησε μια class Lista η οποία αποθηκεύει αντικείμενα τύπου Node, όπου θα έχει τα firstNode και lastNode που θα αντιστοιχούν στον πρώτο και στον τελευταίο Node της Lista και θα είναι τύπου Node

Επίσης θα έχει τις function print() η οποία θα εμφανίζει όλους τους κόμβους της Lista και την insert() που θα εισάγει έναν Node στην Lista...

 

Επίσης κάθε αντικείμενενο τύπου Node θα έχει το value του, τον nextNode και τον previousNode τα οποία θα είναι τύπου Node και μια function printValue() που θα εμφανίζει την τιμή του κόμβου...

 

Έτσι δημιουργώντας την Lista και τον Node ξεχωριστά θα μπορείς να τα διαχεριστείς πολύ πιο εύκολα σε σχέση με το πως το έχεις γράψει εσύ...

 

:-)

  • Like 1
Δημοσ. (επεξεργασμένο)

Είναι κακογραμμένος ο κώδικας σου με την έννοια ότι δεν βγαίνει εύκολα νόημα καθώς τα έχεις βάλει όλα μαζί και δεν μπορεί να διαχειριστεί εύκολα...

 

Αρχικά δημιούργησε μια 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)  το ίδιο δεν είναι? αφου κάνει οτι κάνει και μια λίστα..

Επεξ/σία από ertyiopos
Δημοσ.

Προσπάθησα να την κάνω διπλά συνδεδεμένη και έκανα

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  :)

Δημοσ.
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;

Δημοσ.

Ναι το έκανα έτσι και δούλεψε ευχαριστώ πολύ!! Όσο για το αλλό που λέγαμε δηλαδή να φτιαξω μια συνάρτηση που να μεταφέρει όλα κατα 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.

 

Δεν μου λειτουργεί καθόλου όμως και δεν μπορώ να σκεφτώ καποιό καλύτερο τρόπο.Μπορείτε να μου γράψετε κάποια συνάρτηση που να κάνει αυτό που θέλω?

Δημοσ.

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;

}
Δημοσ.
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;

}

ευχαριστώ πολύ!! :)

Δημοσ.

Καλησπέρα και πάλι μου δημιουργήθηκε το ακόλουθο πρόβλημα θέλω να φτίαξω τον δημιουργό της κλάσεις μου να παιρνει μια μεταβλητή  π.χ:

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;
        }
}

τι πρέπει να φτιάξω???

Δημοσ.

Τον προηγούμενο constructor σου

node::node(){
head = 0, tail = 0;
}

τον έσβησες και στην θέση του έγραψες τον καινούργιο με την παράμετρο ή τον κράτησες?

Δημοσ.

Τον προηγούμενο constructor σου

node::node(){
head = 0, tail = 0;
}

τον έσβησες και στην θέση του έγραψες τον καινούργιο με την παράμετρο ή τον κράτησες?

όχι τον κράτησα. Πρέπει μέσα στα άγκιστρα να μην υπάρχει τπτ?

Δημοσ.

Τότε μάλλον δεν έχεις τον προηγούμενο constructor δηλωμένο στην node.

 

Η node θα πρέπει να έχει δηλωμένους τους constructor έτσι :

public:
        node();
        node(int);
Δημοσ.

 

Τότε μάλλον δεν έχεις τον προηγούμενο 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;
}
Δημοσ.
class node
{
public:
        node(int);
        ~node();
}

Το παραπάνω είναι ένας constructor με παράμετρο int και ένας deconstructor...

 

Σου ξαναλέω ότι θες μέσα στην node και το node() δηλαδή έναν constructor χωρίς καμία παράμετρο.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...