может быть, я могу создать новый узел, насколько я удален? - PullRequest
0 голосов
/ 28 марта 2020

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

1.Insert"
"2. Delete"<<endl<<
"3. Display"<<endl<<
"4. Sum"<<endl<<
"5. Average"<<endl<<
"6. Exit"
From the list above what would you like to do next?"

проблема: при выполнении, после того, как я ввожу двойное значение для «значения», программа немного останавливается, затем выходит

// - приглашение ввода

cout<<"\nWhat value would you like to insert to the list: ";
cin>>value;
l.insertAtEnd(value);
break;

// --- определение функции ---

void List::insertAtEnd(double & x)
    {   
        List::NodePointer ptr;

        ptr = new List::Node(last, x );
        last->next = ptr;
        last = ptr;
        count ++;
        sum += x;
    }

// --- прототипы

включают

    // #include"Node.h" 
>     
>     using namespace std;
>     
>     #ifndef LIST
>     #define LIST
>     
>     typedef double ElementType;
>     
>     class List
>     {
>         public:
>             ...
>             void insertAtEnd(ElementType & x); //insert a value x on the end of the list
>             ...
>         
>     private:
>             ...
>             
>             class Node
>             {
>                 public:
>                 ElementType data;
>                 Node *prev;
>                 Node *next;
>                 //--- Node constructor
>                 /*-------------------------------------------------------------------
>                     Precondition:  None.
>                     Postcondition: A Node has been constructed with value in its data 
>                         part and its next part set to link (default 0).
>                     -------------------------------------------------------------------*/
>                 Node(Node *prevNodePtr,ElementType value, Node *link = 0)
>     
>                     : prev(prevNodePtr) ,data(value), next(link)
>                 {}
>             };
>     
>             typedef Node * NodePointer;
>             NodePointer last;
>             NodePointer first;
>     
>     };
>     
>     ostream & operator<<(ostream & out, const List & s);
>     
>     #endif // !LIST

пожалуйста, помогите ...

1 Ответ

0 голосов
/ 28 марта 2020

Я не думаю, что вы далеко. Основная проблема, которую я вижу, заключается в том, что вы не имеете дело с указателем first в своем классе List.

Когда вы добавляете значение в конец списка, как это первое значение, которое будет добавлен в список особый случай, потому что вы также должны обновить указатель first. Ваш код этого не делает.

Другая необычная вещь в вашем коде состоит в том, что у вас есть эти count и sum переменные. Кажется, вы пытаетесь сохранить промежуточную сумму длины списка и суммы списка. Это не так, но это необычно. Обычно вы вычисляете их при необходимости, а не постоянно. Кроме того, если вы продолжаете действовать таким образом, вам нужно добавить count и sum в ваш список. На данный момент у вас есть список в одной переменной, а его длина и сумма в разных переменных. Это плохой дизайн, потому что между переменными нет тесной связи. Представьте, что у вас есть два списка. Как бы вы обновляли переменные count и sum? Лично я бы просто удалил код, относящийся к count и sum, просто вычислил эти количества, когда они вам нужны.

...