2016-09-12 18 views
1

私はユーザから入力文字列を受け取り、文字列の文字を使って二重リンクリストを作成する必要があります。つまり、ユーザーの文字列を繰り返し処理し、二重リンクリストを生成する必要があります。私はforループを作成し、出力は機能しますが、出力を表示した直後にプログラムがクラッシュします。私はC++で2週間の経験を持っていますので、ルーキーの間違いを許してください。以下のコードを見つけてください。C++ Forループを使って二重リンクリストを作成する

#include<cstdlib> 
#include<iostream> 
#include <string> 

using namespace std; 

struct node { 
    string data; 
    node *next; 
    node *prev; 
}; 

string getString() { 
    string userString; 
    cout << " Please enter a string for reversal: "; 
    cin >> userString; 
    return userString; 
} 

// print forward 
void printDataFor(node* head); 
// print reverse 
void printDataRev(node* tail); 

int main() { 
    node* head= new node; 
    node* tail= new node; 
    node* n; 
    string reverse = getString(); 
    int length = reverse.length(); 

    // loop to create linked list 
    for (int i = 0; i < length - 1; i++) { 
     if (head->prev == NULL) { 
      n = new node; 
      n->data = reverse[i]; 
      n->prev = NULL; 
      head = n; 
      tail = n; 
     } 
     else { 
      n = new node; 
      n->data = reverse[i]; 
      n->prev = tail; 
      tail->next = n; 
      tail = n; 
     } 
    } 

    n = new node; 
    n->data = reverse[length-1]; 
    n->prev = tail; 
    tail->next = n; 
    tail = n; 
    tail->next = NULL; 
    // call to print reverse 
    printDataRev(tail); 
} 

// print forward 
void printDataFor(node* head) { 
    node* temp = head; 
    while (temp != NULL) { 
     cout << temp->data; 
     temp = temp->next; 
    } 
} 

// print reverse 
void printDataRev(node* tail) { 
    node* temp = tail; 
    while (temp != NULL) { 
     cout << temp->data; 
     temp = temp->prev; 
    } 
} 

答えて

0

示されたコードには複数のバグがあります。

node* head= new node; 

// ... 

if (head->prev == NULL) { 

あなたは新しく構築されたノードがNULLに初期化さprevnextポインタを持っていることを期待しています。

これは非常に合理的な期待です。 newは何にもnextprevを初期化するつもりはない、明示的なコンストラクタがないと

struct node { 
    string data; 
    node *next; 
    node *prev; 
}; 

:問題はそれを行いますあなたのコードでは何もありませんということです。それらはゴミとなり、表示されたコードはガベージポインタをある時点で無効にしようとし、クラッシュする可能性があります。

NULLに初期化する(または現在のC++標準で導入された新しい構文を使用し、両方のデフォルトの初期化子を宣言する)には、明示的なコンストラクタが必要です。

これが最初の問題です。

2番目の問題は、ループがコード化されているため、説明できない理由のために必要な回数が1回少なくなるようにコード化されており、最後の値をリンクリストに挿入するコードが重複しています。これがなぜ必要なのかわかりません。すべての文字を繰り返して挿入します。

第3の問題は、ロジックが余分なheadtailというノードをリンクリストに挿入しているように見え、データが空の文字列になることです。リンクされたリストを出力するループは単純に空文字列を出力するので、見た目には目に見える効果はありません。それでも、それは技術的に間違っています。

重複する偽のノードを排除するためにロジックを調整する必要があります。ノード、ほとんど役に立たない、代わりnewの、NULLheadtailを初期化することによって開始:

node *head=NULL; 
node *tail=NULL; 

そして文字列の最初の文字のエッジ条件をテストするために、それに応じてforループ内のロジックを調整しますこれは、headtailの両方を指す新しいノードと、それに続く文字をそれぞれ挿入する通常の実行パス(head)を作成します。

+0

別の問題は、初期化ループで 'head-> prev == NULL'が常に真であるということです。 –

関連する問題