所以我的任务是采用预先编写的代码生成/填充/打印/销毁单链表,并添加计算偶数节点数的函数。
指定的原型是
int countEven(node * head)
计算并返回线性链表中的节点数
•int removeEven(node *& head)
删除线性链表中包含偶数的所有节点,并返回已删除的节点数
countEven不是问题并且运行正常,但是removeEven似乎适用于随机数
例如,main.cpp看起来像......
#include "list.h"
#include <iostream>
using namespace std;
int main()
{
node * head = NULL;
build(head);
display(head);
//PLEASE PUT YOUR CODE HERE to call the function assigned
cout << "The number of even nodes is " << countEven(head) << ".\n";
cout << "The number of even nodes removed was " << removeEven(head) << ".\n";
display(head);
destroy(head);
return 0;
}
并且函数removeEven看起来像......
int removeEven(node *& head)
{
node *current;
node *trailCurrent;
int currentData = 0;
int numberOfItemsRemoved = 0;
current = head;
trailCurrent = NULL;
while(current != NULL)
{
currentData = current->data;
if(currentData % 2 == 0)
{
if (head == NULL)
cout << "Cannot delete from an empty list.\n";
else
{
if (head->data == currentData) //Node is in beginning of list
{
current = head;
head = head->next;
delete current;
numberOfItemsRemoved++;
}
else
{
trailCurrent->next = current->next;
delete current;
numberOfItemsRemoved++;
}
}
}
trailCurrent = current;
current = current->next;
}
return numberOfItemsRemoved;
}
输出是随机的,因为构建函数似乎随机数列随机数,但这里是一个样本
Here is the original list: 2 -> 51 -> 44 -> 46 -> 1 -> 49 -> 2 -> 53 -> 52 -> 2
This list contains 10 numbers of items
The number of even nodes is 6.
The number of even nodes removed was 6.
The resulting list is... 51 -> 31571024-> 1 -> 49 -> 53 -> 31571216
This list contains 6 number of items
The sum of all data is: 63142394
Valgrind告诉我,大小为8的读写无效,告诉我正在写入或读取的内容不应该写入。我不认为头节点的情况是问题,因为随机数出现在列表中的第一个之后,在这种情况下我认为删除功能导致问题。谁能指出我哪里错了?我检查了从列表中删除东西的其他条目,我的解决方案似乎没有错。感谢您的提示!
答案 0 :(得分:1)
这是我遵循的一个指导原则的例子,这通常是正确的,而不是错误的:“当某些东西看起来太复杂时,它可能是非常错误的。”
这应该是非常复杂的,采用正确的方法。
正确的方法,不管你信不信,不是试图保持指向当前被检查元素的指针,而是指向当前元素的指针,原因应该是显而易见的:
while crack!=password:
i+=1
crack=''.join(random.choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(length))
相当肯定这会处理所有边缘情况。要删除的多个连续节点,删除列表中的第一个节点,最后一个等等...