输入N个整数,编程实现对称交换,即逆序存放。要求:(1)用动态存储空间(2)自定义函数实现输入(3)定义函数实现输出(3)自定义函数实现对称交换(4)用主程序验证。(形参用指针:间接访问方式)
时间: 2024-11-06 16:14:46 浏览: 57
输入两个正整数m和n求其最大公约数和最小公倍数 (2).docx
在C语言中,由于C++没有内置的链表结构,我们可以使用动态内存分配来模拟类似链表的数据结构,实现对称交换。以下是使用指针的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 自定义函数实现输入
void input(Node** head) {
int num;
printf("请输入整数个数(>0):");
scanf("%d", &num);
*head = (Node*)malloc(sizeof(Node)); // 分配第一个节点
(*head)->data = 0; // 初始化为0,避免空指针错误
(*head)->next = NULL;
for (int i = 1; i <= num; ++i) {
scanf("%d", &(*head)->data); // 读取每个数字并插入链表头部
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = (*head)->data;
newNode->next = *head;
*head = newNode; // 更新头结点
}
}
// 自定义函数实现对称交换
void symmetric_exchange(Node** head) {
Node* slow = *head;
Node* fast = *head;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
}
// 预备交换:慢指针到达链表中心
Node* mid = slow;
// 反向链表的后半部分
slow = *head;
while (slow != mid) {
Node* temp = slow->next;
slow->next = mid->next;
mid->next = temp;
slow = slow->next;
mid = mid->next;
}
// 将后半部分与前半部分连接
slow->next = *head;
}
// 自定义函数实现输出
void print_list(Node* head) {
Node* current = head;
while (current) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
// 主程序验证
int main() {
Node* list;
input(&list);
printf("原始链表:");
print_list(list);
symmetric_exchange(&list);
printf("对称交换后:");
print_list(list);
free(list);
return 0;
}
阅读全文