例如,我的讲师说过,在使用链表进行操作时,不要释放任何内存,并删除指针。此外,他说,在对双向链表进行操作时,应该确保边缘情况是正确的。有没有人可以对此进行扩展?我不确定我完全明白他的意思。
例如,这是我们正在处理的链表类型:
 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发布于 2015-12-05 04:45:12
在处理指针时,您总是希望确保delete任何不再使用的new对象。这样就不会有任何内存泄漏了。
边缘条件是,例如,当插入元素时,它是否适用于空列表,当项目将作为第一个元素插入时,作为最后一个元素插入时?通常,在实现insert时,我们对典型元素(即现有列表中间的元素)执行逻辑。但它应该适用于所有情况。我提到的情况可以被认为是边缘条件,并且必须考虑到您想要为列表实现的每个操作。
发布于 2015-12-05 04:59:50
由于您使用的是“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 (...)独立的实用函数将使您的代码更加一致,并且易于调试和修复。
发布于 2015-12-06 04:39:07
一些边缘情况可能是
(a)无节点
(b)只有一个节点
(c)在头部/尾部添加节点
(d)避免遍历列表时出现无限循环
(e)避免内存泄漏和悬空指针
这些是应该进行的基本检查。
https://stackoverflow.com/questions/34097032
复制相似问题