我正在用一个向量来写一个链表(我知道我不应该用向量)。我试图实现一个函数,将节点插入x
的位置,并将所有元素移动到x
之后,但由于某种原因,它只是将最初位于x
的元素重写为具有该值的所有剩余元素。
这是我遇到问题的功能:
//Insert element at x index
void LinkedList::insertAt(int x, int data) {
Node* tempNode = new Node();
Node* currentNode = vecList[x];
Node* nextNode = vecList[x + 1];
Node* previousNode = vecList[x - 1];
if(x == count) {
push_back(tempNode, data);
return;
}
else {
count++;
for (int i = 0; i < getSize(); i++){
vecList[x + 1]->next = vecList[x]->next; // tranfer the address of 'temp->next' to 'temp'
vecList[x + 1]->data = vecList[x]->data;
if (vecList[x] == NULL){break;}
}
tempNode->data = data;
tempNode->previous = previousNode;
tempNode->next = nextNode;
tempNode->id = x+1;
vecList[x] = tempNode;
vecList[x - 1]->next = tempNode; //Point previous node to this node
}
}//Adds Node but replaces orignal Node
它将传递的值放在x
的位置,我认为我的问题是在x
之后移动元素。
当我调用linkedlist.insertAt(2, 50);
时,它正在执行:10, 20, 50, 30, 30
,但预期为:10, 20, 50, 30 ,40
。
Node
:的定义
struct Node {
Node * previous;
Node * next;
int id;
int data;
};
问题在于您的循环:
for (int i = 0; i < getSize(); i++){
vecList[x + 1]->next = vecList[x]->next; // tranfer the address of 'temp->next' to 'temp'
vecList[x + 1]->data = vecList[x]->data;
if (vecList[x] == NULL){break;}
}
您正在对i
进行迭代,但循环中没有任何内容实际读取i
。所以你只需要做同样的操作getSize()
次。我想你是想把vecList[i + 1]
分配给veclist[i]
。此外,循环的下界不应该是0
,它应该是x
。为了更清楚起见,该变量的名称可能应该是pos
或类似的名称。
在引用vecList[x + 1]
或vecList[x - 1]
时也要小心。如果x
是0或vecList.size() - 1
怎么办?您将指向一个未定义的对象。