复制构造函数双链接列表中的头节点和尾节点的地址不正确

Not getting correct address to head and tail nodes in copy constructor doubly linked list

本文关键字:节点 地址 不正确 构造函数 链接 列表 复制      更新时间:2023-10-16

复制构造函数:

 // Copy constructor.  Copies another list.
CRevList(const CRevList &b)
 {
    cout << "Copy" << endl;
    const Node *Start = b.Begin();
    const Node *End = b.End();
    cout << "Start; " << Start << endl;
    cout << "End; " << End << endl;
    cout << "b.Begin() : " << b.Begin() << endl;
    cout << "b.End()   : " << b.End() << endl;
    T temp_data;
    for(;;){
            cout << "Start->data() loop: " << Start->Data() << endl;
            temp_data = Start->Data();
            PushBack(temp_data);

            if(Start == End)
                    break;
            Start = Start->m_next;

    }

}

调用End以获取指向尾部节点的指针(Begin()相同):

const Node *End() const {}
   Node *End() {
      cout << "m_tail " << m_tail << endl;
      return m_tail;
   }

抱歉代码太多。我就是想不出哪里出了问题

编辑:好的,这是一个最小完整的示例

驱动

using namespace std;
#include <iostream>
#include "RevList.h"
int main(){
    CRevList<int> List;
    List.PushBack(7);
    List.PushBack(300);
    cout << "End Ref: " << List.End() << endl;
    cout << "begin ref: " << List.Begin() << endl;
    cout << List.End() << endl;
    CRevList<int> New_list(List);
    cout << "End Ref: " << New_list.End() << endl;
    cout << "begin ref: " << New_list.Begin() << endl;

}

双链表的实现:

template<class T> class CRevList
{
public:
//constructor stuff doesn't matter... ;
class Node
{
public:
 friend class CRevList;
 Node() {m_next = 0;  m_prev = 0;}
 Node(const T &t) {m_payload = t;  m_next = 0;  m_prev = 0;}
 T Data() {return m_payload;}
 const T Data() const {return m_payload;}
private:
 Node    *m_next;
 Node    *m_prev;
 T       m_payload;
};
  //Push Back ////////////////////////////////////////////////
  void PushBack(const T &t) {
      Node * Temp = new Node(t);

      if(IsEmpty()){
            cout << "is Empty" << endl;
              m_head = Temp;
              m_tail = Temp;
      }
      else{
            Node * Curr = m_tail;
            Curr->m_next = Temp;
            Temp->m_prev = Curr;
            m_tail = Temp;

      }
      size += 1;
 }

//Get a pointer to the first node in the list
const Node *Begin() const {}
Node *Begin() {
       cout << "m_head " << m_head << endl;
       return m_head;
} 

//get a pointer to the last node in the list
const Node *End() const {}
Node *End() {
       cout << "m_tail " << m_tail << endl;
 return m_tail;
}
private:

Node    *m_head, *m_tail;             // Head node
unsigned size;

};
};

AND最终从驱动器输出

m_tail 0x2068030
End Ref: 0x2068030
m_head 0x2068010
begin ref: 0x2068010
m_tail 0x2068030
0x2068030
Copy
Start; 0x7fff7745d240
End; 0x7fff7745d240
b.Begin() : 0x7fff7745d240
b.End()   : 0x7fff7745d240
Start->data() loop: 2
Segmentation fault  //don't care about this right now

您忘记初始化size