2013-10-22 46 views
2

我想寫一個方法,看看值的列表,並確定如果他們正在增加或否真或假是否值列表增加?

例如,對於包含head-()(11)(8)( 15)(3),isIncreasing()應該返回false。但是,在包含head-()(7)(9)(15)的列表上工作時,它將返回true。

我發現自己越來越沮喪與這個問題,它真的難倒我。如果有人能拼湊一些代碼,它會創造奇蹟。由於我想查看每個數字的情況,總會給我帶來問題。

我開始寫出來與簽名

bool List<Object>::isIncreasing() const; 

,並從那裏方法我不知道從哪裏開始

任何幫助嗎?

由於一噸

編輯 實施

#ifndef LIST_CPP 
#define LIST_CPP 

#include "List.h" 

namespace cs20 { 
template <class Object> 
List<Object>::List() { 
    head = new ListNode<Object>; 
} 

template <class Object> 
List<Object>::List(const List<Object>& rhs) { 
    head = new ListNode<Object>; 
    *this = rhs; 
} 

template <class Object> 
List<Object>::~List() { 
    makeEmpty(); 
    delete head; 
} 

template <class Object> 
bool List<Object>::isEmpty() const { 
    return(head->nextIsNull()); 
} 

template <class Object> 
void List<Object>::makeEmpty() { 
    while (!isEmpty()) { 
     remove(first().retrieve()); 
    } 
} 

template <class Object> 
ListIterator<Object> List<Object>::zeroth() const { 
    return(ListIterator<Object>(head)); 
} 

template <class Object> 
ListIterator<Object> List<Object>::first() const { 
    return(ListIterator<Object>(head->getNext())); 
} 

template <class Object> 
void List<Object>::insert(const Object& data, 
          const ListIterator<Object> &iter) { 
    if (iter.isValid()) { 
     ListNode<Object>* newnode = new ListNode<Object>(data, iter.current->getNext()); 
     iter.current->setNext(newnode); 
    } 
} 

template <class Object> 
void List<Object>::insert(const Object& data) { 
    // insert after the header node 
    ListNode<Object>* newnode = new ListNode<Object>(data, head->getNext()); 
    head->setNext(newnode); 
} 

template <class Object> 
ListIterator<Object> List<Object>::findPrevious(const Object& data) const { 
    ListNode<Object>* node = head; 
    while(node->getNext() != NULL && node->getNext()->getElement() != data) { 
     node = node->getNext(); 
    } 
    if (node->getNext() == NULL) { 
     node = NULL; 
    } 
    return ListIterator<Object>(node); 
} 


template <class Object> 
bool List<Object>::isIncreasing() const { 


    } 

template <class Object> 
void List<Object>::insert_back(const Object& data) { 
    ListNode<Object>* newnode = new ListNode<Object>(data, NULL); 
    ListNode<Object>* lastNode = head; 
    while (lastNode->getNext()!= NULL && lastNode->getNext()->getElement() != data) 
     lastNode = lastNode->getNext(); 
    lastNode->setNext(newnode); 

} 

template <class Object> 
void List<Object>::remove(const Object& data) { 
    ListIterator<Object> iter = findPrevious(data); 
    if (iter.isValid()) { 
     ListNode<Object>* node = findPrevious(data).current; 
     if (node->getNext() != NULL) { 
      ListNode<Object> *oldNode = node->getNext(); 
      node->setNext(node->getNext()->getNext()); // Skip oldNode 
      delete oldNode; 
     } 
    } 
} 

// Deep copy of linked list 
template <class Object> 
const List<Object>& List<Object>::operator =(const List<Object>& rhs) { 
    if (this != &rhs) { 
     makeEmpty(); 

     ListIterator<Object> rightiter = rhs.first(); 
     ListIterator<Object> myiterator = zeroth(); 
     while(rightiter.isValid()) { 
      insert(rightiter.retrieve(), myiterator); 
      rightiter.advance(); 
      myiterator.advance(); 
     } 
    } 
    return(*this); 
} 

} 

#endif 

EDIT 2 下面是一個的需求增強應該如何工作的 「產出」

測試提示:

運行方法:插入(3);插入(2);插入(1); 打印清單。它應該是什麼樣子? 調用:isIncreasing();它應該返回什麼? 打印清單。它應該是什麼樣子? 運行方法:remove(3);刪除(2); 打印清單。它應該是什麼樣子? 調用:isIncreasing();它應該返回什麼? 打印清單。它應該是什麼樣子? 運行方法:remove(1); 運行方法:insert(7);插入(9);插入(11); 打印清單。它應該是什麼樣子? 調用:isIncreasing();它應該返回什麼? 打印清單。它應該是什麼樣子?

+0

,如果這是家庭作業請標記爲 –

+0

列表本身是由您執行還是您正在使用內置類型或庫? – LostBoy

+0

@OmryYadan好的,謝謝 – cbr4267

回答

1

像這樣(未測試):

template <class Object> 
bool List<Object>::isIncreasing() const 
{ 
    ListNode<Object>* node= head; 
    while (node->getNext() != NULL) 
    { 
     // Check if the next element is smaller (or the same as)... if so return false. 
     if (node->getNext()->getElement() <= node->getElement()) 
      return false; 
     node = node->getNext(); 
    } 
    // If we get here then all values are increasing 
    return true; 
} 
+0

這樣的幫助!謝謝 完全明白現在 – cbr4267

1

如何類似下面的僞代碼

int last_value = std::numeric_limits<int>::min(); 

for (current_node = list_head; current_node != nullptr; current_node = current_node->next) 
{ 
    if (current_node->value > last_value) 
    { 
     last_value = current_node->value; 
    } 
    else 
    { 
     return false; 
    } 
} 

return true; 
+0

我不太確定如何將它與isIncreasing – cbr4267

+0

@ user2906082關聯如果當前節點值不大於最後一個值(即值不增加),則返回false。否則整個循環將完成,所有值都增加,因此返回true。 –

1

另一種僞代碼的可能性:

node = GetHead(); 
while(node != End()) 
{ 
    nodeBefore = node++; 
    if(node != End() && 
     *nodeBefore >= *node) 
    { 
     break; 
    } 
} 

if(Size() > 0 && node == End()) 
{ 
    bIsAscending = true; 
}