Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++_Sorting_Split_Linked List_Printf - Fatal编程技术网

C++链表排序、拆分和打印问题

C++链表排序、拆分和打印问题,c++,sorting,split,linked-list,printf,C++,Sorting,Split,Linked List,Printf,大家好,本周我的实验任务是学习链表。实验室提示如下: 编写一个程序,创建一个至少包含20个元素的前向链表,其中每个元素包含一个0到99之间的随机整数。打印列表 编写函数returnMiddleList,一次查找链表的中间元素。打印此元素的整数值以及此元素相对于头部(其中头部=0)、头部指向的元素=1、上一个头部指向的元素=2等的位置(从零开始) 在中间元素将列表一分为二,以创建两个大小几乎相等+/-1的完全独立的*链接列表,并打印这两个列表。修改returnMiddleList函数以完成此操作,

大家好,本周我的实验任务是学习链表。实验室提示如下:

编写一个程序,创建一个至少包含20个元素的前向链表,其中每个元素包含一个0到99之间的随机整数。打印列表

编写函数returnMiddleList,一次查找链表的中间元素。打印此元素的整数值以及此元素相对于头部(其中头部=0)、头部指向的元素=1、上一个头部指向的元素=2等的位置(从零开始)

在中间元素将列表一分为二,以创建两个大小几乎相等+/-1的完全独立的*链接列表,并打印这两个列表。修改returnMiddleList函数以完成此操作,返回第二个链表的头,并将指向该头的元素的链接设置为null。然后打印存储在两个列表元素中的两个整数之和

将两个列表从最小到最大排序并打印出来。根据所采用的排序方法,此步骤中的打印是可选的。然后将这两个列表合并,同时再次从最小到最大排序,并打印出新列表。提示:在对前两个未排序的列表进行排序和组合之前,可以进一步细分列表,并按一到两个元素列表的比例对其进行排序。这种叫什么

我有1和2工作,但3和4是问题的开始。当我把我的链接列表分成两个列表并打印出单独的列表时,我的第一个链接列表打印出9个数字,当它应该打印出10个数字时,第10个数字不知怎的消失了?但是当我对第一个列表进行求和时,消失的数字会被加到总和中!我不知道为什么它正在消失,这是一个问题。另一个问题是在第二个列表中,一个随机的0被添加到列表中,其中一个数字丢失。我的最后一个问题是关于4,因为我使用的合并算法似乎不起作用,我在排序时将列表合并在一起,但我没有使用递归排序,因为我们还没有了解到这一点。任何意见和帮助都将不胜感激!谢谢

#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我已经尝试了所有这些,但我无法解决我的问题…: