C++ 使用Walter Savitch链表接口

C++ 使用Walter Savitch链表接口,c++,linked-list,C++,Linked List,我试图学习数据结构,我从单链表开始。我首先试图记住和理解Walter Savitch在绝对C++ C.13中提供的代码。我在使用作者为单链表设计的界面时遇到了一些问题。具体来说,我理解代码,但不理解如何使用该接口创建所需语法的单个链表 以下是界面: #ifndef LinkedList_hpp #define LinkedList_hpp namespace LinkedList { template<class T> class Node { priva

我试图学习数据结构,我从单链表开始。我首先试图记住和理解Walter Savitch在绝对C++ C.13中提供的代码。我在使用作者为单链表设计的界面时遇到了一些问题。具体来说,我理解代码,但不理解如何使用该接口创建所需语法的单个链表

以下是界面:

#ifndef LinkedList_hpp
#define LinkedList_hpp

namespace LinkedList {

    template<class T>
    class Node {
    private:
        T data;
        Node<T> *link;
    public:
        Node(const T& theData, Node<T>* theLink) : data(theData), link(theLink) {}
        Node<T>* getLink() {return link;}
        const T getData() const {return data;}
        void setData(const T& theData) {data = theData;}
        void setLink(Node<T>* pointer) {link = pointer;}
    };

    template<class T>
    void headInsert(Node<T>*& head, const T& theData) {
        head = new Node<T>(theData, head);
    }

    template<class T>
    void insert(Node<T>* next, const T& theData) {
        next->setLink(new Node<T>(theData, next->getLink( )));
    }

    template<class T>
    void deleteNode(Node<T>* before) {
        Node<T>* discard;
        discard = before->getLink();
        before->setLink(discard->getLink( ));
        delete discard;
    }

    template<class T>
    void deleteFirstNode(Node<T>*& head) {
        Node<T>* discard;
        discard = head;
        head = head->getLink();
        delete discard;
    }

    template<class T>
    Node<T>* search(Node<T>* head, const T& target) {
        Node<T>* here = head;
        if(here == nullptr) {
            return nullptr;
        }
        else {
            while(here->getData() != target && here->getLink() != nullptr)
                here = here->getLink();
            if(here->getData() == target)
                return here;
            else
                return nullptr;
        }
    }
}


#endif /* LinkedList_hpp */
\ifndef LinkedList\u水电站
#定义LinkedList_hpp
命名空间链接列表{
模板
类节点{
私人:
T数据;
节点*链接;
公众:
节点(const T&theData,Node*theLink):数据(theData),链接(theLink){}
Node*getLink(){return link;}
const T getData()const{return data;}
void setData(const T&theData){data=theData;}
void setLink(节点*指针){link=pointer;}
};
模板
无效标头插入(节点*&标头、常量和数据){
head=新节点(数据,head);
}
模板
无效插入(节点*下一步,常数T和数据){
下一步->设置链接(新节点(数据,下一步->获取链接());
}
模板
void deleteNode(节点*之前){
节点*丢弃;
discard=在->getLink()之前;
在->设置链接(放弃->获取链接())之前;
删除丢弃;
}
模板
void deleteFirstNode(节点*&头){
节点*丢弃;
丢弃=头部;
head=head->getLink();
删除丢弃;
}
模板
节点*搜索(节点*头、常数和目标){
节点*此处=头部;
if(此处==nullptr){
返回空ptr;
}
否则{
while(here->getData()!=target&&here->getLink()!=nullptr)
here=here->getLink();
如果(此处->getData()==目标)
回到这里;
其他的
返回空ptr;
}
}
}
#endif/*LinkedList_水电站*/
现在,我正试图使用该界面创建一个链接列表。但是我有点麻烦。这就是我走了多远

#include <iostream>
#include "LinkedList.hpp"

using namespace LinkedList;


int main(int argc, const char * argv[]) {

    Node<int> test(2,nullptr);


    return 0;
}
#包括
#包括“LinkedList.hpp”
使用名称空间链接列表;
int main(int argc,const char*argv[]{
节点测试(2,空PTR);
返回0;
}
有没有人能帮我展示一下我需要在int main()主体中写些什么来创建一个链表,或者打印它的内容?为了简单起见,我想尝试使单个链表如下所示:


以下是访问该界面的方法:

Node<int> node(20,nullptr);
Node<int> *head = &node;

insert(head, 30);

prnt(head);

std::cout << "Searching for 10..." << search(head, 10) << std::endl;

headInsert(head, 10);

std::cout << "Searching for 10..." << search(head, 10) << std::endl;

prnt(head);

deleteFirstNode(head);

prnt(head);

deleteNode(head);

prnt(head);

这个问题太宽泛了。你要我们为你写代码。你应该问一个你不明白的问题。你有什么“麻烦”吗?@Neo我重新编辑了这篇文章。我无法理解使用界面创建单个链接列表所需的语法。我可以想出两种方法来构建该列表:从50开始向后调用
headInsert
,或从10开始,然后在最后插入的节点上调用
insert
。不幸的是,
insert
没有返回它创建和插入的便笺,因此您必须自己迭代才能找到它。该接口太可怕了。请使用std::list一段时间,然后实现它的简化版本。要小心getter/setter对,它们99%的时候是毫无意义的,只会以稍微不同的访问语法公开数据成员。如果需要公开数据成员,只需将其公开即可。设计良好的list类的用户无论如何都不应该看到节点,它应该是list实现的内部节点。
template<class T>
void prnt(Node<T>* head) {
    for (; head->getLink(); head=head->getLink()){
    std::cout << head->getData() << " -> ";
    }
    std::cout << head->getData() << std::endl;
}