用C语言实现一个完整的代码他可以实现单链表的就地逆置。 2、建立两个非递减有序单链表,然后合并成一个非递减链表。 3、建立两个非递减有序单链表,然后合并成一个非递增链表。 4、编写一个主函数,调试上述算法。
时间: 2025-06-14 17:18:24 浏览: 11
1. 实现单链表就地逆置的C语言代码示例:
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
void reverse_list(Node** head) {
if (*head == NULL || (*head)->next == NULL)
return;
Node* prev = NULL;
Node* current = *head;
Node* next_temp;
while (current != NULL) {
next_temp = current->next;
current->next = prev;
prev = current;
current = next_temp;
}
*head = prev;
}
// 主函数测试
int main() {
// 初始化链表...
Node* list = create_list(); // 假设create_list()函数创建了初始链表
printf("Original List:\n");
print_list(list); // 打印原始链表
reverse_list(&list);
printf("\nReversed List:\n");
print_list(list);
return 0;
}
```
这里的`reverse_list()`函数通过三个指针`prev`, `current`, 和`next_temp`来实现链表的就地逆置。
2. 合并两个非递减有序单链表为非递减链表的示例:
```c
Node* merge_sorted_lists(Node* list1, Node* list2) {
if (list1 == NULL)
return list2;
else if (list2 == NULL)
return list1;
if (list1->data <= list2->data) {
list1->next = merge_sorted_lists(list1->next, list2);
return list1;
} else {
list2->next = merge_sorted_lists(list1, list2->next);
return list2;
}
}
// 主函数测试
int main() {
// 初始化两个已排序链表...
Node* list1 = create_sorted_list1();
Node* list2 = create_sorted_list2();
Node* merged_list = merge_sorted_lists(list1, list2);
// 打印合并后的链表
print_list(merged_list);
return 0;
}
```
3. 合并两个非递减有序单链表为非递增链表的过程类似,只需比较元素大小并决定插入位置相反即可:
```c
Node* merge_increasing_lists(Node* list1, Node* list2) {
// 类似于合并非递减链表,只是判断条件相反
// ...
}
// 主函数测试
int main() {
// 初始化两个已排序链表...
Node* list1 = create_sorted_list1();
Node* list2 = create_sorted_list2();
Node* merged_incr_list = merge_increasing_lists(list1, list2);
// 打印合并后的链表
print_list(merged_incr_list);
return 0;
}
```
以上均为简化版代码,实际应用中需要添加错误处理以及创建链表头结点的函数等。
阅读全文