我尝试将元素添加到列表中,但无法弄清楚push_back
方法重复最后添加的元素的原因。举例说明:
每个节点对象都包含data
和head
字段。在下面的代码中,我遍历一个int数组,创建一个新节点来存储每个int,并push_back
该元素到列表L
。重复节点始终是添加到列表中的最后一个节点(在上图中,当iteratror i = 1时)
void addElements(std::list<node>& L, int arr[],std::list<node>::iterator Itor,int size){ //array decays to pointer
for (int i=1;i<size;i++){
node* n = new node;
n->data = arr[i];
n->head = Itor->head; //head of the first element in the list
L.push_back(*n);
}
}
我在下面列出了不相交数据结构的完整代码。我在cplusplus.com上看到push_back将容器大小增加了1.所以我有点困惑为什么要在列表中添加额外的节点。
#include <iostream>
#include <list>
struct node{
int data;
node* head;
};
void makeSet(std::list<node>& L,int arr[]){ //asterick is before the variable name
node *headNode = new node;
headNode->data = arr[0]; //representative node
headNode->head = headNode; //point to itself
L.push_back(*headNode);
}
void addElements(std::list<node>& L, int arr[],std::list<node>::iterator Itor,int size){ //array decays to pointer
for (int i=1;i<size;i++){
node* n = new node;
n->data = arr[i];
n->head = Itor->head; //head of the first element in the list
L.push_back(*n);
}
}
int findSet(node* element){
return element->head->data;
}
int main(int argc, const char * argv[]) {
std::list<node>List;
std::list<node>::iterator Itor;
int dataArr[]={1,2,3,4,5};
int size = sizeof(dataArr)/sizeof(dataArr[0]);
Itor = List.begin();
makeSet(List,dataArr);
addElements(List,dataArr,Itor,size);
for (Itor = List.begin();Itor!=List.end();Itor++){
std::cout << Itor->data << std::endl;
}
}
答案 0 :(得分:1)
请注意,示例中列表的大小为2.这意味着只有节点0和1有效。这个额外的重复链接可能是Sentinel Value。
通常,您会发现链接列表以空指针终止,但将列表末尾定义为指向自身的链接同样容易。这可能具有其他优势,例如提供一个过去的结尾链接以list::end
返回。
无论它的好处是什么,它都超出了列表的范围,所以最好不要搞砸它。