C++双链表程序
C++ Doubly Linked List Program
几个月来我一直在尝试自学编程,我已经买了大约三本书,并在YouTube上观看了大量视频,到目前为止,这些视频很棒。但是在过去的一周左右,由于链表,我被难住了!我明白了整个概念,但语法正在杀死我!我已经编写了一些非常简单的链表程序用于锻炼,但现在我正在尝试编写一个程序,其中我将一些信息从文件(申请签证的人的信息)加载到链接列表中,然后再次显示整个批次(一旦完成,我计划将其扩展到我只显示某些节点并删除某些节点的位置,但我不会详细介绍)。希望下面显示的代码不会太长,如果我能得到一些指针(没有双关语)或一些片段来帮助我理解这些东西,那就太棒了!
附注:其中一些代码来自书中的类似示例。
这是主要的(大部分)与循环加载信息(它不起作用)
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 deletedn";
}
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 emptyn";
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;
};
最后是签证申请.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
}
我收到错误"调用'列表::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)
但在你的主中,你用类 Node 的对象调用方法。尝试
void List ::appendNode(Node * pNode)
{
而不是:
void List ::appendNode(node_data * value)
{
Node * pNode = createNode(value);
此外,正如评论中已经建议的那样。始终在您的问题中写下整个错误代码,包括位置。最佳做法是同时包含编译器和操作系统。
根据你自己对函数的声明,你不能调用
myList.appendNode(pNode); //add node to list
使用指向 Node
的指针,您需要在此处传递类型 node_data*
的指针。
正如其他人在评论中提到的,您的代码中还有很多其他缺陷和错误。
你声明并定义了 appendNode 作为 void appendNode(node_data * value); 但是你试图使用 myList.appendNode(pNode) 调用它;//add node to list,这里的 pNode 是 Node 类型的对象,所以你得到了错误。
假设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。
OT:该程序充满了泄漏,请阅读我对你的问题的评论
双链表主要用于计算机应用程序。我在一个网站中找到了一个非常好和高效的双向链表程序
唯一的区别是单链表和双链表是额外的指针,它有助于从左到右或左右>遍历链表。
双向链表程序C++:http://www.techfinite.net/2013/11/double-linked-list-program-and-algorithm.html
我尝试在Node
类中定义零参数Node
构造函数并设置pNext = this
和pPrev = this
。我还没有运行你的代码,但这个错误可能是因为你正在Node
构造函数调用一个零参数,但你还没有定义一个。
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- 我一直试图弄清楚我在这个链表程序中做错了什么
- 程序的输出不是来的,它是一个链表程序
- 程序在为链表创建推送函数时崩溃
- C++ 链表程序打印最后一个数据项 n 次
- 带有类和链表的简单C++程序
- cpp 中的以下链表程序有什么问题?
- 程序 使用链表插入数据时停止工作
- C++链表简单程序崩溃
- C++ 程序中双链表的未处理异常
- 在 c++ 程序中调试链表以添加两个数字: 有人可以解释为什么 l3=l3->next;导致错误?
- 家庭作业的排序链表程序中的分段错误
- C++程序崩溃与链表
- 将二进制树更改为双链表的程序
- 如何创建一个带有链表的程序,该链表会破坏第 n 个元素
- 第一次运行程序时出现损坏的双链表错误,后续运行正常
- 尝试在链表程序的末尾进行更简单的插入.小问题需要帮助
- C++程序将链表从位置 m 反转到 n
- 双向链表复制构造函数和程序崩溃
- 试图理解我的链表程序中的内存泄漏