PDA

Visualizza la versione completa : [C++] Errore "Invalid conversion from int to node *"


Nikita82
30-08-2009, 21:14
Qualcuno mi pu aiutare ad individuare l'errore "invalid conversion from int to node *" che mi assilla in questo programma?? Ho bisogno con urgenza per l'esame di Algoritmi e Strutture di Dati di creare una lista doppiamnete linkata di interi, ma proprio non ci riesco. Ogni aiuto graditissimo. Grazie mille.


#include <iostream.h>

class node { // A simple class
protected:
int number; // Value stored in the node
node *next; // Pointer to next node
node *prev; // Pointer to previous node

public:
node() { next = NULL; prev = NULL; } // With a constructor
void insertBefore(int number, node *nodeB); // Seven methods
void insertAfter(int number, node *nodeA);
void removeBefore(node *nodeB);
void removeAfter(node *nodeA);
void removeNode(node *newNode);
void printDListFront();
void printDListBack();
~node(); // and a destructor
};


// This function inserts a node before nodeB
void node::insertBefore(int number, node *nodeB)
{
node *newNode;
newNode = new node;
newNode->prev = nodeB->prev;
newNode->next = nodeB;
newNode->number = number;

if (nodeB->prev == NULL) {
this->next = newNode;
}
nodeB->prev = newNode;
removeNode(newNode);
}

// Inserts a node after nodeB
void node::insertAfter(int number, node *nodeA)
{
node *newNode;
node *nodeB;
newNode = new node;
newNode->next = nodeB->next;
newNode->prev = nodeB;
newNode->number = number;

if (nodeB->next == NULL) {
cout << "Enter a digit : \n";
cin >> number;
this->prev = newNode;
}
nodeB->next = newNode;
}

// Removes before a node
void node::removeBefore(node *nodeB)
{
if (nodeB->prev == this->next) {
this->next = nodeB;
this->next->prev = NULL;
} else {
removeNode(nodeB->prev);
}
}

// Removes after a node
void node::removeAfter(node *nodeA)
{
if(nodeA->next == this->prev) {
this->prev = nodeA;
this->prev->next = NULL;
} else {
removeNode(nodeA->next);
}
}

// Removes a particular node
void node::removeNode(node *nodeToRemove)
{
if (nodeToRemove == this->next) {
this->next;
this->next->prev = NULL;
} else if (nodeToRemove == this->prev) {
this->prev;
this->prev->next = NULL;
} else {
nodeToRemove->prev->next = nodeToRemove->next;
nodeToRemove->next->prev = nodeToRemove->prev;
}
}

// Prints out the doubly linked list from front
void node::printDListFront()
{
node* temp;
temp = this->next;
cout << "--------------------------------\n";
cout << "List from front : \n";
cout << "--------------------------------\n";

while (temp != NULL) {
cout << "|" << temp->number << "|";
temp = temp->next;
}
cout << "\n\n";
}

// Prints out the doubly linked list from backwards
void node::printDListBack()
{
node* temp;
temp = this->prev;
cout << "--------------------------------\n";
cout << "List from backwards : \n";
cout << "--------------------------------\n";

while (temp != NULL) {
cout << "|" << temp->number << "|";
temp = temp->prev;
}
cout << "\n\n";
}


int main()
{
node *llista;
int num, NodeA, NodeB, NewNode;
int choice;
llista->node();

switch (choice) {
cout << "Enter 1 to insert a node before in the list; 2 to insert a node after; 3 to remove a node before; 4 to \n";
cout << "remove a node after; 5 to remove any node; 6 to print out the doubly linked list frontally; 7 to print \n";
cout << "out the doubly linked list from backwards; 0 to exit.\n\n";
cout << "Please enter your choice by number : \n";
cin >> choice;

case 1 :
llista->insertBefore(num, NodeB);
break;

case 2 :
llista->insertAfter(num, NodeA);
break;

case 3 :
llista->removeBefore(NodeB);
break;

case 4 :
llista->removeAfter(NodeA);
break;

case 5 :
llista->removeNode(NewNode);
break;

case 6 :
llista->printDListFront();
break;

case 7 :
llista->printDListBack();
break;

case 0 :
cout << "Exiting program!\n\n";
break;

default :
cout << "Sorry! Bad menu selection!\n\n";
break;
}

system("pause");
return 0;
}

alka
31-08-2009, 00:22
Ho corretto il titolo indicando il linguaggio e l'errore riscontrato.

Invito a leggere il Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887) per conoscere tutte le norme da seguire nella partecipazione e nell'apertura di discussioni.

Stoicenko
31-08-2009, 13:27
se non dici la riga difficile trovare..

ps: linguaggio in tag code

cmq il problama che la insertBefore vuole come se3condo parametro un node* e tu gli stai passando un int

Nikita82
31-08-2009, 21:17
Grazie per la risposta, Stoicenko.. Purtroppo non riesco a capire ancora dove sia l'errore dato che comunque il secondo parametro della funzione insertBefore(int numero, node *nodeB) un puntatore di tipo node.. L'errore inoltre riguarda tutte le funzioni (tranne le ultime due per la stampa), quindi le righe n. 153, 157, 161, 165, 169. Ho provato a dichiarare node *nodeB e node *nodeA come membri della classe node, per poi poterli inizializzare all'interno del costruttore node(), ma l'errore suddetto sussiste ancora..

Stoicenko
01-09-2009, 12:39
l'errore qui:



int num, NodeA, NodeB, NewNode;


NodeA e NodeB sono di tipo int..

prova a mettere:



int num;
node* NodeA, NodeB, NewNode;


in pi poi ci sono altri errori.. dichiari un puntatore a node* lista (non inizializzato) che poi vuoi usare un paio di righe dopo.. li ti dar sicuramente un Segmentation Fault

