Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何交换列表中的元素?_C_Algorithm_Data Structures - Fatal编程技术网

C 如何交换列表中的元素?

C 如何交换列表中的元素?,c,algorithm,data-structures,C,Algorithm,Data Structures,我正在努力学习自己的数据结构和算法。我用C写了我自己的双链表,现在我想写一些算法在这个链表上执行。交换列表项的首选方式是什么?交换内容还是重新排列指向下一个和上一个列表项的指针更好 重新排列指针。交换数据项可能会产生副作用。特别是,您可能已将对某个节点的引用存储在函数之外的某个位置,并且通常在重新排列列表中节点的顺序时,您不希望持有对某个节点的引用的人突然发现该节点指向新数据。这是因为通常节点的重要标识特征是它指向的数据,而不是它在列表中的位置。规范交换是通过指针重新排列完成的,没有副作用,当然

我正在努力学习自己的数据结构和算法。我用C写了我自己的双链表,现在我想写一些算法在这个链表上执行。交换列表项的首选方式是什么?交换内容还是重新排列指向下一个和上一个列表项的指针更好

重新排列指针。交换数据项可能会产生副作用。特别是,您可能已将对某个节点的引用存储在函数之外的某个位置,并且通常在重新排列列表中节点的顺序时,您不希望持有对某个节点的引用的人突然发现该节点指向新数据。这是因为通常节点的重要标识特征是它指向的数据,而不是它在列表中的位置。

规范交换是通过指针重新排列完成的,没有副作用,当然更快:

void swap (node *a, node *b) {
    node *tmp;

    tmp = a;
    a = b;
    b = tmp;
}

根据存储在链表元素中的内容的类型,交换元素的实际内容将是一件棘手的事情(例如,考虑不同长度字符串的链表)因此,交换指向下一个和上一个列表项的指针更容易。

取决于您如何分配内容


如果您正在存储指向内容的指针,那么切换内容并不是什么大问题。如果节点中有一个大的结构,那么切换指针可能比复制整个内容更有效。

我倾向于支持大多数人已经说过的话。一点背景知识可能会有所帮助:交换指针可以保证工作,而交换对象可能并不总是像看上去那么简单。想想可能会被创建的临时性的(和我的意思是一般的,而不是C++语言的特征方式)会发生,实际上把容器(列表)放在一个不希望的状态。在容器中寻找不变量——即交换应该保持列表大小不变,元素不变,并在其上进行设计

交换内容还是重新排列指向下一个和上一个列表项的指针更好

重新排列指针,因为交换节点的所有元素可能要昂贵得多

就时间复杂度而言,交换两个指针是恒定的操作

但是,如果要在两个节点之间交换所有元素,则需要访问所有元素,并将它们与对应的元素交换,即O(f),其中f是表示节点的结构具有的字段数(即节点具有的数据数)

换句话说,交换节点数据是一种线性操作,而交换两个指针是恒定的



交换数据可能会产生副作用,特别是当您可能在函数之外的某个位置存储了对节点的引用时,这已经包含在accepted中,但我也想指出这一事实

…但如果每个节点都知道其在链表中的位置,则这些位置不会随此交换而更改。如果每个节点都知道其位置,则可以轻松添加几行来更改这些位置。呃。。。这个代码到底应该做什么?它在一个函数中交换两个本地端口。该函数没有外部影响。重点是什么?我相信。很好的观察,这很有道理。非常感谢。