2017-07-30 53 views
0

我需要遍历单链表并查找否定节点,删除它们并返回删除节点的数量。在SLL中查找负值

这是代码我有这么远,但我总是计数器= 1从功能

返回这有什么错在for循环和if语句,或者是别的东西

bool IntSLList::DeleteNegativeNodes() 
{ 
int counter=0; 
if(IsEmpty() == true) 
    counter++; 

if(head->val<0) 
{ 
    DeleteFromHead(); 
    counter++; 
} 

if(tail->val<0) 
{ 
    DeleteFromTail(); 
    counter++; 
} 


IntSLLNode *node, *pred, *tmp; 
node = pred = NULL; 


for(pred = head, node = head->next; 
    node != NULL; 
    node = node->next, pred = pred->next) 
{ 
    if(node->val<0) 
    { 
     node->flag = 1; 

    } 
} 
for(tmp = head; tmp != NULL; tmp = tmp->next) 
{ 
    if(tmp->flag==1) 
    counter++; 
    delete tmp; 


} 
return counter; 
} 

int main() 
{ 
int n,x,z; 
IntSLList list1; 


cout <<"Insert number of nodes u'd like inserted in list" << endl; 
cin >> n; 

for(int i=0;i<n;i++) 
{ 
    cin >> x; 
    list1.AddToTail(x); 
} 
z=list1.DeleteNegativeNodes(); 

cout << "Number of negative deletes nodes is : " << z << endl; 

} 
+0

也许使计数器静态或全局变量将有所帮助,但是如果你在同一个程序中多次使用它,你不得不重新初始化它。 – monster

+0

'DeleteNegativeNodes'删除列表中的所有节点,并用' tmp-> flag == 1' at'for(tmp = head' ...'loop。你在'if'语句中忘了'{}' – Nikita

+0

没有改变任何东西,我仍然得到“Number of negative删除节点是:1“ –

回答

1

问题在于返回值的类型。检查方法的签名:

bool IntSLList::DeleteNegativeNodes() 

返回类型是bool那里。当您从您的方法中返回intcounter时,它的编号为implicitly convertedbool。零值变成false。所有其他值变为true

在呼叫者一侧:

z=list1.DeleteNegativeNodes(); 

bool值被隐式转换为int。因为它你得到1

将返回类型DeleteNegativeNodes更改为int以解决该问题。

+0

我不能相信我让我跳过了我的想法。我已经重新编程了我的DeleteNode,这就是为什么我有这个事件。非常感谢你把我的张力。 –

+0

@HananSammour很高兴帮助。如果答案已解决您的问题,请点击复选标记考虑[接受](https://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明您已找到解决方案。 – Nikita

0

在第二你有

if(tmp->flag==1) 

而且我认为你必须使用

if(node->flag==1) 
+0

我正在使用与节点tmp不同的循环穿过它 –