我试图找出确定单链表是否为空的最佳和最简单的方法。
我需要创建一个布尔方法吗?
由于
阅读方法
void List :: Read(istream& r) {
char c[13];
r >> c;
r >> numberOfInts;
Node *node = new Node();
for(int i = 0; i < numberOfInts; i++)
{
r >> node->data;
cout << node->data << endl;
node->next = new Node;
//node = node->next;
head = node;
}
}
else
{
if(node->data > head->data)
{
head->next;
}
else if(node->data < head->data)
{
Node* tempNode;
tempNode = head;
head->data = node->data;
node->data = tempNode->data;
}
}
system("pause");
}
标头文件
class Node
{
public:
Node() {}
Node(int d, Node* q = 0) : data(d), next(q) {} //constructor with parameters data and next
int data; //holds data in node
Node* next;//pointer to next node
};
class List
{
public:
void Read(istream&);
void Write(ostream&);
void setReadSort(bool);
void sortOwn();
void insertionSort(Node*);
bool isEmpty();
bool _sortRead;
int numberOfInts;
List(void);
~List(void);
protected:
Node *head;
Node current;
};
答案 0 :(得分:2)
这完全取决于实施。但是,通常可以通过检查第一个节点是否存在/具有内容/等来快速完成。
答案 1 :(得分:0)
是。原因是:有时我们使用迭代器来插入元素,处理迭代器上元素的数量会非常不舒服(或不可能)。这就是为什么许多STL实现具有size_t size(void)
函数的线性时间的原因。 bool empty(void)
是检查列表是否为空并且具有恒定时间的有效方法。
请注意:当您使用STL时,请使用bool empty(void)
来对抗size_t size(void)
。更多信息请参阅:Meyers: Effective STL。
功能很简单:
bool empty( void ) const
{
return ( this->begin() == this->end() );
}
在你的情况下:
bool empty( void ) const
{
return ( this->head == 0 );
}
答案 2 :(得分:0)
我没有对此进行测试,但它应该有效。
[edit]将程序更改为占用始终存在的头部。
[edit]将程序更改为类的帐户,而不是结构
bool isEmpty(){return (this->head == NULL)};
这将提供更合适的结果
还有一件事,我看到你正在使用系统(“暂停”);我知道这是家庭作业,但这是非常糟糕的做法。更好的方法是先在stdin中清除缓冲区(如果需要),然后忽略一个字符。一个例子是:
cin >> somenumber; // Extract a number (assuming its safe)
cin.ignore(1, 10); // Ignore 1 character, or a newline, whichever comes first
// ^ this clears the buffer, it does NOT wait for input since
// the formatted extraction left a character in the buffer ('\n')
cin.ignore(); // Essentially the same as above, but since there is nothing in
// the buffer, it reads a single character from stdin