c++ - 通过移动链表中的节点进行冒泡排序(C++)
问题描述
我通过比较节点中的值然后移动节点来对链表进行冒泡排序,但是我的函数存在问题。当我运行我的代码时,它可以很好地创建节点,但是当bubblesort()函数运行时,它会抛出一个异常并显示“ p2 was nullptr ”。我不知道我的代码有什么问题,任何帮助将不胜感激。
这是我的代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
class Node {
public:
int number;
Node* next;
};
class LinkedList {
Node* head;
Node* tail;
public:
LinkedList() {
head = NULL;
tail = NULL;
}
void createnode(int num) {
Node* temp = new Node;
temp->number = num;
temp->next = NULL;
if (head == NULL) {
head = temp;
tail = temp;
}
else {
tail->next = temp;
tail = temp;
}
}
void bubblesort(int size) {
Node* temp;
int i, j, swapped;
for (i = 0; i <= size; i++){
temp = head;
swapped = 0;
for (j = 0; j < size - i - 1; j++){
Node* p1 = temp;
Node* p2 = p1->next;
if (p1->number > p2->number){
Node* temp1 = p2->next;
p2->next = p1;
p1->next = temp1;
temp = p2;
swapped = 1;
}
temp = temp->next;
}
if (swapped == 0)
break;
}
}
void displaynodes() {
Node* temp;
temp = head;
while (temp != NULL) {
cout << temp->number << " ";
temp = temp->next;
}
cout << endl;
}
};
int main() {
LinkedList l;
int size, num;
cout << "How many Numbers Do You Want to Store: ";
cin >> size;
for (int i = 0; i < size; i++) {
cout << "Enter Number " << i+1 << ": ";
cin >> num;
l.createnode(num);
}
system("CLS");
cout << "Data Of Nodes Before Bubble Sort: " << endl;
l.displaynodes();
l.bubblesort(size);
cout << "Data Of Nodes After Bubble Sort: " << endl;
l.displaynodes();
system("pause");
}
解决方案
你有很多不好的编码习惯using namespace std;
,比如不好的命名风格和使用Null
而不是nullptr
.
但是错误出现在排序片段中。您正在尝试交换节点,但如果不使用当前节点之前的节点或使用双向链表,您将无法做到这一点。所以在下面的代码中,我交换了数字而不是节点。
void bubblesort(int size) {
int i, j, swapped = 1;
for (i = 0; swapped && i < size; i++){
swapped = 0;
Node* temp = head;
for (j = 0; j < size - i - 1; j++){
if (temp->number > temp -> next ->number){
int tempNumber = temp -> number;
temp -> number = temp -> next -> number;
temp -> next -> number = tempNumber;
swapped = 1;
}
temp = temp->next;
}
}
}
推荐阅读
- c# - 如何使用证书将 curl 命令传输到 C# HttpClient
- java - 如何将两组花车与另外两组花车进行比较?
- powershell - 在 powershell 中使用 select-string 后如何找到子字符串?
- typescript - 标记的元组与正常元组的行为不同
- reactjs - 如何为 ForwardRefExoticComponent 添加静态道具类型
- css - Material UI TextField Lable 空间不足
- python - Jupyter 内核在导入 Numpy 或 Pandas 等任何内容时不断重启
- kubernetes - Kubernetes Ingress - 仅将子路径传递给后端,而不是完整路径
- sharepoint - 为什么更改语言后我的图像不从右到左?
- c++ - 在 C++ 中同时启动所有线程