复制链接列表会导致程序崩溃

时间:2014-04-21 03:46:52

标签: c++ linked-list copy nodes

我有链接列表代码,Copy_List函数崩溃了程序并且无法工作:它没有语法错误,所以它是合乎逻辑的。我不确定确切的问题在哪里,所以任何帮助都将不胜感激。

以下是代码:

#include <iostream>
using namespace std;

struct node{
   int info;
   node *link;
};


class Linked_List{
   private :

   int count;
   node *first;
   node *last;
   node *current;

   public:


   Linked_List() {

      count=0;
      first=NULL;
      last=NULL;
   }

   void Initialize_List(){

      cout<<"Enter Number OF Nodes"<<endl;
      cin>>count;

      first=last=current=new node;

      for(int i =0;i<count;i++){
         cout<<"Enter New Node Info :"<<endl;
         cin>>current->info;
         last->link=current;
         last=current;
         current=new node;
      }

      last->link=NULL;
   }

   bool Is_Empty(){
      if(first==NULL)
      {
         return true;
      }
      else{
         return false;
      }
   }

   int Front () {
      if (first != NULL)

      return first-> info; 
      else return 0;
   }

   int Back () {

      if (last != NULL)
      return last-> info;
      else return 0; 
   }

   void Insert_Last(int x){

      count++;
      current=new node;
      current->info=x;

      last->link=current;

      last=current;
      last->link=NULL;

      if(first==NULL)

      first=current;
   }

   void Delete_First(){

      if(!Is_Empty())  // Or if(first==NULL)
      { 

         node *p;
         p=first;
         first=first->link;
         delete p;
         count --;
         if(count==0)
            first=last=NULL;
      }
   }

  friend void Copy_List (Linked_List &n,Linked_List &m);

};

void Copy_List (Linked_List &n,Linked_List &m){

   Linked_List temp;
   while(!n.Is_Empty()){
      temp.Insert_Last(n.Front());
      n.Delete_First(); 
   }
   while (!temp.Is_Empty()) {

      n.Insert_Last(temp.Front());
      temp.Delete_First(); 
   }
}


void main (){
   Linked_List obj,obj2;
   cout<<"Is the list empty ?"<<"  "<<boolalpha<<obj.Is_Empty(); cout<<endl;
   obj.Initialize_List();
   cout<<"Is the list empty ?"<<"  "<<boolalpha<<obj.Is_Empty(); cout<<endl;
   Copy_List (obj,obj2);   
}

2 个答案:

答案 0 :(得分:1)

在新列表中last指针未首先初始化:

void Insert_Last(int x) {
   ...
   last->link=current;   // for the new List last should be initialized 
   last = current;
   last->link=NULL;

假定更改 - 删除行last->link=current;

   last = current;
   last->link=NULL; 

答案 1 :(得分:1)

改进建议:

  • node添加默认构造函数,以便在构造时正确初始化。

    struct node{
        node(int in = 0) : info(in), link(NULL) {}
       int info;
       node *link;
    };
    
  • 您不需要current作为Linked_List的成员。它仅作为函数变量在某些函数中有用。

  • 使用Initialize_List()实施Insert_Last。这使功能更清洁。它还避免了冗余代码。

    void Initialize_List(){
      cout<<"Enter Number OF Nodes"<<endl;
      int num;
      cin>>num;
    
      for(int i =0;i<num;i++){
         cout<<"Enter New Node Info :"<<endl;
         int info;
         cin >> info;
         this->Insert_Last(info);
      }
    }
    
  • Insert_Last假设哪个是有效指针而哪个不是,如果您从Initialize_List开始使用,则不会成立。它可以简化为:

    void Insert_Last(int x){
      count++;
      node* current=new node;
      current->info=x;
    
      if ( first == NULL )
      {
         first = last = current;
      }
      else
      {
         last->link=current;
         last=current;
      }
    }
    
  • 您发布的Copy_List的实现删除了第一个参数中的所有项目,并将它们放在第二个参数中。我不确定那是不是目的。如果要保持第一个参数的内容不变并希望将其内容复制到第二个参数,则需要另一种方法。这就是我想出的:

    void Copy_List (Linked_List &n,Linked_List &m){
    
       Linked_List temp;
       node* current = n.first;
       for ( ; current != NULL; current = current->link )
       {
          temp.Insert_Last(current->info);
       }
    
       current = temp.first;
       for ( ; current != NULL; current = current->link )
       {
          m.Insert_Last(current->info);
       }
    }
    
  • 您在Linked_List中没有析构函数。编译器提供的默认实现不会释放该类分配的内存。为了释放由类分配的内存,您需要实现析构函数。

    ~Linked_List() {
      node* current=first;
      while ( current != NULL )
      {
         node* temp = current->link;
         delete current;
         current = temp;
      }
    }