未排序的链表实现检查已满

时间:2013-05-20 20:14:20

标签: c++ linked-list

我目前正在处理未分类的链表检查,下面是我的规范和实现。

规格:

#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?

3 个答案:

答案 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