C++ 双向链表:使用矩阵类成员创建和填充列表
C++ Doubly Linked List: Creating and Filling List Using Matrix Class Member
晚上好,我正在尝试用我使用 Matrix 和 Dlist 类创建的矩阵填充双向链表。它可以编译和运行,但是当我尝试打印列表时,似乎没有正确链接。当我在 main 中调用打印函数时,它只是打印空白。为什么在make_list_util和make_list函数调用期间没有创建/保存我的列表?
我的预期输出应该是:
1 - 2 - 3 -|x (Null Ptr)
| | |
4 - 5 - 6 -|x (Null Ptr)
| | |
7 - 8 - 9 -|x (Null Ptr)
当我去打印时,我在IN PRINT:
后什么也得不到,并且在 while(dp({ 处出现分段错误。
dlist.h 文件:
node members:
int data;
node* next;
node* prev;
node* up;
node* down;
dlist members:
node* head;
node* tail;
int count;
从 dlist 到 make list 的函数调用:
dlist::dlist()
: head(NULL), tail(NULL), count(0) {}
dlist::node* dlist::make_list_util(matrix m, int row, int col, node* p) {
if (row >= 3 || 3 <= col) {
return NULL;
}
node* temp = new node(m(row, col));
temp->prev = p;
temp->up = p;
std::cout << "nIN MAKE LIST BEFORE RECCURSIVE NEXT: " << temp->data << std::endl; // the values are correct there
temp->next = make_list_util(m, row, col + 1, p); // Recursive next
std::cout << "nIN MAKE LIST BEFORE RECCURSIVE DOWN: " << temp->data << std::endl; // the values are correct there
temp->down = make_list_util(m, row + 1, col, p); // Recursive down
return temp;
}
dlist::node* dlist::make_list(matrix m) {
return make_list_util(m, 0, 0, NULL);
}
void dlist::print() {
// Make pointers: right pt, down pt
node *rp, *dp = head;
std::cout << "nIN PRINT: " << dp->data << std::endl;
while (dp) { // For some reason the loop won't initiate here
rp = dp;
while (rp) {
std::cout << rp->data;
rp = rp->next;
if (rp != NULL) {
std::cout << " - ";
}
else {
std::cout << " -|x NullPtr";
}
}
std::cout << "| | |n";
dp = dp->down;
}
}
主要功能代码:
int main() {
int row(0), col(0);
matrix m2(3,3);
dlist l;
m2 = { {1,2,3},{4,5,6},{7,8,9} };
l.make_list(m2);
l.print();
return 0;
}
基于发布的代码,递归调用函数的逻辑几乎没有问题。当行达到 2 时,它不会重置 col 值;尝试这样的事情(未经测试,用于 m 的参考(。你可以用这个代码替换你的代码。
dlist::node* dlist::make_list_util(matrix& m, /*int row, int col,*/ node* p) {
if (row >= 3 || 3 <= col) {
return NULL;
}
node* temp = new node(m(row, col));
if (p == NULL)
head = temp;
temp->prev = p;
temp->up = p;
std::cout << "nIN MAKE LIST BEFORE RECCURSIVE NEXT: " << temp->data << std::endl;
col++;
temp->next = make_list_util(m, /*row, col + 1,*/ temp); // Recursive next
std::cout << "nIN MAKE LIST BEFORE RECCURSIVE DOWN: " << temp->data << std::endl;
col = 0;
if (row < 2) {
row++;
temp->down = make_list_util(m, /*row + 1, col,*/ p); // Recursive down
}
return temp;
}
另请注意,对 l.make_list(m2( 的调用返回列表的头部,但您在调用 l.print(( 时没有使用它; 你可以试试这个
//l.make_list(m2);
l.print(l.make_list(m2) );
我还建议在函数调用中使用参数矩阵的引用,而不是按值使用它:
node* make_list_util(matrix&, /*int row, int col,*/ node* );
node* make_list(matrix& );
以避免构造它。不知道为什么对双向链表使用 4 个指针,因为每个节点两个就足够了。它们的使用可能也存在错误。调试器是您最好的朋友,可以找出未正确设置的内容。
相关文章:
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用成员在类中创建 lambda 表达式
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- C++ 双向链表:使用矩阵类成员创建和填充列表
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- 从类指针的向量创建成员变量的向量
- 根据模板参数条件 C++17 创建成员别名
- 为原始指针、智能指针和值创建成员函数的编译时变体
- C :如何声明std ::函数而无需创建成员函数以分配给它们
- VS2017 非标准语法。使用 ' &' 创建成员指针
- 根据C 中的变量值创建成员函数
- 在C++中创建成员函数模板专用化
- 如果成员对象是父类的一部分,则无法创建成员对象
- 如何通过元编程正确创建成员模板函数指针数组
- 需要帮助创建c++成员函数来表示任务与RTOS microcos III
- 在可变模板函数中创建成员函数指针元组
- 如何在实例和静态作用域之间创建成员变量
- 将使用typedef创建成员吗?
- 内部类——c++,内部类,以及为什么你只能创建成员作为指向它们的指针