C++ 双向链表:使用矩阵类成员创建和填充列表

C++ Doubly Linked List: Creating and Filling List Using Matrix Class Member

本文关键字:创建 成员 填充 列表 双向链表 C++      更新时间:2023-10-16

晚上好,我正在尝试用我使用 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 个指针,因为每个节点两个就足够了。它们的使用可能也存在错误。调试器是您最好的朋友,可以找出未正确设置的内容。