2017-03-18 12 views
-2

これはなぜこれが機能しないのか理解しようとしているうちに、これを4.5時間行ったことです。まだ運がありません。私はセグメンテーションフォールトを取得し続けるか、リストが表示されることはありません。リンクされたリストからのセグメンテーションフォールト

SimpleVector.h

// SimpleVector class template 
#ifndef SIMPLEVECTOR_H 
#define SIMPLEVECTOR_H 
#include <iostream> 
#include <iomanip> 
using namespace std; 

class SimpleVector 
{ 
private: 
    struct Link{ 
     int data; 
     Link *next; 
    }; 
    Link *head; 
public: 
    // Default constructor 
    SimpleVector() 
     {head = NULL;} 

    // Destructor declaration 
    ~SimpleVector(); 

    void linkList(int); 

    //void insertLink(T); 

    void displayList(); 
}; 

//Destructor for SimpleVector 

SimpleVector::~SimpleVector(){ 
    Link *linkPtr; 
    Link *nextPtr; 

    nextPtr = head; 

    while(linkPtr != NULL){ 
     nextPtr = linkPtr->next; 
    } 

    delete linkPtr; 

    linkPtr = nextPtr; 
} 

//Creation of List 

void SimpleVector::linkList(int size){  
    Link *newLink = new Link; //create first link 
    head = newLink; // 

    head->data = size--;   //Fill the front with data 
    head->next = NULL;  //Point the front to no where 

    do{ 
     Link *end = new Link; //Create a new link 
     end->data = size--;  //Fill with data 
     end->next = NULL;  //Point to no where 
     head->next = end;  //Previous link will point to the end 
     // head = end;    //Move to the end 
    }while(size > 0);   //Repeat until filled 
} 

//Creation of Link and insertion 
/* 
template <class T> 
void SimpleVector<T>::insertLink(T){ 

} 
*/ 

//Function to print the entire list 

void SimpleVector::displayList(){ 
    Link *linkPtr; 

    linkPtr = head; 

    while(linkPtr != NULL){ 
     cout<<setprecision(3)<<linkPtr->data; 
     linkPtr = linkPtr->next; 
    } 
} 

#endif 

main.cppに

// This program demonstrates the SimpleVector template. 
#include <iostream> 
#include "SimpleVector.h" 
using namespace std; 


int main(){ 
int SIZE = 10; // Number of elements 

// Create a SimpleVector of ints. 
SimpleVector intTable; 

intTable.linkList(SIZE); 

intTable.displayList(); 

return 0; 
} 
+0

*ビルドが成功したにもかかわらず* - ビルドが成功した場合は、プログラムに構文エラーがないことを意味します。ロジックが正しいのか、プログラムが正しい結果を生み出すのかとは何の関係もありません。 – PaulMcKenzie

+0

セグメンテーションフォルトを生成するのはどのラインですか? –

+0

デストラクタは、初期化されていないローカル変数を使用するため、間違っています。あなたのコンパイラはこれについてあなたに警告しませんでしたか? – PaulMcKenzie

答えて

0

linkList()の機能が間違っています。 head->next = end;

は、端部が含まれ、最初のノード10が含まれていると言うことができます。このライン9(新規ノード)
は現在head->next = end

10 -> 9が新しいノードendは再び8

head->next = end 手段となる手段10 -> 8 前の9が失われました。 。 。 。

最後にそれが10 -> 1

が代わりにこれを試してみてくださいになります。

void SimpleVector::linkList(int size){  
    Link *newLink = new Link; //create first link 
    head = newLink; // 

    head->data = size--;   //Fill the front with data 
    head->next = NULL;  //Point the front to no where 
    Link *temp = head; 
    do{ 
     Link *end = new Link; //Create a new link 
     end->data = size--;  //Fill with data 
     end->next = NULL;  //Point to no where 
     temp->next=end;//Previous link will point to the end 
     temp=end; //Now this has become previous link  
     // head = end;    //Move to the end 
    }while(size > 0);   //Repeat until filled 
} 

それは次に前とend(新しく作成されたノード)との間のリンクを作成し、前のノードを指すためにtemp変数を使用し、その後温度が終了となります。

編集:

Link *linkPtr=head; 
    Link *nextPtr;// = linkPtr->next; 
    do 
    { 
     nextPtr = linkPtr->next; 
     cout<<linkPtr->data<<"\t"; 
     delete linkPtr; 
     linkPtr = nextPtr; 
    }while(linkPtr!=NULL); 

はこれを試してみてください。リスト全体を削除します

+0

私はこれを以前のように試しましたが、運がまだありません。私はそれがdisplayresultと何か関係があると思ったので、ループの10回の反復に変更しましたが、何も表示しません。 – EggplantMachina

+0

@ user64322デストラクタの問題のメインスレッドで私のコメントを読まなかったと思います。 – PaulMcKenzie

+0

デストラクタで全リストを削除しますか? – Sniper

関連する問題