gpt4 book ai didi

c++ - 复制链接列表会使程序崩溃

转载 作者:行者123 更新时间:2023-11-30 04:05:40 24 4
gpt4 key购买 nike

我有链接列表代码,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 的成员。它仅在某些函数中作为函数变量有用。

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

    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 假设哪个是有效指针,哪个不是,如果您开始使用 to from 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;
    }
    }

关于c++ - 复制链接列表会使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23190508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com