假设有一个顺序表L,其中元素为整数且所有元素均不相同。设计一个算法将最大值元素与最小值元素交换。用c语言完成完整代码
时间: 2024-09-26 20:14:31 浏览: 48
定位顺序表中最大值和最小值
为了在一个顺序列表(数组)`L` 中找到并交换最大值和最小值元素,可以使用两个指针分别指向数组的开始和结束,然后逐步向中间移动,比较当前指针所指元素与已知的最大值和最小值。以下是C语言的示例代码:
```c
#include <stdio.h>
// 定义顺序表结构体
typedef struct {
int data;
struct Node *next; // 指向下一项
} Node;
// 初始化空链表
Node* createList() {
return (Node*)malloc(sizeof(Node));
}
// 插入节点到链表
void insert(Node** head, int value) {
Node* newNode = createList();
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
// 找到并返回列表中的最小值
int findMin(Node* head) {
if (head == NULL || head->next == NULL) {
return head->data;
}
int min = head->data;
Node* current = head->next;
while (current != NULL) {
if (min > current->data) {
min = current->data;
}
current = current->next;
}
return min;
}
// 找到并返回列表中的最大值
int findMax(Node* head) {
if (head == NULL || head->next == NULL) {
return head->data;
}
int max = head->data;
Node* current = head->next;
while (current != NULL) {
if (max < current->data) {
max = current->data;
}
current = current->next;
}
return max;
}
// 交换最大值和最小值
void swapMinMax(Node** head) {
int min = findMin(*head);
int max = findMax(*head);
// 修改最大值和最小值节点的数据
Node* nodeWithMin = findNodeWithValue(*head, min);
nodeWithMin->data = max;
Node* nodeWithMax = findNodeWithValue(*head, max);
nodeWithMax->data = min;
}
// 查找特定值的节点
Node* findNodeWithValue(Node* head, int value) {
Node* current = head;
while (current != NULL) {
if (current->data == value) {
return current;
}
current = current->next;
}
return NULL;
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
Node* listHead = createList();
// 添加一些元素,例如 [5, 2, 8, 1, 9]
insert(&listHead, 5);
insert(&listHead, 2);
insert(&listHead, 8);
insert(&listHead, 1);
insert(&listHead, 9);
printf("Original List:\n");
printList(listHead);
swapMinMax(&listHead);
printf("\nSwapped List:\n");
printList(listHead);
return 0;
}
```
这个程序首先创建了一个顺序列表,并添加了一些整数值。接着,它使用`swapMinMax`函数找到并交换了最大值和最小值。最后,通过打印原始列表和交换后的列表来验证结果。
阅读全文