PAT 乙级 Practice |(1008)C语言 --链表解法

前言:

这段时间把数据结构第三章学完,想找几个题来巩固一下自己的知识点,以下这道题一眼看出用链表来写(题目要求:在不允许使用另外数组的前提下),正好来检验下自己链表学的怎么样。网上的基本都是c++,或者其他语言写的,没有看到C语言版本,以下是用C语言写的链表来解决这道题,如果有不足之处,请评论区留言。


题目:

在这里插入图片描述


代码展示:(解析看注释)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct number {
    int num;
    struct number* next;
};

typedef struct number num;

int main(void) {
    int N, M;
    scanf("%d%d", &N, &M);
    M = M % N; // 避免循环移动 关键!!!!!! 少了这不 提交无法通过,细节决定成败
    num* head = (num*)malloc(sizeof(num)*1); // 定义一个表头
    head->next = NULL;  // 初始化空表
    num* pre, * p;
    pre = (num*)malloc(sizeof(num)*1);
    num* node = (num*)malloc(sizeof(num) * (size_t)N); // 分配内存空间
    memset(node, 0, sizeof(num) * (size_t)N);
    for (int i = 0; i < N; i++) { // 输入
        scanf("%d", &node[i].num);
    }

    head->next = node;
    for (int i = 1; i < N; i++) { //  链表 next域 赋值
        (node + i - 1)->next = node + i;
    }
    (node + N - 1)->next = NULL; // 单链表最后一个元素 next域 赋值为空
    p = head->next; // 让 p 指针指向 首元结点

    if (M > 0) {
        for (int i = 0; i < N - M; i++) {
            pre = p; // 始终等于 p 前驱
            p = p->next;  // p每次下移一个结点
        }

        pre->next = NULL; // 表尾设 NULL
        pre = p; // 保住当前 p 的位置
        while (p->next) {
            p = p->next; // 找到尾结点
        }

        // 将要移动的整个数列加入到表头 node 后面 
        p->next = head->next;
        head->next = pre;

        p = head->next;
        while (p != NULL) {
            printf("%d", p->num);
            if (p->next) printf(" "); // 满足题目要求: 之间用空格分隔,序列结尾不能有多余空格
            p = p->next;
        }
    }

    else { // if (m==0)  成立时 
        p = head->next;
        while (p != NULL) {
            printf("%d", p->num);
            if (p->next) printf(" ");
            p = p->next;
        }
    }
    system("pause");
    return EXIT_SUCCESS;
}


提交结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/haduwi/article/details/106602011