2017-06-30 25 views
-3

リンクされたリストが1つあり、N番目の要素を取得しようとしています。私はそれを取得するための関数を作成しましたが、それは動作していないようです。リンクされたリストからN番目の要素を取得するC++

必要な場合、これは全体のコードです:

#include <iostream> 
using namespace std; 

class List 
{ 
private: 

    typedef struct node 
    { 
     int data; 
     node* next; 
    } *nodePtr; 

    nodePtr head; 
    nodePtr curr; 
    nodePtr temp; 


public: 

    List() 
    { 
     head = NULL; 
     curr = NULL; 
     temp = NULL; 
    } 

    void AddNode (int addData) 
    { 
     nodePtr NewNode = new node; 
     NewNode->next = NULL; 
     NewNode->data = addData; 


     if (head != NULL) 
     { 
      curr = head; 
      while(curr->next != NULL) 
      { 
       curr = curr->next; 
      } 
      curr->next = NewNode; 
     } 
     else 
     { 
      head = NewNode; 
     } 
    } 

    void DeleteNode (int delData) 
    { 
     nodePtr delPtr = NULL; 
     temp = head; 
     curr = head; 
     while ((curr != NULL) && (curr->data !=delData)) 
     { 
      temp = curr; 
      curr = curr->next; 
     } 

     if (curr == NULL) 
     { 
      cout << delData << " was not in the list " << endl; 
      delete delPtr; 
     } 
     else 
     { 
      delPtr = curr; 
      curr = curr->next; 
      temp->next = curr; 
      if (delPtr == head) 
      { 
       head = head->next; 
       temp = NULL; 
      } 
      delete delPtr; 
      cout << "The value " << delData << " was deleted" << endl; 
     } 
    } 

    int getNth(int index) 
    { 
     nodePtr curr = head; 
     int counter = 0; 

     while (counter != NULL) 
     { 
      if (counter == index) 
      { 
       cout << curr->data; 
      } 
      counter++; 
      curr = curr->next; 
     } 
    } 

    void printList() 
    { 
     curr = head; 
     while(curr != NULL) 
     { 
      cout << curr->data << " "; 
      curr = curr->next; 
     } 

    } 
    /* 
     void printNode() 
     { 
     curr = head; 

     //if curr->next is NULL, we know that curr must be the last element 
     while(curr != NULL && curr->next != NULL) 
     { 
      curr = curr->next; 
     } 

     cout << curr->data; 
     } 
    */ 

    /* 
     void DeleteLastNode() 
     { 
     curr = head; 
     nodePtr delPtr = NULL; 
     while(curr != NULL && curr->next != NULL) 
     { 
      curr = curr->next; 
     } 

     if (curr->next == NULL) 
     { 
       delPtr = curr; 
       curr = curr->next; 
       temp->next = curr; 
       if (delPtr == head) 
       { 
        head = head->next; 
        temp = NULL; 
       } 
       delete delPtr; 
     } 

     } 
    */ 
}; 



int main() 
{ 
    List text; 
    text.AddNode(1); 
    text.AddNode(2); 
    text.AddNode(3); 
    text.AddNode(4); 
    text.AddNode(5); 
    text.AddNode(6); 
    text.AddNode(7); 
    text.AddNode(8); 
    text.AddNode(9); 
    text.AddNode(10); 
    text.printList(); 
    cout << endl; 
    text.DeleteNode(2); 
    text.printList(); 

    return 0; 
} 

そして、これは私が持つ問題を抱えての関数である:

int getNth(int index) 
    { 
     nodePtr curr = head; 
     int counter = 0; 

     while (counter != NULL) 
     { 
      if (counter == index) 
      { 
       cout << curr->data; 
      } 
      counter++; 
      curr = curr->next; 
     } 
    } 
+3

はおそらく、あなたが '意味行う前にnullであるかどうかを確認(CURR!= NULL)' –

+0

あなただけ使用した場合、 'のstd :: list'(または'のstd ::ベクトル')を使用すると、単純に[std :: nth_element](http://en.cppreference.com/w/cpp/algorithm/nth_element)を使用することができます。 –

+2

また、所望のカウンタ***に到達したときにループを破る。 if(counter == index) { cout << curr-> data;ブレーク; } – Ibrahim

答えて

1

が、私はそれだけでなくC++精通ので、代わりの一部を提供していないですC++で間違ったコードや悪いコードを記述した場合、どの言語を使用しても問題はないので、この問題の背後にあるロジックについて説明します。ここ

あなたのコードは:counter(このユースケースでは)nullになることはありませんので、それはちょうど整数であるため、

while (counter != NULL) 
    { 
     if (counter == index) 
     { 
      cout << curr->data; 
     } 
     counter++; 
     curr = curr->next; 
    } 

、間違っています。あなたのwhileループを変更あまりに

あなたがあなたの現在の要素がnullであるかのどちらかあなたが渡されたインデックスに達していることを知っているあなたのwhileループから抜け出す。あなただけの格納されたデータを返すことができます。この時点で
while (counter <= index && current != null) { 
    counter++; 
    current = current.next; //getting the next element 
} 

現在のノードで、それは一方で、この

return (current != null) ? current.data : null;