MST

星途 面试题库

面试题:C语言内存管理与结构体

编写一个C语言程序,实现一个简单的链表数据结构。链表节点包含一个整数数据和一个指向下一个节点的指针。要求提供插入节点到链表头部和删除链表中指定节点的函数。同时,详细说明在这个过程中如何进行内存管理,以避免内存泄漏。
24.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        fprintf(stderr, "内存分配失败\n");
        exit(EXIT_FAILURE);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 插入节点到链表头部
Node* insertAtHead(Node* head, int data) {
    Node* newNode = createNode(data);
    newNode->next = head;
    return newNode;
}

// 删除链表中指定节点
Node* deleteNode(Node* head, int key) {
    Node* current = head;
    Node* prev = NULL;

    // 查找要删除的节点
    while (current != NULL && current->data != key) {
        prev = current;
        current = current->next;
    }

    // 如果未找到指定节点
    if (current == NULL) {
        return head;
    }

    // 如果要删除的是头节点
    if (prev == NULL) {
        head = current->next;
    } else {
        prev->next = current->next;
    }

    free(current);
    return head;
}

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

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

内存管理说明

  1. 创建节点:在createNode函数中,使用malloc分配内存给新节点。如果分配失败,打印错误信息并退出程序。
  2. 插入节点:在insertAtHead函数中,调用createNode创建新节点,此过程已进行内存分配。
  3. 删除节点:在deleteNode函数中,找到要删除的节点后,使用free释放其内存。
  4. 释放链表:在程序结束前,调用freeList函数,遍历链表并依次释放每个节点的内存,从而避免内存泄漏。在freeList函数中,使用临时指针nextNode保存当前节点的下一个节点,以免在释放当前节点后丢失链表后续节点的引用。