帮助C ++中的双向链表

时间:2011-05-21 00:56:10

标签: c++ pointers linked-list double

所以我在解决这个问题时遇到了一些麻烦。 我创建了一个名为dlist的双向链表(包含一个linknode助手类)。我有另一个名为DeckOps的类,它与链表一起使用。 dlist已经包含insertFront,removeFront,insertRear,removeRear和print函数的函数。目前,我将文件传递给DeckOps,然后读取文件,在列表的每个链接节点中输入一个int(从后面输入以保持与文件中相同的顺序)。

现在我的问题,我需要能够在列表中找到一个数字,所以我假设我需要一个find函数。然后我需要能够选择数字下方的所有内容并将其与数字上方的所有内容交换。我认为一个单独的交换功能会很好吗? 我的主要问题是如何选择一个组并与另一个组交换。

感谢

例如: 1 2 3 4 5 6 7 8 9找到6找到4交换6以下的所有东西,一切都在4以上 7 8 9 4 5 6 1 2 3结果 编辑: 刚刚写出来的这个例子是程序需要知道我搜索的数字是否更靠近顶部或底部。

不寻求解决方案,只是一些帮助。

2 个答案:

答案 0 :(得分:0)

如果我正确地解释了“交换”的含义,则需要实现list splicing。您可以将开头的范围移动到新列表,然后将其移回原始列表的末尾,也可以一次完成所有操作。后者只是稍微复杂一些,主要是在插入点不在要移动范围内的前提条件下。

Example with std::list

int main() {
  std::list<int> L;
  for (int n = 0; n != 10; ++n) L.push_back(n);
  std::list<int>::iterator x = std::find(L.begin(), L.end(), 6);
  assert(x != L.end());  // We know this is true in this example.

  std::list<int> temp;
  temp.splice(temp.end(), L, L.begin(), x);
  temp.splice(temp.begin(), L, x);
  L.splice(L.end(), temp);

  std::copy(L.begin(), L.end(), std::ostream_iterator<int>(std::cout, ", "));

  return 0;
}

输出:

  7, 8, 9, 6, 0, 1, 2, 3, 4, 5, 
# ^-----^     ^--------------^
#   \... swapped with .../

答案 1 :(得分:0)

只是好奇...有没有理由不使用STL容器类?

你真的需要重新发明轮子吗?您是否有要求认为STL无法处理?你认为你可以比STL“更好”编码吗?您是否可能编写嵌入式设备或不支持STL的模糊处理器?

即使不是STL,你还考虑过Boost ++吗?

你可能在这里提出了错误的问题......也许你应该问自己是否可以从你的其他开发中腾出时间来重新发明轮子。