双向链表,我似乎可以创建一个新节点,我离它有多远?
doubly linked list, i can seem to create a new Node, How far off am i?
该程序假设是一个双向链表,提示用户
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?"
问题:在执行时,我为"value"输入一个double后,程序冻结了一点然后退出
//-- 输入提示
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
// #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
请帮忙...
我认为你离得不远。我看到的主要问题是您没有处理 List
class.
中的 first
指针
当您像这样将值添加到列表末尾时,要添加到列表的第一个值是一种特殊情况,因为您还必须更新 first
指针。您的代码不会这样做。
关于您的代码的另一个不寻常的事情是您有那些 count
和 sum
变量。看起来您正在尝试保持 运行 总列表长度和列表总和。这并没有错,但这是一件不寻常的事情。通常你会在需要的时候计算那些,而不是所有的时间。此外,如果您确实继续这样做,那么您需要将 count
和 sum
添加到您的列表 class。目前,您在一个变量中有一个列表,它的长度和总和在不同的变量中。这是糟糕的设计,因为变量之间没有紧密关联。假设您有两个列表。那么您将如何更新 count
和 sum
变量?就我个人而言,我只会删除处理 count
和 sum
的代码,只需在需要时计算这些数量即可。
该程序假设是一个双向链表,提示用户
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?"
问题:在执行时,我为"value"输入一个double后,程序冻结了一点然后退出
//-- 输入提示
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
// #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
请帮忙...
我认为你离得不远。我看到的主要问题是您没有处理 List
class.
first
指针
当您像这样将值添加到列表末尾时,要添加到列表的第一个值是一种特殊情况,因为您还必须更新 first
指针。您的代码不会这样做。
关于您的代码的另一个不寻常的事情是您有那些 count
和 sum
变量。看起来您正在尝试保持 运行 总列表长度和列表总和。这并没有错,但这是一件不寻常的事情。通常你会在需要的时候计算那些,而不是所有的时间。此外,如果您确实继续这样做,那么您需要将 count
和 sum
添加到您的列表 class。目前,您在一个变量中有一个列表,它的长度和总和在不同的变量中。这是糟糕的设计,因为变量之间没有紧密关联。假设您有两个列表。那么您将如何更新 count
和 sum
变量?就我个人而言,我只会删除处理 count
和 sum
的代码,只需在需要时计算这些数量即可。