已知一个不带头结点的单链表为list,设计一个算法,使得链表中数据域值最大的那个结点被删除。用c语言
时间: 2024-09-13 17:08:10 浏览: 255
在C语言中,我们可以使用迭代的方式来遍历链表,同时维护两个指针,一个指向当前最大节点(maxNode),另一个指向实际的头节点(head)。当遍历时,如果遇到的新节点值大于maxNode的值,则更新maxNode;同时,我们还需要记录前一个节点,因为删除操作需要找到要删除节点的前一个节点。
以下是算法的大致步骤:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
void deleteMax(struct Node* head) {
if (head == NULL || head->next == NULL) {
return; // 如果链表为空或只有一个元素,无需删除
}
struct Node* maxNode = head; // 初始化maxNode为头节点
struct Node* prevNode = NULL;
// 遍历链表
for (struct Node* currentNode = head->next; currentNode != NULL; currentNode = currentNode->next) {
if (currentNode->data > maxNode->data) {
maxNode = currentNode;
}
prevNode = currentNode;
}
// 删除最大节点
if (prevNode != NULL) { // 非空链表,有前驱节点
prevNode->next = maxNode->next;
} else { // 单个元素链表,直接将头指针置NULL
head = NULL;
}
free(maxNode); // 释放最大节点的内存
}
// 示例函数,用于创建链表并添加元素
void createList(struct Node** list, int elements[]) {
*list = malloc(sizeof(struct Node));
(*list)->data = elements[0];
(*list)->next = NULL;
// 添加更多元素...
}
int main() {
int elements[] = {5, 8, 3, 10, 2};
struct Node* list = NULL;
createList(&list, elements);
deleteMax(list);
// 打印剩余链表(这里省略)
return 0;
}
```
阅读全文