Сбой при печати содержимого связанного списка

У меня возникли проблемы с распечаткой содержимого связанного списка. Я использую пример кода, который я где-то нашел. Я немного отредактировал его, но я не думаю, что он падает из-за этого.

class stringlist 
{
  struct node 
  {
    std::string data;
    node* next;
  };
  node* head;
  node* tail;
public:
  BOOLEAN append(std::string newdata)
  {
      if (head)
      {
          tail->next = new node;
          if (tail->next != NULL)
          {
              tail=tail->next;
              tail->data = newdata;
              return TRUE;
          }
          else
              return FALSE;
      }
      else
      {
          head = new node;
          if (head != NULL)
          {
              tail = head;
              head->data = newdata;
              return TRUE;
          }
          else
              return FALSE;
      }
  }
  BOOLEAN clear(std::string deldata)
  {
      node* temp1 = head;
      node* temp2 = NULL;
      BOOLEAN result = FALSE;
      while (temp1 != NULL)
      {
          if (temp1->data == deldata)
          {
              if (temp1 == head)
                  head=temp1->next;
              if (temp1==tail)
                  tail = temp2;
              if (temp2 != NULL)
                  temp2->next = temp1->next;
              delete temp1;
              if (temp2 == NULL)
                  temp1 = head;
              else
                  temp1 = temp2->next;
              result = TRUE;
          }
          else // temp1->data != deldata
          {
              temp2 = temp1;
              temp1 = temp1->next;
          }
      }
      return result;
  }
  BOOLEAN exists(std::string finddata)
  {
      node* temp = head;
      BOOLEAN found = FALSE;
      while (temp != NULL && !found)
      {
          if (temp->data == finddata)
              found=true;
          else
              temp = temp->next;
      }
      return found;
  }
  void print()
  {
      node* tmp = head;
      while (tmp)
      {
          printf("%s", tmp->data.c_str());
          tmp = tmp->next;
      }
  }
  stringlist()
  {
      head=NULL;
      tail=NULL;      
  }
};

Моя функция main() действительно проста:

int main()
{
stringlist mylist;
  if (mylist.append("something"))
      count++;
  if (mylist.append("else"))
      count++;
  if (mylist.append("yet"))
      count++;
  cout<<"Added "<<count<<" items\n";
  mylist.print();
return 0;
}

По какой-то причине в Print() tmp никогда не бывает NULL


person zukeh    schedule 25.01.2010    source источник
comment
Похоже, это для вашего собственного обучения (или, может быть, домашнее задание), но просто чтобы вы знали: STL уже предоставляет реализацию связанного списка в ‹list›. Взгляните на класс списка.   -  person John Dibling    schedule 25.01.2010


Ответы (4)


Как указал @rmn, вы не инициализируете значение node- > next.

BOOLEAN append(std::string newdata) 
{ 
  if (head) 
  { 
    tail->next = new node; 
    if (tail->next != NULL) 
    { 
      tail=tail->next; 
      tail->data = newdata; 
      tail->next = NULL; // <- this is the part that is missing
      return TRUE; 
    }
    else 
      return FALSE; 
  }
  else 
  { 
    head = new node; 
    if (head != NULL) 
    { 
      tail = head; 
      head->data = newdata;
      head->next = NULL; // <- it's also missing here.
      return TRUE; 
    } 
    else 
      return FALSE; 
  } 
} 

Вы можете решить эту проблему, используя конструктор по умолчанию для узла:

struct node   
{  
  std::string data;  
  node* next;

  node() : next(NULL) { }
};

С конструктором по умолчанию вам не нужно будет добавлять tail->next = NULL;.

person Bill    schedule 25.01.2010

в узле добавьте конструктор для инициализации рядом с нулем

person rmn    schedule 25.01.2010

Вы неправильно инициализируете head->tail в добавлении, когда head==NULL изначально.

person MSN    schedule 25.01.2010
comment
он есть, после проверки того, что head = new не является нулевым - person rmn; 25.01.2010
comment
Гм.. он никогда не инициализирует (любой узел)-›хвост нигде. - person MSN; 26.01.2010

Правильный. Это потому, что tail имеет значение NULL в вашем коде при первоначальном создании связанного списка. После добавления узла вы устанавливаете tail = head, и с этого момента каждый раз, когда вы добавляете элемент, вы устанавливаете tail->next = новый узел, а затем tail = tail->next... так что хвост -> следующий всегда = хвост.

person Nick    schedule 25.01.2010