• C语言经典面试题目(十二)


    1、如何在C语言中实现栈和队列数据结构?

    栈(Stack):

    栈是一种后进先出(LIFO)的数据结构,可以使用数组或链表来实现。以下是一个使用数组实现的简单栈的示例:

    #define MAX_SIZE 100
    
    typedef struct {
        int data[MAX_SIZE];
        int top;
    } Stack;
    
    void initStack(Stack *s) {
        s->top = -1;
    }
    
    int isEmpty(Stack *s) {
        return (s->top == -1);
    }
    
    int isFull(Stack *s) {
        return (s->top == MAX_SIZE - 1);
    }
    
    void push(Stack *s, int value) {
        if (isFull(s)) {
            printf("Stack is full\n");
            return;
        }
        s->data[++(s->top)] = value;
    }
    
    int pop(Stack *s) {
        if (isEmpty(s)) {
            printf("Stack is empty\n");
            return -1;
        }
        return s->data[(s->top)--];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    队列(Queue):

    队列是一种先进先出(FIFO)的数据结构,同样可以使用数组或链表来实现。以下是一个使用数组实现的简单队列的示例:

    #define MAX_SIZE 100
    
    typedef struct {
        int data[MAX_SIZE];
        int front, rear;
    } Queue;
    
    void initQueue(Queue *q) {
        q->front = q->rear = -1;
    }
    
    int isEmpty(Queue *q) {
        return (q->front == -1);
    }
    
    int isFull(Queue *q) {
        return ((q->rear + 1) % MAX_SIZE == q->front);
    }
    
    void enqueue(Queue *q, int value) {
        if (isFull(q)) {
            printf("Queue is full\n");
            return;
        }
        if (isEmpty(q)) {
            q->front = q->rear = 0;
        } else {
            q->rear = (q->rear + 1) % MAX_SIZE;
        }
        q->data[q->rear] = value;
    }
    
    int dequeue(Queue *q) {
        if (isEmpty(q)) {
            printf("Queue is empty\n");
            return -1;
        }
        int value = q->data[q->front];
        if (q->front == q->rear) {
            q->front = q->rear = -1;
        } else {
            q->front = (q->front + 1) % MAX_SIZE;
        }
        return value;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    2、C语言中的文件读写操作存在哪些常见问题?如何解决这些问题?

    常见问题:
    1. 文件打开失败。
    2. 文件读取或写入不完整。
    3. 文件读取或写入的数据与预期不符。
    解决方法:
    1. 在文件打开操作后,使用 fopen 函数返回的文件指针进行错误检查,确保文件打开成功。
    2. 在文件读取或写入操作后,可以通过检查返回值或者调用 feof 函数来判断文件是否读取或写入完整。
    3. 在文件读取或写入操作前,确保正确设置了文件指针的位置(如使用 fseek 函数),并且使用正确的读取或写入函数(如 freadfwrite)。

    3、C语言中的二维数组和多维数组有什么区别?如何访问和操作多维数组?

    二维数组:

    二维数组是由若干行和若干列元素组成的数组,可以看作是一维数组的扩展。在C语言中,二维数组是一个连续的存储区域,可以通过两个索引来访问数组中的元素。

    多维数组:

    多维数组是二维数组的扩展,它可以有更多维度。例如,三维数组由若干个二维数组组成,四维数组由若干个三维数组组成,以此类推。多维数组在内存中仍然是连续存储的,但访问元素时需要使用多个索引。

    4、如何在C语言中实现二叉树数据结构?

    二叉树是一种常见的树形数据结构,每个节点最多有两个子节点。以下是一个简单的二叉树结构的定义:

    typedef struct Node {
        int data;
        struct Node *left;
        struct Node *right;
    } Node;
    
    Node *createNode(int value) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        if (newNode != NULL) {
            newNode->data = value;
            newNode->left = NULL;
            newNode->right = NULL;
        }
        return newNode;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    5、C语言中的malloc函数和calloc函数有什么区别?如何释放动态内存?

    区别:
    • malloc 函数用于分配指定大小的内存块,但不会初始化内存块的内容,内存中的值是随机的。
    • calloc 函数用于分配指定数量和大小的连续内存块,并将内存块的内容初始化为0。
    如何释放动态内存:

    在使用 malloccalloc 分配内存后,需要使用 free 函数来释放动态内存,以避免内存泄漏。

    int *ptr = (int *)malloc(sizeof(int) * 10);
    if (ptr != NULL) {
        // 使用ptr指向的内存块
        free(ptr); // 释放动态内存
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用 free 函数释放内存后,建议将指针设置为NULL,以避免野指针的出现。

  • 相关阅读:
    kafka-生产者源码解析
    Spring-IOC-@Value和@PropertySource用法
    Git指导:提交干净的commit信息
    flutter 系列之:flutter 中的幽灵offstage
    EPLAN-P8软件技术分享文章
    Linux串口断帧和连帧处理
    力扣53. 最大子数组和(动态规划)
    CentOS 8迁移Rocky Linux 8手记
    Bootstrap的旋转器组件
    SpringBoot整合RabbitMQ
  • 原文地址:https://blog.csdn.net/eason22/article/details/136722829