MST
星途 面试题库

面试题:C语言中NULL指针在复杂数据结构中的应用与影响

在一个双向链表数据结构中,每个节点定义如下:`struct Node { int data; struct Node *prev; struct Node *next; };`假设你正在实现链表的插入操作,编写一个函数`void insertNode(struct Node **head, int value)`,该函数在链表头部插入一个新节点。在这个函数中,如何正确处理`head`指针可能为`NULL`的情况(即链表为空),以及如何确保插入操作在多线程环境下对`NULL`指针的处理是线程安全的,详细说明你的思路和采取的措施。
40.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 定义双向链表节点
struct Node { 
    int data; 
    struct Node *prev; 
    struct Node *next; 
};

// 定义互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 在链表头部插入新节点的函数
void insertNode(struct Node **head, int value) {
    // 加锁
    pthread_mutex_lock(&mutex);

    struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = value;
    newNode->prev = NULL;
    newNode->next = NULL;

    if (*head == NULL) {
        *head = newNode;
    } else {
        newNode->next = *head;
        (*head)->prev = newNode;
        *head = newNode;
    }

    // 解锁
    pthread_mutex_unlock(&mutex);
}

思路及线程安全措施

  1. 处理headNULL的情况:在函数内部,当*headNULL时,说明链表为空。此时直接将新创建的节点赋值给*head,让新节点成为链表的唯一节点。
  2. 线程安全措施:为确保多线程环境下对NULL指针处理的线程安全,使用互斥锁(pthread_mutex_t)。在进行插入操作前,通过pthread_mutex_lock加锁,保证同一时间只有一个线程能执行插入操作,防止多个线程同时修改链表头指针,避免出现竞争条件。操作完成后,使用pthread_mutex_unlock解锁。这样在多线程环境下,对head指针(包括NULL指针情况)的处理是线程安全的。