C++链表排序、拆分和打印问题
大家好,本周我的实验任务是学习链表。实验室提示如下: 编写一个程序,创建一个至少包含20个元素的前向链表,其中每个元素包含一个0到99之间的随机整数。打印列表 编写函数returnMiddleList,一次查找链表的中间元素。打印此元素的整数值以及此元素相对于头部(其中头部=0)、头部指向的元素=1、上一个头部指向的元素=2等的位置(从零开始) 在中间元素将列表一分为二,以创建两个大小几乎相等+/-1的完全独立的*链接列表,并打印这两个列表。修改returnMiddleList函数以完成此操作,返回第二个链表的头,并将指向该头的元素的链接设置为null。然后打印存储在两个列表元素中的两个整数之和 将两个列表从最小到最大排序并打印出来。根据所采用的排序方法,此步骤中的打印是可选的。然后将这两个列表合并,同时再次从最小到最大排序,并打印出新列表。提示:在对前两个未排序的列表进行排序和组合之前,可以进一步细分列表,并按一到两个元素列表的比例对其进行排序。这种叫什么 我有1和2工作,但3和4是问题的开始。当我把我的链接列表分成两个列表并打印出单独的列表时,我的第一个链接列表打印出9个数字,当它应该打印出10个数字时,第10个数字不知怎的消失了?但是当我对第一个列表进行求和时,消失的数字会被加到总和中!我不知道为什么它正在消失,这是一个问题。另一个问题是在第二个列表中,一个随机的0被添加到列表中,其中一个数字丢失。我的最后一个问题是关于4,因为我使用的合并算法似乎不起作用,我在排序时将列表合并在一起,但我没有使用递归排序,因为我们还没有了解到这一点。任何意见和帮助都将不胜感激!谢谢C++链表排序、拆分和打印问题,c++,sorting,split,linked-list,printf,C++,Sorting,Split,Linked List,Printf,大家好,本周我的实验任务是学习链表。实验室提示如下: 编写一个程序,创建一个至少包含20个元素的前向链表,其中每个元素包含一个0到99之间的随机整数。打印列表 编写函数returnMiddleList,一次查找链表的中间元素。打印此元素的整数值以及此元素相对于头部(其中头部=0)、头部指向的元素=1、上一个头部指向的元素=2等的位置(从零开始) 在中间元素将列表一分为二,以创建两个大小几乎相等+/-1的完全独立的*链接列表,并打印这两个列表。修改returnMiddleList函数以完成此操作,
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
struct nodeType {
int data;
nodeType *link;
};
void populateList(nodeType *head) {
// srand(time(NULL));
nodeType *temp;
nodeType *current = head;
for (int i = 0; i < 20; i++) {
temp = new nodeType;
current->data = rand() % 100;
current->link = temp;
current = temp;
}
temp->link = NULL;
}
void print(nodeType *head) {
int i = 1;
while (head->link != NULL) {
cout << "#" << i++ << ": " << head->data << endl;
head = head->link;
}
}
nodeType* returnMiddleList(nodeType *head) {
nodeType *p1 = head, *p2 = head;
int count = 0;
int middle = 1;
while (p1->link->link != NULL) {
p1 = p1->link;
count++;
if (count % 2 == 0) {
p2 = p2->link;
middle++;
}
}
cout << "Middle #" << middle << ": " << p2->data << endl;
p1 = p2->link;
p2->link = NULL;
return p1;
}
void add(nodeType *head) {
int sum = 0;
while (head != NULL) {
sum = sum + head->data;
head = head->link;
}
cout << sum << endl;
}
void sort(nodeType *head) {
nodeType *temp = head;
while (temp != NULL) {
nodeType *temp2 = temp;
while (temp2 != NULL) {
if (temp->data > temp2->data) {
int temp3;
temp3 = temp->data;
temp->data = temp2->data;
temp2->data = temp3;
}
temp2 = temp2->link;
}
temp = temp->link;
}
}
nodeType* merge(nodeType* head1, nodeType* head2) {
nodeType *head3 = new nodeType, *current1 = head1, *current2 = head2;
while (current1 != NULL || current2 != NULL) {
if (current1 == NULL) {
while (current2 != NULL) {
//logic
current2 = current2->link; //dumps list 2
head3->data = current2->data;
}
break;
}
if (current2 == NULL) {
while (current1 != NULL) {
//Logic
current1 = current1->link; //dumps list 1
head3->data = current1->data;
}
break;
}
if (current1->data < current2->data) {
//logic
current1 = current1->link; //increments list 1
head3->data = current1->data;
} else {
//logic
current2 = current2->link; //increments list 2
head3->data = current2->data;
}
}
return head3;
}
int main() {
nodeType *head = new nodeType, *head2, *head3;
populateList(head);
print(head);
cout << endl;
head2 = returnMiddleList(head);
cout << endl << "List #1 Sum: ";
add(head);
cout << endl << "List #2 Sum: ";
add(head2);
sort(head);
cout << endl << "List #1 Sorted" << endl;
print(head);
sort(head2);
cout << endl << "List #2 Sorted" << endl;
print(head2);
head3 = merge(head, head2);
print(head3);
}
对于3,您不需要计数。代码还应该包括在尝试检查p1->link之前检查head==NULL、p1==NULL,并且在尝试检查p1->link->link之前检查p1->link==NULL。添加这些检查后,为了消除计数,只需一次推进p1两个:p1=p1->link->link,而一次推进p2一个:p2=p2->link。一旦你用P1->Link或P1-链接->链接到达列表的末尾,然后考虑P2是指向列表的前半部分的最后一个节点的指针,并遵循如何分割列表的给定指令。
对于4,递归地将列表拆分为子列表的方法通常称为wiki链接。这种方法用于自上而下的合并排序,尽管还有其他方法更适合更快地使用链表实现合并排序,我感觉导师可能希望您按照给定的提示进行操作。我认为是时候学习使用调试器了。在我来论坛寻求帮助之前,我一直在使用调试器,一直到了混乱的程度。除了调试之外,还可以命名一些东西。命名操作。名称数据。@Twigler调试器有什么令人困惑的地方?你只需一步通过你的代码,观察变量,每当程序偏离你写在纸上的计划,你就已经发现了问题。至少,在程序中的战略点打印变量的值。@PaulMcKenzie我已经尝试了所有这些,但我无法解决我的问题…: