MST

星途 面试题库

面试题:C语言联合体与枚举在复杂数据结构中的深度应用

设计一个复杂的数据结构,其中要同时使用联合体和枚举。该数据结构用于描述一个多媒体文件系统中的节点,节点类型可以是文件(包含文件大小、文件类型枚举,文件类型如文本、图像、音频等)或文件夹(包含子节点数量,子节点是一个该数据结构类型的数组)。要求实现节点的初始化、打印节点信息等基本操作,并详细阐述联合体和枚举在这个数据结构设计中的优势与必要性。
28.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 定义文件类型枚举
typedef enum {
    TEXT,
    IMAGE,
    AUDIO
} FileType;

// 定义联合体来存储文件或文件夹的具体信息
typedef union {
    struct {
        long size;
        FileType type;
    } file;
    struct {
        int numChildren;
        struct Node* children[100]; // 假设最多100个子节点
    } folder;
} NodeData;

// 定义节点数据结构
typedef struct Node {
    char name[100];
    int isFolder;
    NodeData data;
} Node;

// 初始化文件节点
void initFileNode(Node* node, const char* name, long size, FileType type) {
    strcpy(node->name, name);
    node->isFolder = 0;
    node->data.file.size = size;
    node->data.file.type = type;
}

// 初始化文件夹节点
void initFolderNode(Node* node, const char* name, int numChildren) {
    strcpy(node->name, name);
    node->isFolder = 1;
    node->data.folder.numChildren = numChildren;
    for (int i = 0; i < numChildren; i++) {
        node->data.folder.children[i] = NULL;
    }
}

// 打印文件节点信息
void printFileNode(const Node* node) {
    printf("File Name: %s\n", node->name);
    printf("File Size: %ld bytes\n", node->data.file.size);
    switch (node->data.file.type) {
        case TEXT: printf("File Type: Text\n"); break;
        case IMAGE: printf("File Type: Image\n"); break;
        case AUDIO: printf("File Type: Audio\n"); break;
    }
}

// 打印文件夹节点信息
void printFolderNode(const Node* node) {
    printf("Folder Name: %s\n", node->name);
    printf("Number of Children: %d\n", node->data.folder.numChildren);
}

// 打印节点信息
void printNode(const Node* node) {
    if (node->isFolder) {
        printFolderNode(node);
    } else {
        printFileNode(node);
    }
}

联合体和枚举在这个数据结构设计中的优势与必要性:

  1. 联合体的优势与必要性

    • 节省内存:在多媒体文件系统节点中,一个节点要么是文件,要么是文件夹,不会同时既是文件又是文件夹。使用联合体可以让NodeData在内存中只占用最大成员(在这个例子中,folder结构体可能占用空间最大)的大小,而不是将文件和文件夹的信息都存储,从而节省内存。
    • 灵活性:通过联合体,Node结构体可以根据isFolder标志来灵活处理文件和文件夹不同类型的数据,使代码逻辑更加紧凑和高效。
  2. 枚举的优势与必要性

    • 类型安全:定义FileType枚举来表示文件类型,相比于使用普通整数来表示文件类型,枚举提供了类型安全。编译器可以检查对FileType类型变量的赋值是否在合法的枚举值范围内,减少编程错误。
    • 可读性:使用枚举值(如TEXTIMAGEAUDIO)比直接使用整数常量更具可读性,代码意图更加清晰,便于理解和维护。