崩溃,同时打印链表的内容

时间:2010-01-25 20:23:01

标签: c++ linked-list

我在打印链表的内容时遇到了一些麻烦。我正在使用我在某处找到的示例代码。我做了一点编辑,但我不认为这就是崩溃的原因。

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

4 个答案:

答案 0 :(得分:3)

在节点中,添加一个构造函数以在null

旁边进行初始化

答案 1 :(得分:0)

最初head->tail时,您未正确初始化head==NULL

答案 2 :(得分:0)

正确。这是因为在最初创建链表时,tail在代码中仅为NULL。添加节点后,设置tail = head,从那个时间点开始,每次添加元素时,设置tail-&gt; next = new node,然后tail = tail-&gt; next ... so尾巴 - >下一个总是=尾巴。

答案 3 :(得分:0)

正如@rmn指出的那样,你没有初始化node-&gt;的值。

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;