作为链接列表的一部分,我需要编写的函数之一是在整个列表中搜索数据值为特定数字的所有节点并删除所有节点的函数。
例如,在1, 3, 3, 3, 7, 9
列表中,它会删除所有3
并将列表更改为1, 7, 9,
我的程序中有一个着名的函数版本,我在那里尝试了几个不同的东西(它们在块内部被注明),并且它们都没有工作。
void linkedlist::deletenode(int n){
while (first != NULL){
linknode *temp = new linknode;
temp = first;
//first = temp -> next
//first = first -> next
if (temp -> data == n){
//first = temp -> next
delete temp;
}
//first = first -> next;
}
}
我完全废弃它并决定完全重写该功能。这就是它的样子。
void linkedlist::deletenode(int n){
do{
linknode *temp= new linknode;
temp=first;
first=first->next;
if (temp -> data == n){
delete temp;
}
} while (first -> next != NULL);
}
我遇到的问题是,除了删除特定号码的所有节点外,它会删除列表中除最后一个号码之外的所有号码。
例如,如果列表是:
2, 4, 2, 6, 7, 528,
n = 2
,列表只是528
。
提前致谢!
编辑:下面是类定义。
class linkedlist{ //begin class definition
public:
bool empty;
linknode *first;
linkedlist(){
empty = true; first = NULL;
}
void createfirst(int); //done
void addbeginning(int); //done
void append(int); //done
void printlist(); //done
void deletenode(int);
void insertlist(int);
void clearlist(); //done
};
答案 0 :(得分:3)
您的函数实现在任何情况下都是错误的,至少因为它在循环的每次迭代中更改了数据成员first
(因此在退出函数之后,数据成员将不会指向列表的第一个节点它出现在你提供的列表示例2,4,2,6,7,528的情况下,并且由于冗余使用新运算符而导致内存泄漏。
linknode *temp = new linknode;
该功能可以按以下方式查看
void linkedlist::deletenode( int data )
{
for ( linknode **current = &first; *current; )
{
if ( *current )->data == data )
{
linknode *tmp = *current;
*current = ( *current )->next;
delete tmp;
}
else
{
current = &( *current )->next;
}
}
}
考虑到这些数据成员
public:
bool empty;
linknode *first;
应声明为私有。否则你的清单就不安全了。