C++ C++;双链表程序
几个月来,我一直在自学编程,我买了大约三本书,在YouTube上看了一吨视频,到目前为止,这一切都很棒。但在过去的一周左右,由于链接列表,我被难倒了!我明白了整个概念,但语法让我受不了!我已经写了一些非常简单的链表练习程序,但现在我正在尝试写一个程序,在这个程序中,我从一个文件(申请签证的人的信息)中加载一些信息到链表中,然后再次显示整个列表(完成后,我计划将其扩展到只显示某些节点和删除某些节点的位置,但我不会详细介绍)。希望下面显示的代码不会太长,如果我能得到一些指针(没有双关语)或一些片段来帮助我理解这些内容,那将非常棒 p、 其中一些代码来自一本书中的类似示例 这里是主要的(大部分)循环,用于加载信息(它不起作用) 这是我的类节点头文件C++ C++;双链表程序,c++,linked-list,nodes,C++,Linked List,Nodes,几个月来,我一直在自学编程,我买了大约三本书,在YouTube上看了一吨视频,到目前为止,这一切都很棒。但在过去的一周左右,由于链接列表,我被难倒了!我明白了整个概念,但语法让我受不了!我已经写了一些非常简单的链表练习程序,但现在我正在尝试写一个程序,在这个程序中,我从一个文件(申请签证的人的信息)中加载一些信息到链表中,然后再次显示整个列表(完成后,我计划将其扩展到只显示某些节点和删除某些节点的位置,但我不会详细介绍)。希望下面显示的代码不会太长,如果我能得到一些指针(没有双关语)或一些片段来
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;}
};
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();
}
下面是类列表头文件
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;}
};
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();
}
最后是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
}
在其他一些事情中,我遇到了错误“调用'List::appendNode(Node*&')时没有匹配函数”。无论如何,我知道这很长,但如果我能得到一些帮助就太好了,我没有导师或老师或类似的人来帮助我,所以任何反馈都将非常感谢!谢谢
**编辑以下错误消息:
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*)
在我看来,您的列表只有以下方法:
void List::appendNode(node_data * value)
但在main中,使用类Node的对象调用methode。
试一试
而不是:
void List ::appendNode(node_data * value)
{
Node * pNode = createNode(value);
另外,正如评论中所建议的那样。始终在问题中编写完整的错误代码,包括位置。最佳做法是也包括编译器和操作系统。根据您自己对无法调用的函数的声明
myList.appendNode(pNode); //add node to list
如果指针指向节点
,则需要在此处传递节点_data*
类型的指针
正如其他人在评论中提到的,您的代码中还存在许多其他缺陷和错误。您将appendNode声明并定义为void appendNode(node_data*value);但您试图使用myList.appendNode(pNode)调用它;//将节点添加到列表中,pNode这里是节点类型的对象,因此您得到了错误。假设
node\u data*
是void*
的某种类型定义,换句话说,void指针,您将node
作为数据传递,而不是visa\u应用程序
。要解决此问题,只需更改
myList.appendNode(pNode); //add node to list
到
您应该很好。您还可以在main
函数中取消节点的内存分配,因为这就是您的List::createNode
正在做的事情
OT:该程序充满漏洞,请阅读我对您的问题的评论双链表主要用于计算机应用。 我在一个网站上找到了一个非常好而且高效的双链表程序 单链接列表和双链接列表的唯一区别是额外的指针,它有助于从左向右或从右->左遍历链接列表
<>双链表C++程序:< p>我尝试在
我没有运行您的代码,但该错误可能是因为您正在调用零参数
节点
构造函数,但尚未定义构造函数。while(!in.eof()){pNode=new Node;
我认为您没有删除这里的pNode
数据,因此您的程序正在泄漏内存…这不是一个解决方案,但很好知道。编辑:同样适用于visa
当您执行pNode->nData=&visa;
时,您将nData
成员设置为指向visa\u应用程序的指针,这是pr可能不是你想要的。另外,请发布完整且未经编辑的错误消息日志。并指出错误在发布的源代码中的位置。pNode=NULL;delete pNode;//*释放内存
你正在清空内存,然后不删除内存……你应该采取其他方法。老实说,你的程序到处都在泄漏内存这个地方。我知道这不是问题的重点,但我认为你应该回顾一下poiners和管理动态分配的内存。总结一下:代码中没有任何内容(基本上)被删除。而node\u data到底是什么?
?在你的程序中没有提到这个类/struct/typedef。
myList.appendNode(pNode); //add node to list
myList.appendNode((node_data*)visa); //add node to list