所以我当然看了很多链接列表帮助,但我似乎无法弄清楚我的错误。我想我理解其他代码的逻辑,但有些东西与我的有关,我无法正常工作。
功能代码:
void SparseM_list::newTerm(valueType newValue, int row, int column)
MatrixTerm *n = new MatrixTerm;
n->next = NULL;
n->column = column;
n->row = row;
n->value = newValue;
if (head != NULL)
{
cur = head;
while (cur->next != NULL)
{
cur = cur->next;
cout << "does it ever get inside the while loop? cur and curnext -> " << cur << " " << cur->next << endl; <-- never outputs
}
cur->next = n;
}
else //if head is null, n will be the starting point
{
head = n;
}
delete n;
}
及以下是使用链表
的稀疏矩阵的私有结构/变量struct MatrixTerm {
valueType value; //store value of matrix element
int column; //store column position
int row; //store row position
MatrixTerm *next; //point to next node in the linked list
};
MatrixTerm *head; //head point for the linked list
MatrixTerm *cur, *prev;
所以基本上我的逻辑就是这个
但是,它永远不会进入while循环。我搞砸了哪里? while循环用于遍历链表。
答案 0 :(得分:1)
本声明
delete n;
没有意义。删除它。
我希望最初数据成员head
确实设置为NULL
(或nullptr
)。
该函数的替代实现可能看起来像
void SparseM_list::newTerm(valueType newValue, int row, int column)
{
MatrixTerm *n = new MatrixTerm { newValue, column, row, nullptr };
MatrixTerm **current = &head;
while ( *current ) current = &( *current )->next;
*current = n;
}
如果列表允许附加新节点,则再声明一个数据成员tail
会很有帮助。在这种情况下,将在尾部添加一个新节点,每次执行循环时效率更高。
还要考虑删除数据成员cur
和prev
,并将它们用作方法的局部变量。
答案 1 :(得分:0)
您不应该delete n;
,因为它会释放列表节点的内存。你看,你把钥匙锁上锁,但在打开门之前拔出钥匙......你能进屋吗?
ps,删除应该保存在列表对象的desturctor中的节点。