我有链表代码,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);
}

最佳答案

改进建议:

  • 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开始使用to,则将不成立。可以简化为:
    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;
      }
    }
    
  • 08-16 07:56