Nikita82
01-09-2009, 22:17
Ciao, Stoicenko. Adesso grazie ai tuoi consigli il mio programma va un po' meglio, ma non funziona perfettamente. Adesso il file eseguibile stampa a video solo l'output del distruttore e del default dello switch nel main() e non riesco a visualizzare l'intero menu. Sicuramente ci saranno degli errori semantici..
Adesso il sorgente appare cos:



#include <iostream.h>

class node { // A simple class
protected:
int number; // Value stored in the node
node *next; // Pointer to next node
node *prev; // Pointer to previous node
node *nodeB;
node *nodeA;
node *newNode;

public:
node() // With a constructor
{ next = NULL; prev = NULL; number = 0; nodeB = NULL; nodeA = NULL; node *newNode = NULL; }
void insertBefore(node *nodeB); // Seven methods
void insertAfter(int number, node *nodeA);
void removeBefore(node *nodeB);
void removeAfter(node *nodeA);
void removeNode(node *newNode);
void printDListFront();
void printDListBack();
~node(); // and a destructor
};


// This function inserts a node before nodeB
void node::insertBefore(node *nodeB)
{
newNode = new node;
newNode->prev = nodeB->prev;
newNode->next = nodeB;
newNode->number = number;

if (nodeB->prev == NULL) {
this->next = newNode;
}
nodeB->prev = newNode;
removeNode(newNode);
}

// Inserts a node after nodeB
void node::insertAfter(int number, node *nodeA)
{
node *newNode;
node *nodeB;
newNode = new node;
newNode->next = nodeB->next;
newNode->prev = nodeB;
newNode->number = number;

if (nodeB->next == NULL) {
cout << "Enter a digit : \n";
cin >> number;
this->prev = newNode;
}
nodeB->next = newNode;
}

// Removes before a node
void node::removeBefore(node *nodeB)
{
if (nodeB->prev == this->next) {
this->next = nodeB;
this->next->prev = NULL;
} else {
removeNode(nodeB->prev);
}
}

// Removes after a node
void node::removeAfter(node *nodeA)
{
if(nodeA->next == this->prev) {
this->prev = nodeA;
this->prev->next = NULL;
} else {
removeNode(nodeA->next);
}
}

// Removes a particular node
void node::removeNode(node *nodeToRemove)
{
if (nodeToRemove == this->next) {
this->next;
this->next->prev = NULL;
} else if (nodeToRemove == this->prev) {
this->prev;
this->prev->next = NULL;
} else {
nodeToRemove->prev->next = nodeToRemove->next;
nodeToRemove->next->prev = nodeToRemove->prev;
}
}

// Prints out the doubly linked list from front
void node::printDListFront()
{
node* temp;
temp = this->next;
cout << "--------------------------------\n";
cout << "List from front : \n";
cout << "--------------------------------\n";

while (temp != NULL) {
cout << "|" << temp->number << "|";
temp = temp->next;
}
cout << "\n\n";
}

// Prints out the doubly linked list from backwards
void node::printDListBack()
{
node* temp;
temp = this->prev;
cout << "--------------------------------\n";
cout << "List from backwards : \n";
cout << "--------------------------------\n";

while (temp != NULL) {
cout << "|" << temp->number << "|";
temp = temp->prev;
}
cout << "\n\n";
}

node::~node() // Destructor
{
cout << "Llist destructor speaking : \n";
next = NULL; prev = NULL;

if (next != NULL && prev != NULL) {
std::cerr << "Error: trying to destroy a non-empty list!\n\n";
}
}


int main()
{
node llista;
int num;
node *NodeA, *NodeB, *NewNode;
int choice;

node();

do {
switch (choice) {
cout << "Enter 1 to insert a node before in the list; 2 to insert a node after; 3 to remove a node before; 4 to \n";
cout << "remove a node after; 5 to remove any node; 6 to print out the doubly linked list frontally; 7 to print \n";
cout << "out the doubly linked list from backwards; 0 to exit.\n\n";
cout << "Please enter your choice by number : \n";
cin >> choice;

case 1 :
cout << "Enter a digit : ";
cin >> num;
llista.insertBefore(NodeB);
break;

case 2 :
cout << "Enter a digit : ";
cin >> num;
llista.insertAfter(num, NodeA);
break;

case 3 :
cout << "Enter a digit to remove : ";
cin >> num;
llista.removeBefore(NodeB);
break;

case 4 :
cout << "Enter a digit t remove : ";
cin >> num;
llista.removeAfter(NodeA);
break;

case 5 :
cout << "Choice a number to remove : ";
cin >> num;
llista.removeNode(NewNode);
break;

case 6 :
llista.printDListFront();
break;

case 7 :
llista.printDListBack();
break;

case 0 :
cout << "Exiting program!\n\n";
break;

default :
cout << "Sorry! Bad menu selection!\n\n";
break;
}
} while (choice == 0);

system("pause");
return 0;
}

Stoicenko
02-09-2009, 11:22
b subito cos vedo che il cin del choice lo metti dopo lo switch e come tale sbagliato..

anche perch choice non inizializzato (chiss che valore ha) e non entra mai nello switch

metti il cin prima e vedrai che fai gi passi avanti

ps: attenzione che stai facendo tanti errori sulle basi del linguaggio.. forse una ripassatina al tuo libro di c++ sarebbe una buona cosa

Nikita82
04-09-2009, 21:32
Grazie ancora dei tuoi suggerimenti. Adesso il programma va molto meglio, dopo che ho rivisto e modificato il mio programma passo per passo. Effettivamente avevo fatto degli errori "inguardabili", come ad esempio l'aver scritto tutto all'interno dello switch, e non aver inizializzato la variabile choice..

Loading