C++ 在单个节点中有两个项目的链接节点
如何创建链接节点,使每个链接节点在单个节点中包含2个项目?我不确定我走的方向是否正确。我的类中有2个私有成员,我不确定是否需要2个集合函数,或者是否可以有一个带有2个参数的集合函数。例如C++ 在单个节点中有两个项目的链接节点,c++,nodes,C++,Nodes,如何创建链接节点,使每个链接节点在单个节点中包含2个项目?我不确定我走的方向是否正确。我的类中有2个私有成员,我不确定是否需要2个集合函数,或者是否可以有一个带有2个参数的集合函数。例如void setItem(常量字符串&anItem,常量字符串secondItem) \ifndef\u节点 #定义_节点 #包括 使用名称空间std; 类节点 { 私人: 字符串项;//数据项 Node*next;//指向下一个节点的指针 公众: Node(); 节点(常量字符串和anItem); 节点(常量字
void setItem(常量字符串&anItem,常量字符串secondItem)代码>
\ifndef\u节点
#定义_节点
#包括
使用名称空间std;
类节点
{
私人:
字符串项;//数据项
Node*next;//指向下一个节点的指针
公众:
Node();
节点(常量字符串和anItem);
节点(常量字符串和anItem,节点*nextNodePtr);
无效集合项(常量字符串和anItem);
void setNext(节点*nextNodePtr);
字符串getItem()常量;
节点*getNext()常量;
}; // 端节点
#包括“Node.cpp”
#恩迪夫
这是我的Node.cpp文件:
#include "Node.h"
#include <cstddef>
#include<string>
using namespace std;
Node::Node() : next(nullptr)
{
} // end default constructor
Node::Node(const string& anItem) : item(anItem), next(nullptr)
{
} // end constructor
Node::Node(const string& anItem, Node* nextNodePtr) :
item(anItem), next(nextNodePtr)
{
} // end constructor
void Node::setItem(const string& anItem)
{
item = anItem;
} // end setItem
void Node::setNext(Node* nextNodePtr)
{
next = nextNodePtr;
} // end setNext
string Node::getItem() const
{
return item;
} // end getItem
Node* Node::getNext() const
{
return next;
} // end getNext
#包括“Node.h”
#包括
#包括
使用名称空间std;
Node::Node():下一个(nullptr)
{
}//结束默认构造函数
节点::节点(常量字符串和anItem):项(anItem),下一个(nullptr)
{
}//结束构造函数
Node::Node(常量字符串和anItem,Node*nextNodePtr):
项目(项目),下一个(下一个订单)
{
}//结束构造函数
void节点::setItem(常量字符串和anItem)
{
项目=项目;
}//结束集合项
void节点::setNext(节点*nextNodePtr)
{
next=nextNodePtr;
}//结束设置下一步
字符串节点::getItem()常量
{
退货项目;
}//结束getItem
Node*Node::getNext()常量
{
下一步返回;
}//结束getNext
对于我来说,我会选择两个公共函数来设置节点的两项。一个函数将只修改一个项目,而另一个函数将修改两个项目。比如:
// Function that will only set one item
void Node::setIndexItem(const int propNum, const string val)
{
if (propNum == 1) { // You may use 0 for the first item
this.item = val;
} else if (propNum == 2) { // You may use 1 for the second item
this.item2 = val;
} else {
// You may want to raise an exception here. Depends on you really.
}
}
// Function that will set the two items
void Node::setItems(const string val1, const string val2)
{
this.item = val1;
this.item2 = val2;
}
在您的情况下,我将为数据创建一个专用类
struct DataNode
{
std::string key;
std::string value;
};
将班级职责分开(列表可能集中在链接节点)。
这将允许您在不更改类列表的情况下修改数据类型(模板化列表更好,但超出范围)
然后,您的节点类将类似于:
class Node
{
private:
DataNode data;
Node* next; // Pointer to next node // I assume you can't use unique_ptr :-/
public:
Node();
Node(const DataNode& data);
Node(const DataNode& data, Node* nextNodePtr);
// Rule of 3
Node(const Node& rhs);
~Node();
Node& operator =(const Node& rhs);
// data accessor
void setItem(const DataNode& data);
const DataNode& getItem() const;
DataNode& getItem();
// Internal utility
void setNext(Node* nextNodePtr);
const Node* getNext() const;
Node* getNext();
};
我添加了非常量版本的getter,以允许修改项目的一部分:
node.getItem().value = "new value";
您不应该#包括“Node.cpp”
并避免使用名称空间std代码> >在头上。除非是作业,否则您可以考虑<代码> STD::List< <代码>或替换<代码> STD::配对< /代码>,用适当的<代码>结构> <代码> @ JAROD42,它正好适用于HW,我想要一个链表,每个节点包含2个项目,因为更大的情况是,我需要在列表中存储一个键和值,因为我正在处理字典ADT。有什么建议吗?你可以有setItem1
和setItem2
,或者setItems
,或者两者都有。问题是如何使用这段代码,特别是一项更改而非另一项的频率。@Jarod42我有一个包含2个私有数据项的pair类,但我不知道如何使pair类与我的list类和node类一起工作。My list类用于添加、删除、查找数据,etcI将避免使用可能出错的setIndexItem
,而类似于2种方法的替代方法更安全、更简单。
node.getItem().value = "new value";