C ++ - Программа со связанным списком и классом, который выполняет одну функцию за раз - PullRequest
0 голосов
/ 09 декабря 2018

Я пишу простую программу управления c ++, которая имеет класс хранилища со списком продуктов, хранящихся в виде связанного списка.у него две проблемы с выводом:

  1. Идентификаторы вывода отличаются (но также похожи) от ввода
  2. есть две разные функции печати, но только одна из них выполняется при запускепрограмма (обе они могут работать, если я прокомментировал другую)

Поскольку программа компилируется без ошибок, я пытался отладить ее построчно, но, похоже, не могу понять,

Редактировать: Чтобы прояснить эту часть проекта колледжа, я не могу использовать готовые материалы из стандартной библиотеки, такие как (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;
            }

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Для справки:

  1. Идентификаторы выходных данных отличаются (но также похожи) от входа

решение состоит в том, чтобы просто избегать переменных с первой цифрой «ноль» или, возможно, преобразовать их обратно в десятичную

Причиной такого поведения было то, что компиляторы рассматривают значения, начинающиеся с «0», как октальный литерал!Вот почему результат был другим, но не случайным.Я не знал об этой «функции» и просто хотел, чтобы все идентификаторы выглядели одинаково

есть две разные функции печати, но только одна выполняется при запуске программы (обе они могут работать, если я прокомментировал другую)

Как и ответ Дэвида, решаемый простым изменениемwhile (list) to 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;
}
0 голосов
/ 09 декабря 2018

Первый:

    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).

Last:

        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(list), когда вы хотите while(tmp).

...