我一直在努力自学编程几个月,我已经买了大约三本书,并在YouTube上看了很多视频,这些视频到目前为止一直很棒。但在过去一周左右的时间里,由于链接列表,我感到难过!我得到了整个概念,但语法正在杀了我!我已经写了一些非常简单的链接列表程序用于练习但是现在我正在尝试编写一个程序,我将一些文件中的信息(申请签证的人的信息)加载到链接列表中然后只是再次显示整个批次(一旦完成,我计划将它扩展到我只显示某些节点并删除某些节点,但我不会详细说明)。希望下面显示的代码不是太长,如果我可以得到一些指针(没有双关语)或一些片段来帮助我理解这些会很棒的东西!
p.s这段代码中的一些来自书中的类似例子。
这里是主要的(大部分)带有加载信息的循环(它不起作用)
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
}
这是我的类节点头文件
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 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;
};
最后签证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 *&amp;)'”以及其他一些东西。无论如何我知道这很长但是如果我能得到它会很棒一些帮助,我没有导师或老师或类似的人来帮助我,所以任何反馈将不胜感激!谢谢!
**编辑错误消息:
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*)
答案 0 :(得分:1)
据我所知,你的List只有方法:
void List::appendNode(node_data * value)
但在您的主要部分中,您使用Node类对象调用该方法。 尝试
void List ::appendNode(Node * pNode)
{
而不是:
void List ::appendNode(node_data * value)
{
Node * pNode = createNode(value);
另外,正如评论中已经建议的那样。在您的问题中始终写出整个errocode,包括位置。最佳做法是包含编译器和操作系统。
答案 1 :(得分:1)
根据你自己的功能声明你不能打电话
myList.appendNode(pNode); //add node to list
指向Node
的指针,您需要在那里传递node_data*
类型的指针。
正如其他人在评论中提到的,您的代码中存在许多其他缺陷和错误。
答案 2 :(得分:0)
您声明并将appendNode定义为void appendNode(node_data * value);但你试图使用myList.appendNode(pNode)调用它; //将节点添加到列表,这里的pNode是Node类型的对象,所以你得到了错误。
答案 3 :(得分:0)
假设node_data*
是void*
的某种typedef,换句话说就是void指针,您传递Node
作为数据而不是visa_application
。要解决这个问题,只需更改
myList.appendNode(pNode); //add node to list
到
myList.appendNode((node_data*)visa); //add node to list
你应该没事。您还可以在main
函数中删除节点的内存分配,因为这是List::createNode
正在执行的AFAIK。
答案 4 :(得分:0)
双重链接列表主要用于计算机应用程序。 我在一个网站上找到了一个非常好用且有效的双链接列表程序
只有单个链表和双链表之间的区别是额外的指针,它有助于从左到右或从左到右遍历链表。
双重链接列表C ++程序:http://www.techfinite.net/2013/11/double-linked-list-program-and-algorithm.html
答案 5 :(得分:0)
我尝试在Node
类中定义零参数Node
构造函数,并设置pNext = this
和pPrev = this
。
我没有运行你的代码,但是这个错误可能是因为你正在调用一个零参数Node
构造函数,但你还没有定义它。