• 智能AI问答!更聪明、更完整、原创作!
  • 一款基于GPT的超级AI机器人,可以回答问题、聊天、创作、写文案!

假设带头结点的单链表各元素结点的数据值按递增顺序排列,设计算法删除数据值大于 min 并且小于 max 的结点。用c语言实现

发布于 2024-10-29 21:24:00

以下是一个C语言算法的实现,它删除带头结点的单链表中所有数据值大于 min 并且小于 max 的节点:

#include <stdio.h>
#include <stdlib.h>

// 定义单链表节点的结构体
typedef struct Node {
    int data;
    struct Node *next;
} Node, *LinkedList;

// 向链表中添加一个新节点
Node* insertNode(LinkedList head, int data) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (!newNode) {
        return NULL; // 内存分配失败
    }
    newNode->data = data;
    newNode->next = head->next; // 新节点插入头结点之后
    head->next = newNode;
    return newNode;
}

// 删除链表中数据值在 [min, max] 范围内的节点
void removeNodes(LinkedList head, int min, int max) {
    Node *current = head->next; // 从头结点的下一个节点开始遍历
    while (current != NULL) {
        if (current->data > min && current->data < max) {
            Node *temp = current;
            current = current->next; // 移动到下一个节点
            temp->next = NULL; // 防止被删除的节点被访问
            free(temp); // 释放被删除节点的内存
        } else {
            current = current->next; // 移动到下一个节点
        }
    }
}

// 打印链表的所有元素
void printList(LinkedList head) {
    Node *current = head->next;
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

// 主函数
int main() {
    LinkedList head = (LinkedList)malloc(sizeof(Node)); // 创建头结点
    if (!head) {
        return 1; // 内存分配失败
    }
    head->next = NULL; // 初始为空链表

    // 向链表中添加元素,示例数据
    insertNode(head, 10);
    insertNode(head, 15);
    insertNode(head, 20);
    insertNode(head, 25);
    insertNode(head, 30);
    insertNode(head, 35);

    printf("原始链表: ");
    printList(head);

    int min = 18, max = 28;
    // 删除数据值在[min, max]范围内的节点
    removeNodes(head, min, max);

    printf("删除后链表: ");
    printList(head);

    // 释放链表内存
    Node *current = head;
    Node *temp;
    while (current != NULL) {
        temp = current;
        current = current->next;
        free(temp);
    }

    return 0;
}

程序解释:

  1. 定义结构体:定义了单链表节点的结构体 Node
  2. 插入节点insertNode 函数用于在链表头结点后插入新节点。
  3. 删除节点removeNodes 函数遍历链表,删除所有数据值在 minmax 之间的节点。
  4. 打印链表printList 函数用于打印链表的所有元素。
  5. 主函数:创建链表并插入示例数据,然后调用 removeNodes 函数删除特定范围内的节点,并打印结果。

注意事项:

  • 在实际应用中,需要确保正确地释放所有分配的内存以避免内存泄漏。
  • 这个算法的时间复杂度是 O(n),其中 n 是链表的长度,因为每个节点最多被访问一次。
0 条评论

发布
问题

在线
客服