正在尝试使用数组初始化链接列表



我需要定义链表的一个类list,这样类的对象可以用两种方式定义,

List obj1 = L1();//head=0

List obj2 = L2(given_arr[], size of array)//I将得到一个数组,其元素是列表的元素

所以,我需要形成一个解释两者,对于obj1,它很容易。List(){head=0};

但对于第二类对象,我不打算这么做。

我试着为此制定一个计划。


#include <iostream>
using namespace std;
class List {
class node {
public:
int val;
node* next;
};
public:
node* head;
int arr[];
List() { head = 0; }
List(int arr[], int size);
void addnode(int value) {
node* newnode = new node();
newnode->val = value;
newnode->next = NULL;
if (head == NULL) {
head = newnode;
} else {
node* temp = head;  // head is not NULL
while (temp->next != NULL) {
temp = temp->next;  // go to end of list
}
temp->next = newnode;  // linking to newnode
}
}
void display() {
if (head == NULL) {
cout << "List is empty!" << endl;
} else {
node* temp = head;
while (temp != NULL) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
}
}
};
List::List(int arr[], int size) {
int i;
head->val = arr[0];
for (i = 0; i < size; i++) addnode(arr[i]);
}
int main() {
int barr[4] = {9, 89, 0, 43};
List* M = new List();
List* L = new List(barr[4], 4);
L->display();
return 0;
}

这个程序不起作用。请建议一种方法。

main()进行这些更改。

int main() {
int barr[] = {9, 89, 0, 43};  // No need to specify size if you're initializing
// List* M = new List();      // unused
// Your array is barr, barr[4] makes no sense. You also don't allocate the List,
// the list allocates
List L = List(barr, sizeof(barr) / sizeof(barr[0]);
L.display();  // -> to .
return 0;
}

这现在可以编译,但会立即segfault。简单地在调试器中运行程序就会显示一个简单的错误。行head->val = arr[0];尝试取消引用空指针。这就把我们带到了下一件事上。使用nullptr,而不是NULL0

你的数组构造函数过于复杂,你只需要这个:

List::List(int arr[], int size) {
for (int i = 0; i < size; i++) addnode(arr[i]);
}

您的addnode()函数已经处理了一个空列表。解决这个问题,您的代码应该运行。我还做了一些其他的小改动,主要是把cruft去掉。这是您的完整代码:

#include <iostream>
using namespace std;
class List {
class node {
public:
int val;
node* next;
};
public:
node* head = nullptr;
List() = default;
List(int arr[], int size);
void addnode(int value) {
node* newnode = new node();
newnode->val = value;
newnode->next = NULL;
if (head == NULL) {
head = newnode;
} else {
node* temp = head;  // head is not NULL
while (temp->next != NULL) {
temp = temp->next;  // go to end of list
}
temp->next = newnode;  // linking to newnode
}
}
void display() {
if (head == NULL) {
cout << "List is empty!" << endl;
} else {
node* temp = head;
while (temp != NULL) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
}
}
};
List::List(int arr[], int size) {
for (int i = 0; i < size; i++) addnode(arr[i]);
}
int main() {
int barr[] = {9, 89, 0, 43};
List L = List(barr, sizeof(barr) / sizeof(barr[0]));
L.display();
return 0;
}

相关内容

  • 没有找到相关文章

最新更新