有n个整数,使前面各数顺序向后m个位置,最后m个数变成最前面m个数,见图 8.43。写一函数实现以上功能在主函数中输入个整数和输出调整后的n个数。

发布时间 2023-09-10 20:37:38作者: DawnTraveler

4,有n个整数,使前面各数顺序向后m个位置,最后m个数变成最前面m个数,见图 8.43。写一函数实现以上功能在主函数中输入个整数和输出调整后的n个数。

我的代码:

1.使用双向链表

void MoveDLink(DoubleList head, int m, int n) {
    /* 寻找原链表第n-m个节点 */
    DoubleList current = head, temp;
    for (int i = 0; i < n - m; i++) {
        current = current->next;
    }
    /* temp保存后m个数的首个数 */
    temp = current->next;
    /* 处理新链表尾部部分 */
    current->next = NULL;

    /* 找到原链表最后一个节点 */
    DoubleList tail = temp;
    while (tail->next) {
        tail = tail->next;
    }

    /* 处理新链表中间衔接部分 */
    tail->next = head->next;
    head->next->prior = tail;
    /* 处理新链表头部部分 */
    head->next = temp;
    temp->prior = head;

}

2.使用顺序表

void shiftArray(int arr[], int n, int m)
{
    int *temp = (int *)malloc(m * sizeof(int)); // 使用动态内存分配创建临时数组

    if (temp == NULL)
    {
        printf("内存分配失败\n");
        exit(1);
    }

    // 将最后m个元素保存到临时数组temp中
    for (int i = 0; i < m; i++)
    {
        temp[i] = arr[n - m + i];
    }

    // 向后移动前n-m个元素
    for (int i = n - 1; i >= m; i--)
    {
        arr[i] = arr[i - m];
    }

    // 将临时数组中的元素放回到数组的前面
    for (int i = 0; i < m; i++)
    {
        arr[i] = temp[i];
    }

    free(temp); // 释放临时数组的内存
}