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