我在C++中有一个链表,插入几个节点后,现在我看到它们都是一样的,虽然我每次都使用不同的值添加到节点,但就像它们都是一样的,即使尝试更改一个节点,它们也会一起变化,或者总是返回同一个节点, 我不知道。
class node
{
public:
int ochance = 3;
string question;
string option1;
int peopleeffectop1;
int courteffectop1;
int treasuryeffectop1;
string option2;
int peopleeffectop2;
int courteffectop2;
int treasuryeffectop2;
node *next;
};
class list
{
private:
node *head, *tail;
public:
list()
{
head=NULL;
tail=NULL;
}
void createnode(int value , string q , string ans1 , int ans1ef1 , int ans1ef2, int ans1ef3 , string ans2, int ans2ef1 , int ans2ef2, int ans2ef3 )
{
node *temp = new node;
temp->ochance = value;
temp->question = q;
temp->option1 = ans1;
temp->peopleeffectop1 = ans1ef1;
temp->courteffectop1 = ans1ef2;
temp->treasuryeffectop1 = ans1ef3;
temp->option2 = ans2;
temp->peopleeffectop2 = ans2ef1;
temp->courteffectop2 = ans2ef2;
temp->treasuryeffectop2 = ans2ef3;
temp->next = NULL;
if(head == NULL)
{
head = temp;
tail = temp;
temp = NULL;
}
else
{
tail->next = temp;
tail = temp;
}
}
node getnth(int pos)
{
node* tmp = new node;
tmp = head;
int i = 0;
while(tmp!=NULL)
{
if (i=pos)
{
return *tmp;
}
i++;
tmp = tmp->next;
}
}
int getlen()
{
node* tmp = new node;
tmp = head;
int i = 0;
while(tmp!=NULL)
{
i++;
tmp = tmp->next;
}
return i;
}
void minus(int pos)
{
node* tmp = new node;
tmp = head;
int i = 0;
while(tmp!=NULL)
{
if (i=pos)
{
tmp->ochance -=1;
}
i++;
tmp = tmp->next;
}
}
void delete_first()
{
node *temp = new node;
temp = head;
head = head->next;
delete temp;
}
void delete_last()
{
node *current = new node;
node *previous = new node;
current = head;
while(current->next != NULL)
{
previous = current;
current = current->next;
}
tail = previous;
previous->next = NULL;
delete current;
}
void delete_position(int pos)
{
node *current = new node;
node *previous = new node;
current = head;
for(int i = 1; i < pos; i++)
{
previous = current;
current = current->next;
}
previous->next = current->next;
}
};
对于初学者来说,许多成员函数都有内存泄漏,例如在这个函数中
node getnth(int pos)
{
node* tmp = new node;
tmp= head;
//
首先分配内存,其地址存储在指针 tmp 中,然后重新分配指针。因此,分配的内存的地址将丢失,并且不会删除该内存。
这些声明
node* tmp = new node;
tmp= head;
必须替换为这一个语句
node* tmp = head;
而且这个功能
node getnth(int pos)
{
node* tmp = new node;
tmp= head;
int i =0 ;
while(tmp!=NULL){
if (i=pos) {
return *tmp;
}
i++;
tmp = tmp->next;
}
}
在 POS 高于列表中节点的情况下具有未定义的行为。在这种情况下,该函数不返回任何内容。
在函数minus
中使用赋值运算符而不是比较运算符
while(tmp!=NULL){
if (i=pos) {
^^^^^
在此函数中
void delete_first()
{
node *temp=new node;
temp=head;
head=head->next;
delete temp;
}
不检查头部是否等于 NULL,如果尾部指向第一个节点,则不调整尾部。
同样的问题也存在于函数中,delete_last
只是您必须调整头节点,而不是像上一个函数那样相邻的尾节点。
这个函数delete_position
具有与以前的函数相同的缺点,但它在循环中也存在错误
for(int i=1;i<pos;i++)
位置 1 的节点永远不会被删除。