C++ Liste Doublement Chaînée Programme
J'ai essayé de m'enseigner la programmation depuis quelques mois maintenant, je l'ai acheté à propos de trois livres et regardé une tonne de vidéos sur YouTube qui a été très bien jusqu'à présent. Mais la semaine dernière, ou alors j'ai été perplexe grâce à des listes liées! Je reçois l'ensemble du concept, mais la syntaxe est en train de me tuer! J'ai écrit quelques très simple des listes liées à des programmes d'exercice, mais maintenant je suis en train d'écrire un programme où je charge quelques informations à partir d'un fichier (informations de personnes qui ont fait une demande de visa) sur un lien d'une liste, il vous suffit d'afficher l'ensemble du lot de nouveau(une fois que c'est fait j'ai l'intention de l'étendre à d'où je afficher seulement certains nœuds et de retirer certaines des nœuds, mais je ne vais pas rentrer dans les détails). J'espère que le code ci-dessous n'est pas trop longue et si seulement je pouvais obtenir quelques conseils (no pun intended) ou certains fragments de code pour m'aider à comprendre ce qui se serait génial!
p.s une partie de ce code est à partir d'un exemple similaire dans un livre.
ici est le principal(en plus)avec la boucle à la charge de l'information(il ne fonctionne pas)
List myList;
visa_application *visa;
Node * pNode;
string visa_type;//these are all the variables that i want to load from the file
int invoice_no;
string surname;
string firstname;
double contact;
string status;
string result;
ifstream in;
in.open("applications.txt",ios::in);
while (!in.eof()){
pNode = new Node;
visa = new visa_application; //allocate memory for nodes
in >> visa-> visa_type >> visa->invoice_no >> visa-> surname;
in >> visa-> firstname >> visa-> contact >> visa-> status >> visa-> result ;
pNode->nData = &visa; //put some data in the node
myList.appendNode(pNode); //add node to list
}
Voici mon nœud de la classe fichier d'en-tête
class Node
{
friend class List;
private:
node_data * nData;
Node *pNext;
Node *pPrev;
public:
Node (node_data * data){nData = data;
pNext = NULL;
pPrev = NULL;}
node_data * getData(){return nData;}
};
voici la liste des cours fichier d'en-tête
class List
{
private:
Node *pHead;
Node *pTail;
Node *createNode(node_data * data);
public:
List ();
~List();
Node *getpHead (){ return pHead;}
Node *getpTail (){return pTail;}
Node *previousNode(Node *pNode){return pNode->pPrev;}
Node *nextNode (Node *pNode){return pNode->pNext;}
void appendNode(node_data * value);
void insertNode(node_data * value, Node *pAfter);
void removeNode(Node *pNode);
bool isEmpty();
void printList();
};
List ::List() {
pHead=NULL;
pTail=NULL;
}
List ::~List(){
while (!isEmpty()) //keep on removing until the
//head points to NULL
removeNode(pHead);
cout << "List deleted\n";
}
Node * List::createNode(node_data * data){
Node * pNode = new Node (data); //allocate memory for new node and
//intialize value to data
return pNode;
}
bool List ::isEmpty(){
return pHead == NULL;
}
void List ::appendNode(node_data * value)
{
Node * pNode = createNode(value);
if (isEmpty()) { //if list is empty
pHead = pNode; //make head point to pNode
pNode->pPrev = NULL;
}
else { //otherwise
pTail->pNext = pNode; //make tail point to pNode
pNode->pPrev = pTail;
}
pTail = pNode; //tail is now pNode
pNode->pNext = NULL; //pNode next now points to NULL
}
void List ::insertNode(node_data * value, Node *pAfter)
{
Node *pNode = createNode(value);
pNode->pNext = pAfter->pNext;
pNode->pPrev = pAfter;
if (pAfter->pNext != NULL)
pAfter->pNext->pPrev = pNode;
else
pTail = pNode;
pAfter->pNext = pNode;
}
void List ::removeNode(Node *pNode)
{
if (pNode->pPrev == NULL) //if removing the head
pHead = pNode->pNext;
else
pNode->pPrev->pNext = pNode->pNext; //if removing a middle node
if (pNode->pNext == NULL) //if removing the tail
pTail = pNode->pPrev;
else
pNode->pNext->pPrev = pNode->pPrev;
pNode = NULL;
delete pNode; //*free the memory
}
void List ::printList()
{
Node *pNode=pHead;
if (isEmpty())
cout << "The list is empty\n";
else
for (pNode = pHead; pNode != NULL; pNode = pNode->pNext)
pNode->nData->print();
}
Ma classe de demande de visa fichier d'en-tête
class visa_application
{
public:
//class constructor
visa_application();
//class destructor
~visa_application();
private:
string visa_type;
int invoice_no;
string surname;
string firstname;
double contact;
string status;
string result;
};
et enfin le visa application.cpp
visa_application::visa_application()
{
string visa_type = none;
int invoice_no = 0;
string surname = none;
string firstname = none;
double contact = 00;
string status = none;
string result = none;
}
class destructor
visa_application::~visa_application()
{
//insert your code here
}
J'obtiens le message d'erreur "no matching function for call to `Liste::appendNode(Noeud*&)'" parmi quelques autres choses.De toute façon je sais que c'est long, mais ce serait génial si je pouvais obtenir de l'aide, je n'ai pas de tuteur ou un professeur ou quelqu'un comme ça pour m'aider afin que tous les commentaires seront très appréciés! Merci!
**MODIFIER les messages d'erreur sont:
no matching function for call to `Node::Node()'
candidates are: Node::Node(const Node&)
Node::Node(node_data*)
no matching function for call to `List::appendNode(Node*&)'
candidates are: void List::appendNode(node_data*)
while (!in.eof()){pNode = new Node;
Je pense que vous ne le supprimez paspNode
données ici afin que votre programme est une fuite de mémoire...Pas une solution, mais son bon de savoir. Edit: en va de même pourvisa
- Lorsque vous ne
pNode->nData = &visa;
vous définissez lanData
membre de pointeur vers un pointeur vers unvisa_application
, ce n'est probablement pas ce que vous voulez. - Aussi, merci de poster la version complète et non censurée journal des messages d'erreur. Et où dans la posté source les erreurs sont.
pNode = NULL;delete pNode; //*free the memory
Vous êtes invalide et puis la suppression de pas de mémoire...Vous devriez avoir ces autres sens. Pour être honnête, vous avez votre programme de fuite de mémoire dans tous les sens. Je sais que c'est pas le point de la question, mais je pense que vous devriez revenir sur des poiners et de la gestion de la mémoire allouée dynamiquement. Pour résumer: rien dans le code (en gros) est supprimé.- Et ce qui sur terre est
node_data
? Il n'y a aucune mention de ce class/struct/typedef dans votre programme.
Vous devez vous connecter pour publier un commentaire.
Aussi loin que je le vois, votre Liste est seulement la méthode:
mais dans votre main, vous appelez la methode avec un objet de la classe Node.
Essayez
au lieu de:
Aussi, comme l'a déjà suggéré dans les commentaires. Écrire toujours à l'ensemble de la errocode dans votre question, y compris la position. Meilleure pratique consiste à inclure le compilateur et les os trop.
Selon votre propre déclaration de la fonction, vous ne pouvez pas appeler
avec un pointeur vers
Node
, vous aurez besoin de passer un pointeur de typenode_data*
là.Comme d'autres l'ont mentionné dans les commentaires, il y a beaucoup d'autres failles et les erreurs dans votre code.
Vous déclarées et définies appendNode comme nulle appendNode(node_data * valeur); mais vous avez essayé de l'appeler à l'aide myList.appendNode(pNode); //ajout d'un nœud à la liste, pNode ici est un objet de type de Nœud, de sorte que vous avez obtenu votre erreur.
En supposant
node_data*
est une sorte de définition de type devoid*
en d'autres termes nuls pointeur, vous êtes de passage àNode
que vos données au lieu de votrevisa_application
. Pour résoudre ce simplement changerà
et vous devriez être bien. Vous pouvez également vous débarrasser de l'allocation de mémoire pour le nœud dans votre
main
fonction que c'est ce que votreList::createNode
est de faire autant que je sache.OT: le programme est plein de fuites, de lire mes commentaires sur votre question
Liste doublement chaînée sont très majorly utilisé dans des applications informatiques .
J'ai trouvé un très bon programme pour la liste Doublement Liée à un site
Seule différence bertween unique linkedlist et liste doublement chaînée est extra pointeur qui permet de parcourir la liste, de gauche à droite ou de droite->gauche .
Programme pour la liste Doublement chaînée C++ : http://www.techfinite.net/2013/11/double-linked-list-program-and-algorithm.html
J'essaie de définir le zéro paramètre
Node
constructeur dans laNode
de classe et de définirpNext = this
etpPrev = this
.Je n'ai pas exécuter votre code, mais que l'erreur pourrait être parce que vous appelez un zéro paramètre
Node
constructeur, mais vous n'avez pas défini un.