在双链表上进行操作时,您应该记住什么?

时间:2015-12-04 20:39:54

标签: c++ data-structures

例如,我的讲师说了一些关于没有释放任何内存的事情,并在使用链接列表进行操作时删除了指针。此外,他说,在双向链接列表上进行操作时,您应确保边缘情况正常。任何人都可以扩展这个吗?我不确定自己能得到什么。

例如,这是我们正在处理的那种链表:

UPDATE 
    DB1.myTable t1
INNER JOIN 
    DB1.table2 t2 on t1.col1table1 = t2.col1table2
SET 
    t1.col2table1 = t2.col2table2
WHERE 
    (t2.col3table2 = 'somevalue')

3 个答案:

答案 0 :(得分:3)

在处理指针时,您始终要确保delete任何不再使用的new个对象。这样就没有任何内存泄漏。

边缘条件是,例如,当插入元素时,它是否适用于空列表,当项目作为第一个元素插入时,作为最后一个元素?通常,在实现插入时,我们为典型元素(即现有列表中间的元素)执行逻辑。但它应该适用于所有情况。我提到的案例可以被视为边缘条件,并且必须考虑每个要为列表实现的操作。

答案 1 :(得分:0)

由于您使用的是'struct'而不是'class',因此为每个节点实现一些操作函数。

更新: 我提到class,因为我评论的函数通常在面向对象的链接列表中实现为对象'方法, 但这些操作也适用于程序编程。

示例:

struct Node {
        Node *next;
        Node *prev;
        T datum;
    };

Node *first;   // points to first Node in list, or 0 if list is empty
Node *last;    // points to last Node in list, or 0 if list is empty

void NodesLink(Node* A, Node* B)
{
  if ((A != NULL) && (B != NULL))
  {
     A->next = B;
     B->prev = A;
  }
} // void NodesLink (...)

void NodesInsertAfter(Node* A, Node* NewNode)
{
  if ((A != NULL) && (NewNode != NULL))
  {
     Node* B = A->next;
     NodesLink(A, NewNode);
     NodesLink(NewNode, B);
  }
} // void NodesLink (...)

独立的实用程序功能将使您的代码更加一致,并且易于调试和修复。

答案 2 :(得分:0)

一些边缘情况可能是
 (a)没有节点
(b)只有一个节点
(c)在头/尾添加节点
(d)在遍历列表时避免无限循环
(e)避免内存泄漏和悬空指针

这些是应该进行的基本检查。