C语言文件读取与链表构建优化
C语言文件读取与链表构建优化
本文分析了一段C语言代码中文件读取和链表构建方面的问题,并提供优化后的解决方案,以提高代码效率和可读性。
问题分析
原始代码中存在以下问题:
- 函数参数定义:
read函数的参数head、tail和input的作用不明确,且传参方式容易造成混淆。 - 变量定义: 部分变量的命名不够清晰,例如
pare、sum等,难以理解其含义。 - 文件读取: 每次循环都调用
fgetc(fp)读取字符,效率较低。 - 链表构建: 链表节点的创建和连接逻辑较为复杂,可读性较差。
解决方案
以下是优化后的代码:
#define MAX_SIZE 1024 // 定义最大单词长度
typedef struct novel {
int paragraph;
int row;
char word[MAX_SIZE];
struct novel *next;
} novel;
void read(novel** head, novel** tail) {
novel* current = NULL;
novel* newNode = NULL;
FILE* fp = fopen('C:\Users\djw\Desktop\玄幻之旅.txt', 'r');
char c;
if (fp == NULL) {
printf('读取文本失败!\n');
return;
}
int paragraph = 1;
int row = 1;
int wordIndex = 0;
while ((c = fgetc(fp)) != EOF) {
if (c == ' ' || c == '\n' || c == '\t') {
// 遇到空格、换行符或制表符,将当前单词存入链表节点
if (wordIndex > 0) {
newNode = (novel*)malloc(sizeof(novel));
newNode->paragraph = paragraph;
newNode->row = row;
newNode->word[wordIndex] = '\0'; // 添加字符串结束符
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
current = newNode;
} else {
current->next = newNode;
current = newNode;
}
wordIndex = 0; // 重置单词索引
}
if (c == '\n') {
row++;
paragraph++;
}
} else {
// 将字符添加到当前单词
newNode->word[wordIndex++] = c;
}
}
// 处理最后一个单词
if (wordIndex > 0) {
newNode = (novel*)malloc(sizeof(novel));
newNode->paragraph = paragraph;
newNode->row = row;
newNode->word[wordIndex] = '\0'; // 添加字符串结束符
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
current = newNode;
} else {
current->next = newNode;
current = newNode;
}
}
fclose(fp);
if (newNode != NULL) {
*tail = newNode;
}
printf('读取成功!\n');
}
改进说明
- 函数参数: 使用
novel** head和novel** tail作为函数参数,通过指针传递链表头和尾节点的地址,方便对链表进行修改。 - 变量命名: 使用更具描述性的变量名,例如
paragraph、row、wordIndex等,提高代码可读性。 - 文件读取: 使用
fgetc(fp)一次性读取一个字符,并根据空格、换行符或制表符进行单词分割。 - 链表构建: 简化了链表节点的创建和连接逻辑,使用
current指针跟踪当前节点,并根据情况更新head和tail指针。
总结
通过以上优化,代码在功能性、可读性和效率方面都得到了提升。建议在编写代码时,注重代码规范和可读性,并尽量减少不必要的计算和内存分配,以提高代码质量。
原文地址: https://www.cveoy.top/t/topic/TxD 著作权归作者所有。请勿转载和采集!