C++ C++;双链表程序

C++ C++;双链表程序,c++,linked-list,nodes,C++,Linked List,Nodes,几个月来,我一直在自学编程,我买了大约三本书,在YouTube上看了一吨视频,到目前为止,这一切都很棒。但在过去的一周左右,由于链接列表,我被难倒了!我明白了整个概念,但语法让我受不了!我已经写了一些非常简单的链表练习程序,但现在我正在尝试写一个程序,在这个程序中,我从一个文件(申请签证的人的信息)中加载一些信息到链表中,然后再次显示整个列表(完成后,我计划将其扩展到只显示某些节点和删除某些节点的位置,但我不会详细介绍)。希望下面显示的代码不会太长,如果我能得到一些指针(没有双关语)或一些片段来

几个月来,我一直在自学编程,我买了大约三本书,在YouTube上看了一吨视频,到目前为止,这一切都很棒。但在过去的一周左右,由于链接列表,我被难倒了!我明白了整个概念,但语法让我受不了!我已经写了一些非常简单的链表练习程序,但现在我正在尝试写一个程序,在这个程序中,我从一个文件(申请签证的人的信息)中加载一些信息到链表中,然后再次显示整个列表(完成后,我计划将其扩展到只显示某些节点和删除某些节点的位置,但我不会详细介绍)。希望下面显示的代码不会太长,如果我能得到一些指针(没有双关语)或一些片段来帮助我理解这些内容,那将非常棒

p、 其中一些代码来自一本书中的类似示例

这里是主要的(大部分)循环,用于加载信息(它不起作用)

这是我的类节点头文件

 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>我尝试在节点< /Cuff>类中定义零参数<代码>节点< /COD>构造函数,并设置<代码> PNTX=此和 PPRV=此
我没有运行您的代码,但该错误可能是因为您正在调用零参数
节点
构造函数,但尚未定义构造函数。

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