C语言文件读取与链表构建优化

本文分析了一段C语言代码中文件读取和链表构建方面的问题,并提供优化后的解决方案,以提高代码效率和可读性。

问题分析

原始代码中存在以下问题:

  1. 函数参数定义: read 函数的参数 headtailinput 的作用不明确,且传参方式容易造成混淆。
  2. 变量定义: 部分变量的命名不够清晰,例如 paresum 等,难以理解其含义。
  3. 文件读取: 每次循环都调用 fgetc(fp) 读取字符,效率较低。
  4. 链表构建: 链表节点的创建和连接逻辑较为复杂,可读性较差。

解决方案

以下是优化后的代码:

#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');
}

改进说明

  1. 函数参数: 使用 novel** headnovel** tail 作为函数参数,通过指针传递链表头和尾节点的地址,方便对链表进行修改。
  2. 变量命名: 使用更具描述性的变量名,例如 paragraphrowwordIndex 等,提高代码可读性。
  3. 文件读取: 使用 fgetc(fp) 一次性读取一个字符,并根据空格、换行符或制表符进行单词分割。
  4. 链表构建: 简化了链表节点的创建和连接逻辑,使用 current 指针跟踪当前节点,并根据情况更新 headtail 指针。

总结

通过以上优化,代码在功能性、可读性和效率方面都得到了提升。建议在编写代码时,注重代码规范和可读性,并尽量减少不必要的计算和内存分配,以提高代码质量。

C语言文件读取与链表构建优化

原文地址: https://www.cveoy.top/t/topic/TxD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录