链表测试功能+除零错误

时间:2013-02-08 09:40:33

标签: c++ constructor linked-list division zero

我应该创建一个双向链表。我还获得了一个测试链表功能的CPP文件('test.cpp'文件)。我遇到的问题是A)我不知道我的构造函数和析构函数应该做什么,以及B)编译器不编译test.cpp文件,因为它有'除以零'错误,当当我的List构造函数将列表'head'初始化为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函数的实现(其中一个函数得到除零错误)。

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。我知道我发布了很多代码,但此刻我有点绝望。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

其实我不明白你的要求是什么。我看到了一种测试,而在不一致的情况下,测试应该生成“整数除零”异常或适用于特定平台的任何异常。一个真正变态的想法恕我直言。

那么,为什么不编译器“注意”除以零?它没有AFAIK。严格来说,它可能会生成执行此操作的代码。是的,这会在运行时生成处理器异常(中断),那又怎样呢?如果这是作者的意图 - 我在这里看不到问题,至少从编译器的角度来看。

您是否试图说编译器行为不一致,有时允许编译?