插入排序链表c++
insertion sort linked list c++
我正试图编写一段代码来对包含整数的链表进行排序,但根据我用铅笔和纸计算出的推理,它并没有像我想象的那样起作用。它不是遍历列表,而是比较第一对值,删除列表中的第二个值,并返回列表的其余部分。我的方法代码是:
//typedef Node * ListType;
void insertionSort(ListType &list) {
ListType p = list;
Node * curr;
if(p == NULL || p->next == NULL){
return;
}
while(p != NULL){
curr = p->next;
if(curr == NULL){
break;
}
if(p->data > curr->data){
p->next = curr->next;
curr->next = p;
}
p = p->next;
}
}
例如,我从一个列表开始:5 2 3 4在这个列表上调用这个方法后,我得到的输出是:5 3 4
我对指针不太满意。感谢您的帮助!
如果使用指向指针的指针而不是指针,那么这种任务的效果会更好。如果新元素是单独传递的,而不是"预先插入"在列表的开头,效果也会更好。
但是,让我们继续使用您所拥有的,并且新节点被预先插入到列表的开头,并且您希望将其移动到正确的位置。
然后,它将是这样的:
#include <iostream>
class Node {
public:
Node *next;
int data;
};
typedef Node * ListType;
void insertionSort(ListType &list) {
ListType *p = &list;
while ( (*p)->next && (*p)->next->data < (*p)->data)
{
ListType node= *p;
*p=node->next;
node->next=node->next->next;
(*p)->next=node;
p= &(*p)->next;
}
}
int main()
{
Node *head=0;
int n;
while (std::cout << ">>> ", std::cin >> n)
{
Node *p=new Node;
p->data=n;
p->next=head;
head=p;
insertionSort(head);
for (p=head; p; p=p->next)
std::cout << p->data << " ";
std::cout << std::endl;
}
}
样本结果:
$ ./t
>>> 5
5
>>> 7
5 7
>>> 1
1 5 7
>>> 3
1 3 5 7
>>> 9
1 3 5 7 9
>>> 6
1 3 5 6 7 9
>>> 0
0 1 3 5 6 7 9
这里的技巧是,p
不是指向要插入的节点的指针,p
是指向要插入节点的指针的指针。因此,如果您需要将新节点进一步"推"到列表的下方,则"上一个"指针是*p
,您现在可以轻松更新它。
尽管一开始这看起来很混乱,但这远没有跟踪"上一个"节点那么混乱,您需要更新它的下一个指针。所有if
语句的发球都会完全消失。这就是所有困惑的来源。
此外,如果像我最初提到的那样,新节点是而不是预插入在列表的开头,并作为一个单独的指针传递,那么这将变得更容易理解。但是,那是你的起点,所以…
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 打印所有链表的元素 (C++)
- 错误:需要类名(链表c++)
- 为什么C中的通用链表中存储的数据已损坏
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 链表c++插入,所有情况都已检查,但没有任何工作
- 链表,将列表复制到另一个列表
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 对单向链表进行排序时出现运行时错误