2016-04-01 20 views
0

私は自分のリンクリストに逆関数を書いていますが、リスト内の新しい最初の番号を指す方法を見つけることができません。私が修正したくない他の関数があるので、headでListNode *をmainで宣言して参照渡しすることはできません。これを行う他の方法はありますか?ここに私のヘッダーファイルは次のとおりです。リンクリストリバース機能OOP C++

// Specification file for the NumberList class 
#ifndef NUMBERLIST_H 
#define NUMBERLIST_H 

class NumberList 
{ 
private: 
    // Declare a structure for the list 
    struct ListNode 
    { 
     double value;   // The value in this node 
     struct ListNode *next; // To point to the next node 
    }; 

    ListNode *head;   // List head pointer 

public: 
    // Constructor 
    NumberList() 
     { head = nullptr; } 

    // Destructor 
    ~NumberList(); 

    // Linked list operations 
    void appendNode(double); 
    void insertNode(double); 
    void deleteNode(double); 
    int searchList(double); 
    void reverseList() const; 
    void displayList() const; 
}; 
#endif 

ここには逆の機能があります。頭を置く= previousNodeは動作しません。

void NumberList::reverseList() const 
{ 
    ListNode *currentNode;    // points to current node 
    ListNode *previousNode = nullptr; // stores address of previous node 
    ListNode *nextNode = nullptr;  // stores the address of next node 
    ListNode *tempNode = nullptr;  // 

    currentNode = head; 

    while (currentNode != nullptr) 
    { 
     cout << "current value: " << currentNode->value << endl; 
     nextNode = currentNode->next; 
     currentNode->next = previousNode; 
     previousNode = currentNode; 
     currentNode = nextNode; 
    } 
    //head = previousNode; 
} 

*編集:(メインで追加)

#include <iostream> 
#include <fstream> 
using namespace std; 
#include "NumberList.h" 

int main() 
{ 
    NumberList nList; 
    ifstream inFile; 
    double number; 
    double searchedNum; 

    inFile.open("input.txt"); 

    if (!inFile) 
    { 
     cout << "File could not be opened!" << endl; 
    } 
    else 
    { 
     while (inFile >> number) 
     { 
      nList.appendNode(number); 
     } 

     cout << "The list after file reading:" << endl; 
     nList.displayList(); 

     cout << "What number would you like to search for? "; 
     cin >> searchedNum; 
     cout << "Position: " << nList.searchList(searchedNum) << endl; 

     cout << "The list after reversing:" << endl; 
     nList.reverseList(); 
     nList.displayList(); 
    } 



    return 0; 
} 
+0

main()の最初のオブジェクトを作成し、main()のポインタ(head)を作成します。いくつの新しいオブジェクトを作成するかは関係ありません(リンクされたリスト)、頭は頭に留まります。次に、関数を呼び出すたびに頭のコピーを送信するか、参照で送信しますが、何もしないうちにその関数内でそのコピーを取っています。今、リンクされたリストはサイクルのように見えますか? (最後のノードが最初のノードを指している) –

答えて

1

ここでは、反復バージョンが(私は// Added *変化をマーク)です:

void NumberList::reverseList() 
{ 
    ListNode *currentNode;    // points to current node 
    ListNode *previousNode = nullptr; // stores address of previous node 
    ListNode *nextNode = nullptr;  // stores the address of next node 

    currentNode = head; 
    ListNode* temp; // Added* 
    while (currentNode != nullptr) 
    { 
     temp = currentNode->next; // Added * 
     nextNode = currentNode->next; 
     currentNode->next = previousNode; 
     previousNode = currentNode; 
     currentNode = temp; // Added * 
    } 
} 
+1

多分私は間違っていますが、私は 'const'を保持しません。 –

+0

もちろん、私はOPからペーストしてコピーします。 – blazs

+0

ありがとうございます。私はそれが頭にpreviousNodeを割り当てるのを妨げるconstだと思う。 – Zolte

0
ListNode * reverse_list(ListNode * list, ListNode * new_head = nullptr) 
{ 
    if (list == nullptr) return new_head; 

    ListNode * tmp = list->next; 
    list->next = new_head; 

    return reverse_list(tmp, list); 
} 

head = reverse_list(head);