在不使用内置排序方法的情况下在 C++ 中合并两个链表
Merge two Linked List In c++ without using inbuilt sort method
给你两个链表,其中一个已排序,另一个不是任务,你必须合并它们并对它们的值进行排序,同时在执行过程中进行比较,而不是分别对两个链表进行排序,并且也不使用 C++ 模板库中的任何内置方法。
我自己尝试过这个问题,但没有成功。我觉得是在if条件下接近无限循环条件了!
这是我所做的:
#include <iostream>
using namespace std;
struct Student {
int id;
Student *next = NULL;
};
Student *first = NULL;
Student *last = NULL;
Student *first2 = NULL;
Student *last2 = NULL;
void display(Student *k);
void insert_end(Student *k);
void merge();
int main() {
int exit = 1;
do {
cout << "11.Display, 12.Insert, 3.Merge\n";
cout << "21.Display, 22.Insert, 0:exit\n";
cin >> exit;
switch (exit) {
case 11:
display(first);
break;
case 12:
insert_end(last);
break;
case 3:
// first = mergeTwoLists(first, first2);
//merge();
Student* SortedMerge(Student* a, Student* b);
break;
case 21:
display(first2);
break;
case 22:
insert_end(last2);
break;
default:
cout << "WRONG\n";
break;
}
} while (exit != 0);
return 0;
}
void display(Student *k) {
Student *p = k;
while (p != NULL) {
cout << "ID: " << p->id << "\n";
p = p->next;
}
}
void insert_end(Student *k) {
cout << "This is the function of insert_end \n";
Student *current = new Student;
cout << "Enter ID: ";
cin >> current->id;
if (k == NULL) {
if (k == last) {
first = last = current;
} else {
first2 = last2 = current;
}
} else {
if (k == last) {
last->next = current;
last = current;
} else {
last2->next = current;
last2 = current;
}
}
}
void merge() {
Student *p1 = first;
Student *p2 = first2;
while (p1 != NULL) {
p2 = first2;
while (p2->next != NULL) {
if (p1->id <= p2->id) {
Student *curr = p2;
curr->next = p1->next;
p1->next = curr;
}
p2 = p2->next;
}
p1 = p1->next;
}
}
可能的优化解决方案是什么?
你需要先重写函数insert_end
。最初两个指针 last 和 last2 都是空指针
Student *first = NULL;
Student *last = NULL;
Student *first2 = NULL;
Student *last2 = NULL;
因此,如果用户首先决定填写第二个列表,那么由于这个 if 语句
if (k == NULL) {
if (k == last) {
first = last = current;
} else {
first2 = last2 = current;
}
}
该函数将在第一个列表而不是第二个列表中插入一个新节点。
函数merge
也是错误的。对于初学者来说,它既不改变 first
也不改变 first2
也不改变 last
和 last2
.
如果if语句
if (p1->id <= p2->id) {
Student *curr = p2;
curr->next = p1->next;
p1->next = curr;
}
授予控制权,然后指针 p2
的数据成员 next
由于这些行
而改变
Student *curr = p2;
curr->next = p1->next;
即第二个链表指针的数据成员next
指向第一个链表的结点
但是在 if 语句之后
p2 = p2->next;
指针p2
指向第一个列表中的节点,而不是指向第二个列表中的节点。
为了让生活更轻松,您需要再定义一个结构,例如
struct List
{
struct Student *first;
struct Student *last;
};
并为这种结构类型的指针定义函数。
给你两个链表,其中一个已排序,另一个不是任务,你必须合并它们并对它们的值进行排序,同时在执行过程中进行比较,而不是分别对两个链表进行排序,并且也不使用 C++ 模板库中的任何内置方法。
我自己尝试过这个问题,但没有成功。我觉得是在if条件下接近无限循环条件了!
这是我所做的:
#include <iostream>
using namespace std;
struct Student {
int id;
Student *next = NULL;
};
Student *first = NULL;
Student *last = NULL;
Student *first2 = NULL;
Student *last2 = NULL;
void display(Student *k);
void insert_end(Student *k);
void merge();
int main() {
int exit = 1;
do {
cout << "11.Display, 12.Insert, 3.Merge\n";
cout << "21.Display, 22.Insert, 0:exit\n";
cin >> exit;
switch (exit) {
case 11:
display(first);
break;
case 12:
insert_end(last);
break;
case 3:
// first = mergeTwoLists(first, first2);
//merge();
Student* SortedMerge(Student* a, Student* b);
break;
case 21:
display(first2);
break;
case 22:
insert_end(last2);
break;
default:
cout << "WRONG\n";
break;
}
} while (exit != 0);
return 0;
}
void display(Student *k) {
Student *p = k;
while (p != NULL) {
cout << "ID: " << p->id << "\n";
p = p->next;
}
}
void insert_end(Student *k) {
cout << "This is the function of insert_end \n";
Student *current = new Student;
cout << "Enter ID: ";
cin >> current->id;
if (k == NULL) {
if (k == last) {
first = last = current;
} else {
first2 = last2 = current;
}
} else {
if (k == last) {
last->next = current;
last = current;
} else {
last2->next = current;
last2 = current;
}
}
}
void merge() {
Student *p1 = first;
Student *p2 = first2;
while (p1 != NULL) {
p2 = first2;
while (p2->next != NULL) {
if (p1->id <= p2->id) {
Student *curr = p2;
curr->next = p1->next;
p1->next = curr;
}
p2 = p2->next;
}
p1 = p1->next;
}
}
可能的优化解决方案是什么?
你需要先重写函数insert_end
。最初两个指针 last 和 last2 都是空指针
Student *first = NULL;
Student *last = NULL;
Student *first2 = NULL;
Student *last2 = NULL;
因此,如果用户首先决定填写第二个列表,那么由于这个 if 语句
if (k == NULL) {
if (k == last) {
first = last = current;
} else {
first2 = last2 = current;
}
}
该函数将在第一个列表而不是第二个列表中插入一个新节点。
函数merge
也是错误的。对于初学者来说,它既不改变 first
也不改变 first2
也不改变 last
和 last2
.
如果if语句
if (p1->id <= p2->id) {
Student *curr = p2;
curr->next = p1->next;
p1->next = curr;
}
授予控制权,然后指针 p2
的数据成员 next
由于这些行
Student *curr = p2;
curr->next = p1->next;
即第二个链表指针的数据成员next
指向第一个链表的结点
但是在 if 语句之后
p2 = p2->next;
指针p2
指向第一个列表中的节点,而不是指向第二个列表中的节点。
为了让生活更轻松,您需要再定义一个结构,例如
struct List
{
struct Student *first;
struct Student *last;
};
并为这种结构类型的指针定义函数。