前言:
这段时间把数据结构第三章学完,想找几个题来巩固一下自己的知识点,以下这道题一眼看出用链表来写(题目要求:在不允许使用另外数组的前提下),正好来检验下自己链表学的怎么样。网上的基本都是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;
}