如何从单链表

时间:2016-03-10 01:42:02

标签: c++ linked-list nodes delete-operator

所以我的任务是采用预先编写的代码生成/填充/打印/销毁单链表,并添加计算偶数节点数的函数。

指定的原型是

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的读写无效,告诉我正在写入或读取的内容不应该写入。我不认为头节点的情况是问题,因为随机数出现在列表中的第一个之后,在这种情况下我认为删除功能导致问题。谁能指出我哪里错了?我检查了从列表中删除东西的其他条目,我的解决方案似乎没有错。感谢您的提示!

1 个答案:

答案 0 :(得分:1)

这是我遵循的一个指导原则的例子,这通常是正确的,而不是错误的:“当某些东西看起来太复杂时,它可能是非常错误的。”

这应该是非常复杂的,采用正确的方法。

正确的方法,不管你信不信,不是试图保持指向当前被检查元素的指针,而是指向当前元素的指针,原因应该是显而易见的:

while crack!=password:
        i+=1
        crack=''.join(random.choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(length))

相当肯定这会处理所有边缘情况。要删除的多个连续节点,删除列表中的第一个节点,最后一个等等...