次のコードを使用していますが、次のような状況で修正プログラムを書き込もうとしています。パラメータに渡された数値がリストに存在しないため、データを使用して前のポインタを取得するC++のリンクリスト
この関数はべきである:は、それがそのデータ 同じであるリストと、最初に見つかったノードを横断するために使用する値 を受け入れ、それが一致するノードの前ListNodeへのポインタを戻します。
//return a pointer to the ListNode before the matching node data
template < typename NODETYPE >
ListNode <NODETYPE> * List <NODETYPE>::prevPointerUsingData(NODETYPE &data) {
ListNode <NODETYPE> *previousPtr = NULL;
ListNode <NODETYPE> *currentPtr = firstPtr;
//first node cannot have a previous
if(data == currentPtr->data) {
cout << "canot have a previous node" << endl;
return 0;
}else {
//traverse until you've met the previous' node's data
while (currentPtr->nextPtr != NULL) {
if(currentPtr->nextPtr->data == data){
//previous is assigned the current node
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
cout << previousPtr->data << " <--previousData" << endl;
return previousPtr;
}else {
currentPtr = currentPtr->nextPtr;
}
}if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) {
cout << "no such node" << endl;
return 0;
}
}
}
私は私のリストにないもののように数(データ)を入力すると、それがクラッシュします。どこかでロジックが間違っていますか?
EDIT: 私は、リストが空の場合、それはリターン0の場合、私はこのコードを取得し、上記のいずれかにそれを適用して参照するにはIF
チェックを追加するのイム思考が、働くこのコードを書きました上記のものがノードからのデータを使用し、以下ではポインタを使用する点を除いて、同じことを行うためです。
この関数は:は、リスト内のノードの位置を と指定してintを受け取り、そのノードの前のListNodeへのポインタを返します。
//return pointer to the ListNode before that node
template < typename NODETYPE >
ListNode <NODETYPE> * List <NODETYPE> ::prevPointerUsingPosition(int position) {
ListNode <NODETYPE> * previousPtr = NULL;
ListNode <NODETYPE> * currentPtr = firstPtr;
if(position < 1) {
return 0;
}else if(position > sizeOfList()) {
return 0;
}else {
for(int i = 1; i < position-1; i++) {
currentPtr = currentPtr->nextPtr;
}
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
cout << previousPtr->data << " <--previousData" << endl;
return previousPtr;
}
}
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –
クラッシュする行はありますか?デバッガはあなたに何を伝えますか? –
コードに2つの目立つ冗長性があります。 1つは 'else'で、これは前のブロックが' return'で終わるので不要です。もう一つは 'if'の中の' currentPtr-> nextPtr == NULL'のテストです - あなたはそれが以前の 'while'ループが終了する唯一の条件であることを既に知っています。これらの冗長性は、コードを理解しにくくします。 –