面试题答案
一键面试#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);
}
}
联合体和枚举在这个数据结构设计中的优势与必要性:
-
联合体的优势与必要性:
- 节省内存:在多媒体文件系统节点中,一个节点要么是文件,要么是文件夹,不会同时既是文件又是文件夹。使用联合体可以让
NodeData
在内存中只占用最大成员(在这个例子中,folder
结构体可能占用空间最大)的大小,而不是将文件和文件夹的信息都存储,从而节省内存。 - 灵活性:通过联合体,
Node
结构体可以根据isFolder
标志来灵活处理文件和文件夹不同类型的数据,使代码逻辑更加紧凑和高效。
- 节省内存:在多媒体文件系统节点中,一个节点要么是文件,要么是文件夹,不会同时既是文件又是文件夹。使用联合体可以让
-
枚举的优势与必要性:
- 类型安全:定义
FileType
枚举来表示文件类型,相比于使用普通整数来表示文件类型,枚举提供了类型安全。编译器可以检查对FileType
类型变量的赋值是否在合法的枚举值范围内,减少编程错误。 - 可读性:使用枚举值(如
TEXT
、IMAGE
、AUDIO
)比直接使用整数常量更具可读性,代码意图更加清晰,便于理解和维护。
- 类型安全:定义