【问题标题】:C++ Doubly Linked List ProgramC++ 双向链表程序
【发布时间】:2013-10-21 08:55:12
【问题描述】:

几个月来,我一直在尝试自学编程,我已经购买了大约三本书,并在 YouTube 上观看了大量视频,这些视频到目前为止都很棒。但在过去的一周左右,多亏了链表,我被难住了!我明白了整个概念,但语法让我很生气!我已经编写了一些非常简单的链表程序来练习,但是现在我正在尝试编写一个程序,在该程序中,我将文件中的一些信息(已申请签证的人的信息)加载到链表中,然后就可以了再次显示全部内容(一旦完成,我计划将其扩展到仅显示某些节点​​并删除某些节点的位置,但我不会详细说明)。希望下面显示的代码不会太长,如果我能得到一些指针(不是双关语)或一些 sn-ps 来帮助我理解这些东西,那就太棒了!

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;     
};

最后是签证申请.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*&)'”等等。无论如何我知道这很长,但如果我能得到一些就太好了帮助,我没有导师或老师或类似的人来帮助我,所以任何反馈都将不胜感激!谢谢!

**EDIT 错误信息是:

 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; 我认为您没有在此处删除pNode 数据,因此您的程序正在泄漏内存...不是解决方案,但很高兴知道。编辑:visa 也是如此
  • 当您执行pNode-&gt;nData = &amp;visa; 时,您将nData 成员设置为指向visa_application 的指针,这可能不是您想要的。
  • 另外,请发布完整且未经编辑的错误消息日志。并指出错误在发布的来源中的位置。
  • pNode = NULL;delete pNode; //*free the memory 你正在清空然后删除任何内存......你应该有其他方式。老实说,您的程序到处都在泄漏内存。我知道这不是问题的重点,但我认为你应该回顾一下指针并管理动态分配的内存。总结一下:代码中的任何内容(基本上)都不会被删除。
  • node_data 到底是什么?您的程序中没有提到该类/结构/类型定义。

标签: c++ linked-list nodes


【解决方案1】:

据我所知,您的 List 只有方法:

void List::appendNode(node_data * value)

但在你的 main 中,你使用 Node 类的对象调用方法。 试试

void List ::appendNode(Node * pNode)
{

代替:

void List ::appendNode(node_data * value)
{
   Node * pNode = createNode(value);

另外,正如 cmets 中已经建议的那样。始终在您的问题中写下整个错误代码,包括职位。最佳做法是同时包含编译器和操作系统。

【讨论】:

    【解决方案2】:

    根据你自己声明的函数不能调用

    myList.appendNode(pNode); //add node to list
    

    使用指向Node 的指针,您需要在那里传递node_data* 类型的指针。

    正如其他人在 cmets 中提到的,您的代码中还有很多其他缺陷和错误。

    【讨论】:

      【解决方案3】:

      您将 appendNode 声明并定义为 void appendNode(node_data * value);但是您尝试使用 myList.appendNode(pNode); 调用它//将节点添加到列表中,这里的pNode是Node类型的对象,所以你得到了你的错误。

      【讨论】:

        【解决方案4】:

        假设node_data*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:程序充满了漏洞,请阅读我的 cmets 关于您的问题

        【讨论】:

          【解决方案5】:

          双向链表主要用于计算机应用程序。 我在一个站点中找到了一个非常好的和高效的双向链表程序

          单链表和双链表的唯一区别是额外的指针,它有助于从左到右或从右->左遍历链表。

          双向链表 C++ 程序:http://www.techfinite.net/2013/11/double-linked-list-program-and-algorithm.html

          【讨论】:

            【解决方案6】:

            我尝试在Node类中定义零参数Node构造函数并设置pNext = thispPrev = this。 我还没有运行您的代码,但该错误可能是因为您正在调用零参数 Node 构造函数,但您还没有定义一个。

            【讨论】:

              猜你喜欢
              • 2011-04-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多