#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data; // 节点存储的数字
struct Node* next; // 指向后一个节点的指针
} Node;
// 创建新节点(动态分配内存,初始化数据)
Node* createNode(int num) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 分配节点内存
newNode->data = num; // 存储数字
newNode->next = NULL; // 初始化为空指针(尾节点标志)
return newNode;
}
// 构建链表:生成 [1, N] 的所有数字节点,串联成链表
Node* buildLinkedList(int N) {
Node* head = NULL; // 链表头指针(初始为空)
Node* tail = NULL; // 链表尾指针(用于高效添加节点)
for (int i = 1; i <= N; i++) {
Node* newNode = createNode(i); // 创建当前数字的节点
if (head == NULL) { // 链表为空时,新节点作为头节点
head = newNode;
tail = newNode;
} else { // 链表非空时,新节点添加到尾部
tail->next = newNode;
tail = newNode;
}
}
return head; // 返回链表头(通过头指针可访问整个链表)
}
// 遍历链表,统计奇数和偶数个数
void countOddEven(Node* head, int* oddCount, int* evenCount) {
Node* curr = head; // 遍历指针(从表头开始)
*oddCount = 0; // 初始化奇数计数
*evenCount = 0; // 初始化偶数计数
while (curr != NULL) { // 遍历到尾节点(curr为NULL时结束)
if (curr->data % 2 == 1) { // 判断当前节点数字是否为奇数
(*oddCount)++;
} else {
(*evenCount)++;
}
curr = curr->next; // 指针后移,访问下一个节点
}
}
// 释放链表内存(避免内存泄漏)
void freeLinkedList(Node* head) {
Node* temp;
while (head != NULL) {
temp = head; // 暂存当前节点
head = head->next; // 头指针后移
free(temp); // 释放当前节点内存
}
}
int main() {
int N, odd, even;
scanf("%d", &N);
Node* head = buildLinkedList(N); // 构建链表
countOddEven(head, &odd, &even); // 统计奇偶数
printf("%d %d\n", odd, even);
freeLinkedList(head); // 释放内存
return 0;
}