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

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

栈(Stack):

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

c 复制代码
#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)--];
}
队列(Queue):

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

c 复制代码
#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;
}

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

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

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

二维数组:

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

多维数组:

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

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

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

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;
}

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

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

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

c 复制代码
int *ptr = (int *)malloc(sizeof(int) * 10);
if (ptr != NULL) {
    // 使用ptr指向的内存块
    free(ptr); // 释放动态内存
}

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

相关推荐
wabs66611 分钟前
关于贪心算法的思考
算法·贪心算法
社交怪人26 分钟前
【判断大小】信息学奥赛一本通C语言解法(题号1043)
算法
Snasph39 分钟前
GNU Make 用户手册(中文版)
服务器·算法·gnu
江澎涌1 小时前
拆解与 AI 的一次对话
人工智能·算法·程序员
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.06.02 题目:3635. 最早完成陆地和水上游乐设施的时间 II
笔记·算法·leetcode
Lsk_Smion2 小时前
力扣实训 _ [102].层序遍历--前序--后续_递归与非递归的实现
数据结构·算法·leetcode
Lsk_Smion2 小时前
力扣实训 _ [25].K个一组链表
数据结构·链表
小欣加油3 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
代码中介商3 小时前
C++左值与右值:核心判断法则详解
开发语言·c++
JAVA9654 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试