【发布时间】:2019-08-02 12:42:56
【问题描述】:
我编写了一个 LinkedList 类和一个测试函数来测试我的类。但是,我在编译和运行程序时遇到了一些问题。共有三个文件:test.cppLinkedList.cpp 和LinkedList.h。
test.cpp:
#include "LinkedList.cpp"
#include <string>
#include <iostream>
using namespace std;
// Loading Array into Linked List for testing
template <class T, size_t n>
void fillArrayIn(LinkedList<T> &list, T (&arr)[n])
{
unsigned int length = sizeof(arr) / sizeof(*arr);
for (unsigned int i = 0; i < length; i++)
{
list.append(arr[i]);
}
}
int main()
{
// Integer LinkedList
cout << "=====================================" << endl;
cout << "Test for Integer LinkedList" << endl
<< endl;
LinkedList<int> intList;
cout << "Is List Empty? " << (intList.isEmpty() ? "Yes" : "No") << endl
<< endl; // Test isEmpty()
int intArray[] = {1, 2, 5, 6, 9, 0, 1};
fillArrayIn(intList, intArray); // Test appending
cout << "Array Loaded" << endl;
cout << "Is List Empty? " << (intList.isEmpty() ? "Yes" : "No") << endl;
intList.printAll();
intList.insert(*(new int(100)), 3); // Test insertion
cout << endl
<< "Insert 100 to position 3" << endl;
intList.printAll();
cout << "Insert integer outside the List: "
<< (intList.insert(*(new int(100)), 100) ? "Success" : "Fail") << endl
<< endl; // Test illegal insertion
cout << "Find the position of integre 9: " << intList.positionOf(9) << endl; // Test get the position of element in List
cout << "Find the position of not existed element: " << intList.positionOf(20) << endl
<< endl; // Test get the position of not existed element
cout << "The element at position 0 is " << *(intList.get(0)) << endl; // Test get element
cout << "The element at position 7 is " << *(intList.get(7)) << endl;
cout << "The element at position 8 is " << intList.get(8) << endl
<< endl;
cout << "Deleting 100 from list: "
<< (intList.remove(*(new int(100))) ? "Sucess" : "Fail") << endl;
intList.printAll();
cout << "Deleting not existed element from list: "
<< (intList.remove(*(new int(20))) ? "Sucess" : "Fail") << endl;
intList.printAll();
}
LinkedList.cpp:
#include <string>
#include <iostream>
#include "LinkedList.h"
using namespace std;
template <class T>
LinkedList<T>::LinkedList()
{
head = new Node(NULL);
}
template <class T>
void LinkedList<T>::append(T &_data)
{
Node *current = head;
while (current->next)
{
current = current->next;
}
current->next = new Node(&_data);
// cout << _data <<" has been appended to the list."<<endl;
}
template <class T>
bool LinkedList<T>::insert(T &_data, const int position)
{
Node *current = head;
Node *previous = head;
for (int i = position + 1; i > 0; i--)
{
if (!current->next)
return false;
previous = current;
current = current->next;
}
previous->next = new Node(&_data);
previous->next->next = current;
return true;
}
template <class T>
T *LinkedList<T>::get(int position)
{
Node *current = head;
for (int i = position + 1; i > 0; i--)
{
if (!current->next)
return NULL;
current = current->next;
}
return current->data;
}
template <class T>
bool LinkedList<T>::isEmpty()
{
if (head->next)
return false;
return true;
}
template <class T>
bool LinkedList<T>::remove(const T &_data)
{
Node *current = head;
Node *previous = current;
while (current->next)
{
previous = current;
current = current->next;
if (*(current->data) == _data)
{
previous->next = current->next;
return true;
}
}
return false;
}
template <class T>
int LinkedList<T>::positionOf(const T &_data)
{
Node *current = head;
unsigned int position = -1;
while (current->next)
{
current = current->next;
position++;
if (*(current->data) == _data)
return position;
}
return -1;
}
template <class T>
void LinkedList<T>::printAll()
{
Node *current = head;
while (current->next)
{
current = current->next;
cout << *(current->data) << " ";
}
cout << endl;
}
template <class T>
class LinkedList<T>::Node
{
public:
Node(T *_data) : data(_data) {}
T *data;
Node *next;
};
LinkedList.h:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
template <class T>
class LinkedList
{
public:
LinkedList();
void append(T &);
bool insert(T &, const int);
T *get(int);
bool isEmpty();
bool remove(const T &);
int positionOf(const T &);
void printAll();
private:
class Node;
Node *head;
};
#endif
当我用g++编译我的程序时,它编译成功并给出了预期的结果:
=====================================
Test for Integer LinkedList
Is List Empty? Yes
Array Loaded
Is List Empty? No
1 2 5 6 9 0 1
Insert 100 to position 3
1 2 5 100 6 9 0 1
Insert integer outside the List: Fail
Find the position of integre 9: 5
Find the position of not existed element: -1
The element at position 0 is 1
The element at position 7 is 1
The element at position 8 is 0
Deleting 100 from list: Sucess
1 2 5 6 9 0 1
Deleting not existed element from list: Fail
1 2 5 6 9 0 1
当我尝试用cl(VS2017)编译我的程序时,编译也成功了。但是,当我运行程序时,它会卡在某个点。运行结果:
=====================================
Test for Integer LinkedList
Is List Empty? No
后来,我尝试在 Visual Studio 中创建一个项目。令人惊讶的是,这一次,它运行没有任何问题。
如何正确使用cl 进行编译?如果你能给我一些提示,谢谢!我是 C++ 的新手。
顺便说一句。 cl生成的目标文件和可执行文件超过200KB,远大于g++生成的14KB左右。
【问题讨论】:
-
两个编译器给出不同的结果。这意味着(在几乎所有情况下)当你错误地使用某些东西时,你很幸运。审查你的程序,注意这一点。如果您需要这方面的帮助,您可能必须使您的 minimal reproducible example 更小。
-
完成对程序的审核后,您可以在此处继续其他有用的建议 ericlippert.com/2014/03/05/how-to-debug-small-programs
-
如果这样做没有帮助,请尝试拆分整个程序的各个部分并使其尽可能完美:ericlippert.com/2014/03/21/find-a-simpler-problem
-
请检查
Node构造函数并告诉我next的初始化位置。 -
关于using namespace std...
标签: c++ visual-studio compilation g++