C++ - 具有链表和一次执行一个函数的类的程序

Posted

技术标签:

【中文标题】C++ - 具有链表和一次执行一个函数的类的程序【英文标题】:C++ - Program with a linked list and a class that executes one function at a time 【发布时间】:2018-12-09 04:50:11 【问题描述】:

我正在编写一些简单的 C++ 管理程序,它有一个仓库类,其中包含一个存储为链接列表的产品列表。 输出有两个问题:

    输出 id/s 与输入不同(但也相似) 有两种不同的打印功能,但在运行程序时只执行一个(如果我注释了另一个,它们都可以运行)

由于程序编译没有任何错误,我尝试逐行调试,但似乎无法弄清楚

编辑:为了明确大学项目的这一部分,我不能使用标准库中准备好的东西,比如 (std::vector, std::list, ...) 我需要手动实现链表

    #include <iostream>
    #include <iomanip>      // std::setw

            struct product 
                int id;
                int num;
                product* next;
            ;

            class warehouse
            private:
                product* list = new product;
            public:
                warehouse() = default;

                //adding a product to warehouse
                void AddProduct(const int id,const int boxes) 
                    auto* item = new product;
                    auto* tmp = new product;
                    // copy the head of the linked list
                    tmp = list;
                    item->id = id;
                    item->num = boxes;
                    item->next = tmp;
                    //add the the new product at the beginning
                    list = item;
                

                //print all products
                void printlist() 
                    int i=0;
                    product* tmp;
                    tmp = list;
                    while(list) 
                        i++;
                        std::cout << "item n." << i << "\tid: " << tmp->id << " number of items: " << tmp->num << std::endl;
                        tmp = tmp -> next;
                    
                

                //print products that have less than 50 box and need resupply
                void SupplyReport()
                    product* tmp = new product;
                    tmp = list;
                    int i=0;
                    while(list) 
                        if (tmp->num <= 50) 
                            i++;
                            std::cout << i << ". id:" << tmp->id << std::setw(20) << "N. of Boxes:" << tmp->num << std::endl;
                        
                        tmp = tmp -> next;
                    
                    if (i==0)
                        std::cout << "No product/s need re-supply";
                
            ;

            int main()
                /* Problems:
                 * Generating random id instead of using the given values
                 * Execute only one function at a time meaning if I commented printlist it's print the supply report as expected
                 */
                warehouse w1;
                w1.AddProduct(005,50);
                w1.AddProduct(007,70);
                w1.AddProduct(055,30);
                w1.printlist();
                w1.SupplyReport();
                return 0;
            

【问题讨论】:

注意 C++ 已经有一个你可能想要使用的链表std::list @MartinYork 不幸的是,这是大学项目的一部分,我不能使用从 std 准备好的东西,我需要手动实现它们 这对大学来说是完全合理的。值得注意的是问题的一部分。 【参考方案1】:

第一:

    private:
        product* list = new product;

这很奇怪。为什么要创建一个无意义的product 并让list 指向它?

下一步:

            auto* tmp = new product;
            // copy the head of the linked list
            tmp = list;

您希望tmp 指向list,还是希望它指向您创建和分配的new product?它可以做这两件事中的任何一件,但不能同时做——它只是一个指针。你想让它指向什么?

下一步:

        void printlist() 
            int i=0;
            product* tmp;
            tmp = list;
            while(list) 
                i++;
                std::cout << "item n." << i << "\tid: " << tmp->id << " number of items: " << tmp->num << std::endl;
                tmp = tmp -> next;
            
        

你有while(list),但你想要while(tmp)

最后:

        void SupplyReport()
            product* tmp = new product;
            tmp = list;
            int i=0;
            while(list) 
                if (tmp->num <= 50) 
                    i++;
                    std::cout << i << ". id:" << tmp->id << std::setw(20) << "N. of Boxes:" << tmp->num << std::endl;
                
                tmp = tmp -> next;
            
            if (i==0)
                std::cout << "No product/s need re-supply";
        

同样,您将tmp 指向new products,然后将其设置为等于list。你想让tmp 指向同一个东西list 指向吗?还是您希望它指向new product?不能两者兼得。

当你想要while(tmp) 时,你又拥有while(list)

【讨论】:

【参考方案2】:

供参考:

    输出 id/s 与输入不同(但也相似)

解决方案是简单地避免使用第一个数字“零”的变量,或者将它们转换回十进制

这种行为背后的原因是编译器认为以 '0' 开头的值是八进制文字!这就是为什么输出不同但不是随机的原因。我不知道这个“功能”,只是希望所有 id 看起来都一样

    有两种不同的打印功能,但在运行程序时只执行一个(如果我注释了另一个,它们都可以运行)

就像大卫的回答一样,只需将 while(list) 更改为 while(tmp) 即可解决,这在我脑海中闪过,因为我认为基本相同。

固定代码为:

#include <iostream>
#include <iomanip>      // std::setw

struct product 
    int id;
    int num;
    product* next;
;

class warehouse
private:
    product* list;
public:

    warehouse() = default;

    //adding a product to warehouse
    void AddProduct(const int id,const int boxes) 
        auto* item = new product;
        product* tmp = list;
        item->id = id;
        item->num = boxes;
        item->next = tmp;
        //add the the new product at the beginning
        list = item;
    

    //print all products
    void printlist() 
        int i=0;
        product* tmp= list;
        while(tmp) 
            i++;
            std::cout << "item n." << i << "\tid: " << tmp->id << std::setw(20) << " number of items: " << tmp->num << std::endl;
            tmp = tmp -> next;
        
    

    //print products that have less than 50 box and need resupply
    void SupplyReport()
        product* tmp = list;
        int i=0;
        while(tmp) 
            if (tmp->num <= 50) 
                i++;
                std::cout << i << ". id:" << tmp->id << std::setw(20) << "N. of Boxes:" << tmp->num << std::endl;
            
            tmp = tmp -> next;
        
        if (i==0)
            std::cout << "No product/s need re-supply";
    
;

int main()
    warehouse w1;
    w1.AddProduct(5,50);
    w1.AddProduct(7,70);
    w1.AddProduct(55,30);
    w1.printlist();
    w1.SupplyReport();
    return 0;

【讨论】:

以上是关于C++ - 具有链表和一次执行一个函数的类的程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 中的类创建和填充链表?

求1个C++链式链表的程序

c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?

深度解析数组单链表和双链表

c++创建链表为啥要用类模板

递归打印类中的链表c ++