C语言链表实现字符串插入:详解 insertString 函数

本文将详细解析一个C语言函数 void insertString(Novel* current, char* str),该函数使用链表结构实现字符串的插入。

代码分析

以下是 insertString 函数的代码及其注释:

void insertString(Novel* current, char* str) {
    int len = strlen(str);  // 获取要插入的字符串的长度
    int remainingSpace = MAX_SIZE - strlen(current->word);  // 计算当前节点中剩余的字符空间

    if (len <= remainingSpace) { // 如果要插入的字符串长度小于等于剩余空间
        strcat(current->word, str);  // 直接追加到当前节点的字符数组末尾
    } else { // 字符串长度超出剩余空间
        int splitPos = MAX_SIZE / 2;  // 计算当前节点字符数组分割的位置
        strncpy(current->word + strlen(current->word), str, splitPos);  // 将要插入的字符串的前半部分复制到当前节点字符数组的末尾
        current->word[MAX_SIZE] = '�';  // 确保字符数组末尾为终止符

        Novel* newNode = createNovel();  // 创建一个新节点
        newNode->Llink = current;  // 将新节点的前指针指向当前节点
        newNode->Rlink = current->Rlink;  // 将新节点的后指针指向当前节点的后继节点
        if (current->Rlink != NULL) {
            current->Rlink->Llink = newNode;  // 如果当前节点有后继节点,则将后继节点的前指针指向新节点
        }
        current->Rlink = newNode;  // 将当前节点的后指针指向新节点

        strncpy(newNode->word, str + splitPos, len - splitPos);  // 将要插入的字符串的后半部分复制到新节点的字符数组
        newNode->word[len - splitPos] = '�';  // 确保新节点字符数组末尾为终止符
    }

    current->pages++;  // 更新当前节点的页数
    current->paragraph++;  // 更新当前节点的段落数
    current->row++;  // 更新当前节点的行数
}

功能说明

insertString 函数的功能是将一个字符串 str 插入到链表的 current 节点中。

  • 首先,函数计算要插入的字符串长度 len 以及当前节点剩余的存储空间 remainingSpace
  • 如果 len 小于等于 remainingSpace,则直接使用 strcat 函数将字符串追加到当前节点的字符数组 word 的末尾。
  • 如果 len 大于 remainingSpace,则需要进行字符串分割:
    • 计算分割位置 splitPos
    • 将字符串的前半部分复制到当前节点的字符数组 word 中。
    • 创建一个新的节点 newNode,并将字符串的后半部分复制到 newNode 的字符数组 word 中。
    • newNode 插入到链表中,并将 current 节点的后指针指向 newNode
  • 最后,更新当前节点的页数、段落数和行数。

注意事项

  • 代码中假设 Novel 结构体定义了一个 word 字符数组用于存储字符串,并定义了 LlinkRlink 指针用于构建链表结构。
  • MAX_SIZE 是一个常量,表示每个节点最大可存储的字符数。
  • createNovel() 函数用于创建一个新的 Novel 节点,并初始化其成员变量。

总结

insertString 函数提供了一种使用链表实现字符串插入的方法,可以有效解决字符串长度溢出的问题。该函数逻辑清晰,代码简洁易懂,适合用于需要动态维护字符串数据的场景。

C语言链表实现字符串插入:详解 insertString 函数

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

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