二重連結リストを作成することになっていました。また、リンク リスト関数をテストする CPP ファイル (「test.cpp」ファイル) も提供されています。私が抱えている問題は、A) コンストラクタとデストラクタが何をすべきかわからない、および B) 'ゼロによる除算' エラーがあるため、コンパイラが test.cpp ファイルをコンパイルしないことです。私のリストコンストラクターがリストの「ヘッド」をNULLに初期化していたとき、それはうまくコンパイルされていました。
以下は、リンクされたリスト内のノードへのコードです:
template <class T>
struct ListItem
{
T value;
ListItem<T> *next;
ListItem<T> *prev;
ListItem(T theVal)
{
this->value = theVal;
this->next = NULL;
this->prev = NULL;
}
};
ジェネリック リスト クラスは次のとおりです。
template <class T>
class List
{
ListItem<T> *head;
public:
// Constructor
List();
// Copy Constructor
List(const List<T>& otherList);
// Destructor
~List();
void insertAtHead(T item);
};
以下は、コンストラクタ、デストラクタ、および insertAtHead 関数(ゼロ除算エラーを取得する関数の 1 つ) の現在の実装です。
template <class T>
List<T>::List()
{
head->value=0;
}
template <class T>
List<T>::~List()
{
ListItem<T> *temp, *temp2;
temp=head;
if(head->next==NULL)
{
delete head;
}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
temp2=temp->prev;
delete[] temp2;
}
delete [] temp;
delete [] head;
}
}
template <class T>
void List<T>::insertAtHead(T item)
{
ListItem<T>* a = new ListItem<T>(item);
if(head->next==NULL && head->value=0)
{
head=a;
}
else
{
head->prev=a;
a->next=head;
head=a;
}
}
最後に、ゼロ除算を含むinsertAtHead をテストする関数を次に示します。
void test_list_insert_head()
{
lasttotpoints = 5;
List<int> l;
for (int i = 0; i < 25000; i++)
{
l.insertAtHead(i);
ListItem<int> *tmp = l.getHead();
int k = i;
while (tmp != NULL)
{
if (tmp->value != k)
int a = 1/0;
k--;
tmp = tmp->next;
}
}
cout << ".";
lastpoints += 5;
}
コンパイラが以前にゼロ除算に気付かなかったのはなぜですか?私のコンストラクタとデストラクタは正確に何をすべきなのでしょうか? ありがとう。PS。たくさんのコードを投稿したことは知っていますが、現時点ではちょっと必死です。どんな助けでも大歓迎です!