我目前正在处理未分类的链表检查,下面是我的规范和实现。
规格:
#ifndef UNSORTEDLIST_H
#define UNSORTEDLIST_H
#include <iostream>
using namespace std;
struct Node {
float element;
Node* next;
};
class UnsortedList
{
public:
UnsortedList();
bool IsEmpty();
bool IsFull();
void ResetList();
void MakeEmpty();
int LengthIs();
bool IsInTheList(float item);
void InsertItem(float item);
void DeleteItem(float item);
float GetNextItem();
private:
Node* data;
Node* currentPos;
int length;
};
#endif
实施:
UnsortedList::UnsortedList()
{
length = 0;
data = NULL;
currentPos = NULL;
}
bool UnsortedList:: IsEmpty(){
if(length == 0)
{
return true;
}
else
{
return false;
}
}
bool UnsortedList::IsFull(){
Node* ptr = new Node();
if(ptr == NULL)
return true;
else
{
delete ptr;
return false;
}
}
void UnsortedList::ResetList(){
currentPos = NULL;
}
void UnsortedList::MakeEmpty()
{
Node* tempPtr = new Node();
while(data != NULL)
{
tempPtr = data;
data = data->next;
delete tempPtr;
}
length = 0;
}
int UnsortedList::LengthIs(){
return length;
}
bool UnsortedList:: IsInTheList(float item){
Node* location = new Node();
location = data;
bool found = false;
while(location != NULL && !found)
{
if(item == location->element)
found = true;
else
location = location->next;
}
return found;
}
void UnsortedList:: InsertItem(float item){
Node* location = new Node();
location->element = item;
location->next=data;
data = location;
length++;
}
void UnsortedList:: DeleteItem(float item){
Node* location = data;
Node* tempPtr;
if(item == data->element){
tempPtr = location;
data = data->next;
}
else{
while(!(item == (location->next) ->element) )
location = location->next;
tempPtr = location->next;
location->next = (location->next)->next;
}
delete tempPtr;
length--;
}
float UnsortedList::GetNextItem(){
if(currentPos == NULL)
currentPos = data;
else
currentPos = currentPos->next;
return currentPos->element;
}
1.在构造函数中,为什么不将currentPos赋值为null? 2.在IsInTheList函数中,为什么指向指针“next”?下一个是否为空指针,因为它已在struct中声明为Node * next?
答案 0 :(得分:0)
默认情况下,指针值未设置为NULL值,您应该显式设置为null。而不是使用NULL,选择使用nullptr。
答案 1 :(得分:0)
此代码相当不完整,因此很难回答您的问题。
这不包含在列表中插入项的代码,这是我希望设置next和currentPos指针的地方。但是,这是基于许多假设。
但是,我根本没有看到“检查完整功能”中使用的是哪个,所以这个问题有点令人困惑。
我还要指出这段代码有一个明显的内存泄漏。 IsInTheList中的第一行为新节点分配内存,该节点立即丢失location = data
。
答案 2 :(得分:0)
指针(与任何其他基本类型一样)需要在使用前进行初始化。 NULL值仍然是一个值。
您提供的代码似乎非常不完整。 data
应该是你名单的负责人吗?我不确定你如何定义“丰满”。如果要测试列表是否为空,则可以查看列表的“头部”是否为空:
bool UnsortedList::IsEmpty() {
if (data == NULL) {return true;} // if there is no first element, empty
else {return false;} // if there is ANY element, not empty
}
或更紧凑:
bool UnsortedList::Empty() {
return (data == NULL);
}
当一个节点被添加到一个链表时,我们通常会添加整个节点并修改它之前的元素。例如,我们可能会创建一个新节点并使用以下代码添加它:
// implementation file
void UnsortedList::InsertItem(const float& item) {
if (data == NULL) { // no elements in list, so new node becomes the head
data = new Node; // allocate memory for new node
data->element = item; // fill with requested data
data->next = NULL; // there is no element after the tail
}
else {
new_node = new Node; // allocate memory
new_node->element = item // set data
new_node->next = NULL; // new end of the list, so it points to nothing
tail->next = new_node; // have the OLD end node point to the NEW end
tail = new_node; // have the tail member variable move up
}
}
// driver file
int main() {
UnsortedList my_list;
float pie = 3.14159;
my_list.AddNode(pie);
return 0;
}
请注意,我使用了名为tail的Node *成员变量。跟踪列表开始和结束的位置是个好主意。
在IsFull
函数中,它始终返回false,因为它始终可以创建新的Node *。除非您的内存耗尽,否则可能会出现更多问题。
你的函数相当混乱,你的指针工作会留下许多内存泄漏。您可能想要查看STL列表对象设计here。