我有一个代码,它似乎正在工作,但我无法获取存储在第一个和最后一个节点之间的链表中的值,其间的指针被跳过?并且取消引用这些跳过的指针给我一个段错误,这里是代码
#include<iostream>
#include <new>
using namespace std;
class list{
int value;
list* next;
public:
list(int a=0, list* b=0) {value=a;next=b;}
//~list() {delete next;}
void newnode(int a, list* tmp) {
tmp->next=new list;
tmp=tmp->next;
cout<<"Address of next: "<<tmp<<'\n';
tmp->value=a;
}
void printlist (list* regist){
list* tmp;
tmp=regist;
cout<<tmp->value<<'\n';
while(tmp->next != 0){
tmp=tmp->next;
cout<<tmp->value<<'\n';
cout<<"Address of next: "<<tmp<<'\n';
}
}
};
int main() {
int first;
cout<<"Enter value for origin: \n";
cin>>first;
list* root=new list(first);
list* tpo=root;
cout<<"How many numbers to add? \n";
int choice;
cin>>choice;
int num;
while(choice) {
cout<<"Enter value: \n";
cin>>num;
root->newnode(num, tpo);
choice--;
}
cout<<"Do you want me to show you these values, type 1 for yes and 0 for no: \n";
cin>>choice;
if(choice) {
root->printlist(root);
}
}
我做错了什么?
答案 0 :(得分:2)
您总是将root
提交给newnode(因为已分配给tpo
),导致列表中包含两个元素和一个任意数量的泄漏内存
答案 1 :(得分:2)
1)当您呼叫更多值时,您始终会覆盖列表中的第二个元素。您需要将newnode()
的签名更改为newnode(int a, list*& tmp)
。
稍后修改:另一种方式是拥有以下签名list* newnode(int a, list* tmp)
,并在功能结束时return tmp;
。然后,在主循环中你有tpo = root->newnode(num, tpo);
。这种方式tpo
始终指向下一个元素。
2)另外,为了释放内存list
的析构函数,不应该特别做任何事情。我会说你在类中创建了一个删除列表的静态方法。像这样:
public:
static void deleteList(list*& root)
{
list* tmp = root;
while (tmp)
{
tmp = root->next;
delete root;
root = NULL;
root = tmp;
}
};
并将其称为list::deleteList(root);
答案 2 :(得分:1)