リストでつまづいています
Posted: 2010年8月27日(金) 23:20
C言語でリストを学んだので、C++のクラスを使ってそれっぽく作れないかと思い、
以下の様なプログラムを組みました。
#include <stdio.h>
//基本データ。ここを改造してキャラクターの基本クラスを作る
class Data{
public:
//暫定的に配置するデータ。1つ前のノードより1大きい数が入る
int i;
//コンストラクタ
Data(int j){
i = j + 1;
}
//デストラクタ
~Data(){
printf(" %dDataを削除します\n", i);
}
//iの中身を確認する
void nprint(){
printf(" %dDataの内容は%d\n", i, i);
}
};
//リストの1つ1つのデータ
class Node{
public:
//データのアドレス
Data* here;
//1つ前のノードのアドレス
Node* prev;
//1つ先のノードのアドレス
Node* next;
//コンストラクタ。指定されたとおりにくっつけます
Node(Data* h, Node* p, Node* n){
here = h;
prev = p;
next = n;
}
//デストラクタ。
~Node(){
printf(" %dNodeを削除します\n", here->i);
delete here;
prev->next = next;
next->prev = prev;
}
};
//リストそのもの。
class List{
public:
//first。先頭。
Node* fst;
//ダミー
Node* dummy;
//要素数。
int num;
//コンストラクタ
List(){
//ダミーの実体?生成
dummy = new Node(new Data(-1), NULL, NULL);
//先頭のアドレスをダミーに。
fst = dummy;
//要素数は0に。(ダミーは数えない)
num = 0;
}
//デストラクタ
~List(){
//削除するアドレスを2番目にセッティング
Node* dcur = fst->next;
printf("listを削除します\n");
//削除部分。入れ替えなんかの部分はNodeクラスの
//デストラクタで済ませている…つもり
while(dcur){
Node* next = dcur->next;
delete dcur;
dcur = next;
}
}
//要素追加
void add(){
//先端まで移動
Node* l = fst;
while(l->next != NULL) l = l->next;
//先端に新しいデータをくっつける
l->next = new Node(new Data(l->here->i), l, NULL);
//要素数を加える
num++;
}
//要素削除
void dlt(int n){
//指定された場所まで移動
Node* l = fst;
if(n <= 0 || n > num) return;
for(;n!=0;n--){
if(l-> next == NULL) return;
l = l->next;
}
//その場所を削除
delete l;
//要素数を減らす
num--;
}
//中身の参照
void move(){
Node* l = fst->next;
while(l != NULL){
l->here->nprint();
l = l->next;
}
}
};
int main(){
List lst;
lst.add();
lst.add();
lst.add();
lst.add();
lst.add();
lst.dlt(3);
lst.move();
return 0;
}
その結果は
3Nodeを削除します
3Dataを削除します
1Dataの内容は1
2Dataの内容は2
4Dataの内容は4
5Dataの内容は5
listを削除します
1Nodeを削除します
1Dataを削除します
2Nodeを削除します
2Dataを削除します
4Nodeを削除します
4Dataを削除します
5Nodeを削除します
5Dataを削除します
としっかり出たのですが、その後何故か強制終了されてしまいました。
原因はNodeクラスのデストラクタあたりにありそうなのですが、どのように解決すればよいかがわかりません。
何かヒントをもらえないでしょうか?
以下の様なプログラムを組みました。
#include <stdio.h>
//基本データ。ここを改造してキャラクターの基本クラスを作る
class Data{
public:
//暫定的に配置するデータ。1つ前のノードより1大きい数が入る
int i;
//コンストラクタ
Data(int j){
i = j + 1;
}
//デストラクタ
~Data(){
printf(" %dDataを削除します\n", i);
}
//iの中身を確認する
void nprint(){
printf(" %dDataの内容は%d\n", i, i);
}
};
//リストの1つ1つのデータ
class Node{
public:
//データのアドレス
Data* here;
//1つ前のノードのアドレス
Node* prev;
//1つ先のノードのアドレス
Node* next;
//コンストラクタ。指定されたとおりにくっつけます
Node(Data* h, Node* p, Node* n){
here = h;
prev = p;
next = n;
}
//デストラクタ。
~Node(){
printf(" %dNodeを削除します\n", here->i);
delete here;
prev->next = next;
next->prev = prev;
}
};
//リストそのもの。
class List{
public:
//first。先頭。
Node* fst;
//ダミー
Node* dummy;
//要素数。
int num;
//コンストラクタ
List(){
//ダミーの実体?生成
dummy = new Node(new Data(-1), NULL, NULL);
//先頭のアドレスをダミーに。
fst = dummy;
//要素数は0に。(ダミーは数えない)
num = 0;
}
//デストラクタ
~List(){
//削除するアドレスを2番目にセッティング
Node* dcur = fst->next;
printf("listを削除します\n");
//削除部分。入れ替えなんかの部分はNodeクラスの
//デストラクタで済ませている…つもり
while(dcur){
Node* next = dcur->next;
delete dcur;
dcur = next;
}
}
//要素追加
void add(){
//先端まで移動
Node* l = fst;
while(l->next != NULL) l = l->next;
//先端に新しいデータをくっつける
l->next = new Node(new Data(l->here->i), l, NULL);
//要素数を加える
num++;
}
//要素削除
void dlt(int n){
//指定された場所まで移動
Node* l = fst;
if(n <= 0 || n > num) return;
for(;n!=0;n--){
if(l-> next == NULL) return;
l = l->next;
}
//その場所を削除
delete l;
//要素数を減らす
num--;
}
//中身の参照
void move(){
Node* l = fst->next;
while(l != NULL){
l->here->nprint();
l = l->next;
}
}
};
int main(){
List lst;
lst.add();
lst.add();
lst.add();
lst.add();
lst.add();
lst.dlt(3);
lst.move();
return 0;
}
その結果は
3Nodeを削除します
3Dataを削除します
1Dataの内容は1
2Dataの内容は2
4Dataの内容は4
5Dataの内容は5
listを削除します
1Nodeを削除します
1Dataを削除します
2Nodeを削除します
2Dataを削除します
4Nodeを削除します
4Dataを削除します
5Nodeを削除します
5Dataを削除します
としっかり出たのですが、その後何故か強制終了されてしまいました。
原因はNodeクラスのデストラクタあたりにありそうなのですが、どのように解決すればよいかがわかりません。
何かヒントをもらえないでしょうか?