以下是一个使用链表和指针的 C 语言编程题:
题目:将一个无序整数数组按照升序排列,并存储在链表中。
要求:
1.定义一个链表节点结构体,包含一个整数和一个指向下一个节点的指针。
2.实现一个函数,将无序整数数组按照升序排列,并将结果存储在链表中。
3.实现一个函数,遍历链表并输出每个节点的值。
示例:
输入:
复制代码
无序整数数组:[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] | |
输出:
复制代码
链表节点值:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] | |
以下是一个可能的实现:
c复制代码
#include <stdio.h> | |
#include <stdlib.h> | |
// 定义链表节点结构体 | |
typedef struct Node { | |
int value; | |
struct Node* next; | |
} Node; | |
// 插入节点到链表尾部 | |
Node* insertNode(Node* head, int value) { | |
Node* newNode = (Node*)malloc(sizeof(Node)); | |
newNode->value = value; | |
newNode->next = NULL; | |
if (head == NULL) { | |
head = newNode; | |
} else { | |
Node* current = head; | |
while (current->next != NULL) { | |
current = current->next; | |
} | |
current->next = newNode; | |
} | |
return head; | |
} | |
// 将无序整数数组按照升序排列,并将结果存储在链表中 | |
Node* sortAndBuildList(int arr[], int n) { | |
Node* head = NULL; // 头节点指针,初始为空 | |
for (int i = 0; i < n; i++) { // 将数组元素插入链表尾部 | |
head = insertNode(head, arr[i]); | |
} | |
// 对链表进行排序(可以使用快速排序、归并排序等算法) | |
// 这里简单起见,只使用了冒泡排序算法进行排序,实际应用中应使用更高效的排序算法。 | |
Node* current = head; | |
while (current != NULL) { // 从链表头部开始遍历,依次比较相邻节点值,交换位置使链表有序。 | |
Node* next = current->next; // 保存下一个节点指针,以便交换位置后能够正确指向下一个节点。 | |
while (next != NULL && current->value > next->value) { // 比较相邻节点值,交换位置使链表有序。 | |
int temp = current->value; // 临时保存当前节点值,以便交换位置后能够正确赋值。 | |
current->value = next->value; // 将下一个节点值赋给当前节点。 | |
next->value = temp; // 将当前节点值赋给下一个节点。 | |
Node* tempNode = current; // 临时保存当前节点指针,以便交换位置后能够正确指向下一个节点。 | |
current = next; // 将当前节点指针指向下一个节点。 | |
next = tempNode->next; // 将下一个节点指针指向原当前节点的下一个节点。 | |
} | |
current = next; // 将当前节点指针指向下一个节点。 | |
} | |
return head; // 返回头节点指针。 | |
} | |
// 遍历链表并输出每个节点的值。 | |
void printList(Node* head) { // 从头节点开始遍历链表,输出每个节点的值。 | |
while (head != NULL) { // 当头节点不为空时,继续遍历。 | |
printf("%d ", head->value); // 输出当前节点值。 | |
head = head->next; // 将头节点指针指向下一个节点。 | |
} // 当头节点为空时,退出循环。 | |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论