测试 C++ 链接实现错误

Testing a C++ Linked Implementation Error

我正在尝试测试教授给我们的代码。我们必须更改代码的实现,但这不是我所坚持的。我坚持制作一个有效的测试代码。他给了我 运行 的测试代码,但是当我尝试 运行 时,我不断收到错误,这不应该是这种情况。谁能告诉我测试代码中的问题是什么,以便我可以开始更改代码并将不同的功能添加到我的代码中?谢谢

这是我的代码:

// ListNode.h
#ifndef _LISTNODE_H
#define _LISTNODE_H

#include <cstdlib>

typedef int ItemType;

class ListNode {
    friend class LList;

public:
    ListNode(ItemType item, ListNode* link = NULL);

private:
    ItemType item_;
    ListNode *link_;
};

inline ListNode::ListNode(ItemType item, ListNode *link)
{
    item_ = item;
    link_ = link;
}

#endif // _LISTNODE_H

// LList.h
#ifndef _LLIST_H
#define _LLIST_H

#include "ListNode.h"

class LList {

public:
    LList();
    LList(const LList& source);
    ~LList();

    LList& operator=(const LList& source);
    int size() { return size_; }
    void append(ItemType x);
    void insert(size_t i, ItemType x);
    ItemType pop(int i = -1);
    ItemType& operator[](size_t position);

private:
    // methods
    void copy(const LList &source);
    void dealloc();
    ListNode* _find(size_t position);
    ItemType _delete(size_t position);

    // data elements
    ListNode *head_;
    int size_;
};

#endif // _LLIST_H

// LList.cpp
#include "LList.h"

LList::LList()
{
    head_ = NULL;
    size_ = 0;
}

ListNode* LList::_find(size_t position)
{
    ListNode *node = head_;
    size_t i;

    for (i = 0; i<position; i++) {
        node = node->link_;
    }
    return node;
}

ItemType LList::_delete(size_t position)
{
    ListNode *node, *dnode;
    ItemType item;

    if (position == 0) {
        dnode = head_;
        head_ = head_->link_;
        item = dnode->item_;
        delete dnode;
    }
    else {
        node = _find(position - 1);
        if (node != NULL) {
            dnode = node->link_;
            node->link_ = dnode->link_;
            item = dnode->item_;
            delete dnode;
        }
    }
    size_ -= 1;
    return item;
}

void LList::append(ItemType x)
{
    ListNode *node, *newNode = new ListNode(x);

    if (head_ != NULL) {
        node = _find(size_ - 1);
        node->link_ = newNode;
    }
    else {
        head_ = newNode;
    }
    size_ += 1;
}

void LList::insert(size_t i, ItemType x)
{
    ListNode *node;

    if (i == 0) {
        head_ = new ListNode(x, head_);
    }
    else {
        node = _find(i - 1);
        node->link_ = new ListNode(x, node->link_);
    }
    size_ += 1;
}

ItemType LList::pop(int i)
{
    if (i == -1) {
        i = size_ - 1;
    }
    return _delete(i);
}

ItemType& LList::operator[](size_t position)
{
    ListNode *node;

    node = _find(position);
    return node->item_;
}

LList::LList(const LList& source)
{
    copy(source);
}

void LList::copy(const LList &source)
{
    ListNode *snode, *node;

    snode = source.head_;
    if (snode) {
        node = head_ = new ListNode(snode->item_);
        snode = snode->link_;

    while (snode) {
        node->link_ = new ListNode(snode->item_);
        node = node->link_;
        snode = snode->link_;
    }
    size_ = source.size_;
}

LList& LList::operator=(const LList& source)
{
    if (this != &source) {
        dealloc();
        copy(source);
    }
    return *this;
}

LList::~LList()
{
    dealloc();
}

void LList::dealloc()
{
    ListNode *node, *dnode;

    node = head_;
    while (node) {
        dnode = node;
        node = node->link_;
        delete dnode;
    }
}

#include "LList.h"
#include <iostream>
using namespace std;

int main()
{
    LList b, c;
    int x;

    b.append(1);
    b.append(2);
    b.append(3);
    c.append(4);
    c.append(5);
    c = b;
    x = b.pop();

    cout << c;
} 

任何人都可以帮助我编写一个有效的测试代码,这是我开始添加不同功能所需的最后一件事。

我不断收到此错误:

Error   1   error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'LList' (or there is no acceptable conversion)    c:\users\koopt_000\documents\visual studio 2013\projects\lab10\lab10\testlist.cpp   18  1   Lab10

有什么帮助吗?

在您的代码中:

cout << c;

是问题所在。您不能以这种方式打印链接列表(编辑:除非您有运算符 << 的重载,但您的代码中没有出现)。

为了打印元素,您可以从第一个节点到最后一个节点遍历列表。类似的东西会起作用:

void LList::printList()
{ 
    ListNode *tmp = head_;

    while(tmp) {
        std::cout<<tmp->item_;
        tmp=tmp->link_;
    }      
}

PS:不要忘记将方法原型放入 class 定义中。当然,在您的 main 方法中可以按如下方式调用该函数:

...
c.printList();
....

希望对您有所帮助!

您正在尝试输出您的 LList,但这并不是那么简单。您需要重载输出运算符:

friend std::ostream& operator<< (std::ostream& stream, const LList& list) {
    // Write code here to iterate through the list
    // and output each item...

    // Return the stream so we can chain outputs..
    return stream;
}