【问题标题】:a simple payroll system using linked list c++使用链表 C++ 的简单工资系统
【发布时间】:2020-02-03 20:34:34
【问题描述】:

我只是创建一个工资单系统,其中包含员工姓名和该员工的工作时间。数据应该存储在链表数据结构中,但我无法将链表连接到对象班级员工,我尝试将工资单链表(即empList)作为静态成员,以便班级的所有对象都可以使用相同的列表对象并且可以存储数据但是一旦我编译我的代码,我就会得到一个错误第 130 行的“未定义对员工::empList 的引用”是构造函数的最后一行,第 150 行的相同错误是打印工资单函数。我试图在它给出的员工类中调用任何 payRollLinkedList 类的函数错误..底线是我想要的只是将数据存储在员工的双向链接列表中,我无法访问该列表。

    #include <iostream>
    using namespace std;
    class payRollLinkedList;
    class node
    {
    private:
        node* previousPointer;
        string name;
        int hoursWorked;
    node* nextPointer;
    friend class payRollLinkedList;
    public:
        explicit node(const string argName, const int argHoursWorked)
        : previousPointer{nullptr}, name{argName}, hoursWorked{argHoursWorked}, nextPointer{nullptr}
        {}
    };
    class payRollLinkedList
    {
    private:
        node* headPointer{nullptr};
        node* tailPointer{nullptr};
        node* getNewNode(const string argName, const int argHoursWorked)
        {
            return new node(argName, argHoursWorked);
        }
    public:
        void addAtBack(const string argName, const int argHoursWorked)
        {
            node* newNode{getNewNode(argName, argHoursWorked)};
            if(isEmpty())
            {
                headPointer = tailPointer = *newNode;
            }
            else
            {
                tailPointer->nextPointer = newNode;
                newNode->previousPointer = tailPointer;
                tailPointer = newNode;
                newNode = nullptr;
                delete newNode;
            }
        }
        bool deleteNode(string argName)
        {
            node* currentPointer{headPointer};
            if(isEmpty())
            {
                cout <<"the list is already empty\n";
                return false;
            }
            else
            {
                while(currentPointer != nullptr)
                {
                    if(currentPointer->name == argName)
                    {
                        if(currentPointer == headPointer)
                        {
                            node* tempPointer{headPointer};
                            headPointer = headPointer->nextPointer;
                            tempPointer->nextPointer = nullptr;
                            headPointer->previousPointer = nullptr;
                            delete tempPointer;
                            break;
                        }
                        if(currentPointer == tailPointer)
                        {
                            node*tempPointer{tailPointer};
                            tailPointer = tailPointer->previousPointer;
                            tempPointer->previousPointer = nullptr;
                            tailPointer->nextPointer = nullptr;
                            delete tempPointer;
                            break;
                        }
                        node* tempPointer{currentPointer};
                        node* nextPtr{tempPointer->nextPointer};
                        currentPointer = currentPointer->previousPointer;
                        currentPointer->nextPointer = nextPtr;
                        nextPtr->previousPointer = currentPointer;
                        tempPointer->nextPointer = nullptr;
                        tempPointer->previousPointer = nullptr;
                        currentPointer = nullptr;
                        nextPtr = nullptr;
                        delete tempPointer;
                        delete currentPointer;
                        delete nextPtr;
                    }
                    else
                        currentPointer = currentPointer->nextPointer;
                }
                return true;
            }
        }
        void print()
        {
            if(isEmpty())
            {
                cout <<"nothing to show\n";
                return;
            }
            else
            {
                node* currentPointer{headPointer};
                while(currentPointer != nullptr)
                {
                    cout <<currentPointer->name <<"\t";
                    currentPointer = currentPointer->nextPointer;
                }
            }
        }
        bool isEmpty()
        {
            return headPointer == nullptr? true : false;
        }
    };
    class employee
    {
    private:
        string name;
        int hoursWorked;
        static payRollLinkedList empList;
    public:
        employee()
        : name{""}, hoursWorked{0}
        {}
        employee(string argName, int argHoursWorked)
        {
            name = argName;
            hoursWorked = argHoursWorked;
            empList.addAtBack(name, hoursWorked);
        }
        void printPayRoll()
        {
            empList.print();
        }
    };
    int main()
    {
        employee emp("usman", 12);
        employee emp1("ali", 12);
        emp.printPayRoll();
    }

【问题讨论】:

  • 为什么有一个员工列表作为员工类的成员?
  • 我假设我只是将员工类中的姓名和工作时间作为参数发送到 payRollList 成员函数 add 和 delete.. 并访问员工类中 payRollList 的这些函数我需要一个 payRollList 对象那是员工名单。
  • delete tempPointer; delete currentPointer; delete nextPtr; -- 为什么在delete 节点中,您要删除 3 个节点?使用方框作为节点,线作为链接,在纸上画出一个节点的删除。唯一应该做的是将要删除的节点之前的节点与要删除的节点的下一个节点链接起来。然后 single 删除现在已取消链接的节点。
  • 请注意,使用指针时,不能保证您的代码“正常”工作,因为您看不到任何错误。你看到你写的delete 代码有多复杂吗?我提到的描述中有什么难以理解的?如果你得到任何关于链表删除的教程,你会看到一个节点被删除,被删除的节点从列表中脱钩,而不是三个单独的节点被删除。似乎您没有遵循视觉计划(*即在纸上绘制链接列表)——如果您这样做了,您将很难想出您想出的代码。努力认真,而不是苛刻。
  • 我的意思是除了头尾指针的特殊情况外,删除应该是1)将前一个节点挂钩到要删除的节点的下一个节点,然后2)删除要删除的节点。仅此而已。

标签: c++ data-structures doubly-linked-list


【解决方案1】:

https://en.cppreference.com/w/cpp/language/static

您需要在全局范围内(类外)定义类的静态成员。 我建议您拆分代码 .h 和 .cpp 文件并在 .cpp 文件中定义成员。

payRollLinkedList employee::empList;

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 2011-11-10
    • 1970-01-01
    • 2012-01-14
    • 2019-02-20
    • 2010-11-24
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多