【问题标题】:doubly linked list, i can seem to create a new Node, How far off am i?双向链表,我似乎可以创建一个新节点,我离我有多远?
【发布时间】:2020-07-08 21:21:40
【问题描述】:

该程序被假设为一个双向链表,提示用户选择任一

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

请帮忙...

【问题讨论】:

  • 如果您提供mwe,您获得帮助的机会会大大增加。
  • 除非这是一个纯粹的学习练习,否则你真的想要std::list。如果是,那么基本的插入和删除示例将是 Doubly-Linked List of Integers
  • @DavidC.Rankin ... 或 ... 根本没有列表
  • 这是一个学习任务

标签: c++ nodes doubly-linked-list


【解决方案1】:

我不认为你离得很远。我看到的主要问题是您没有处理 first 类中的 first 指针。

当您像这样将值添加到列表的末尾时,要添加到列表的第一个值是一种特殊情况,因为您还必须更新first 指针。您的代码没有这样做。

您的代码的另一个不寻常之处是您拥有countsum 变量。似乎您正试图保持列表长度和列表总和的总和。这没有错,但这是一件不寻常的事情。通常你会在需要时计算这些,而不是一直计算。此外,如果您确实继续这样做,那么您需要将countsum 添加到您的列表类中。目前,您在一个变量中有一个列表,它是不同变量的长度和总和。这是一个糟糕的设计,因为变量之间没有密切的关联。想象一下,你有两个列表。那么你将如何更新countsum 变量呢?就我个人而言,我只会删除处理countsum 的代码,只需在需要时计算这些数量即可。

【讨论】:

  • 我添加了以下内容,希望能处理第一个和最后一个 void List::insertAtEnd(double & x) { if (first == 0) { first = new List::Node(last , X ); }else { last->next = new List::Node(last, x );我还添加了一个计数函数来“遍历”列表并添加数字节点@john:你的权利,我需要记住模块化代码......练习,练习,练习
  • 我不断收到这些错误:“List::Node *”类型的值不能分配给“List::NodePointer”类型的实体没有构造函数“List::Node::”的实例Node" 匹配参数列表——参数类型是:(List::NodePointer, double) 引用:first = new List::Node(last, x);和
  • @raven065 不确定没有看到最新的代码。再说一次个人而言,我不会使用NodePointer typedef,指针很棘手,最好完全明确地说明它们的使用,而不是将它们隐藏在 typedef 后面(即使它的名字和你的一样)。因此,也许删除 NodePointer typedef 将有助于清除此错误的含义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多