以下是经过修改以满足要求的完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 100

// 结点数据结构
typedef struct Node {
    char content[MAX_SIZE];
    struct Node* next;
    struct Node* prev;
} Node;

// 小说编辑器系统数据结构
typedef struct NovelEditor {
    Node* head; // 头结点
    Node* current; // 当前结点
    int totalNodes; // 结点总数
} NovelEditor;

// 初始化小说编辑器系统
void init(NovelEditor* editor) {
    editor->head = NULL;
    editor->current = NULL;
    editor->totalNodes = 0;
}

// 定位功能
void locate(NovelEditor* editor, int segment, int offset) {
    Node* curr = editor->head; // 从头结点开始遍历链表
    while (curr != NULL && segment > 1) { // 定位到指定段号
        curr = curr->next;
        segment--;
    }
    
    if (curr != NULL && offset <= MAX_SIZE && offset > MAX_SIZE / 2) { // 检查段内偏移是否有效且满足字符数量要求
        editor->current = curr; // 更新当前结点
        printf('定位成功到段号 %d,段内偏移 %d\n', segment, offset);
    }
    else {
        printf('定位失败\n');
    }
}

// 字符串插入功能
void insertString(NovelEditor* editor, char* str) {
    if (editor->current == NULL) {
        printf('请先定位到位置再插入字符串\n');
        return;
    }
    
    int i = 0;
    Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新结点
    while (str[i] != '\0' && editor->current->content[i] != '\0' && i < MAX_SIZE) { // 拷贝字符串到当前结点
        editor->current->content[i] = str[i];
        i++;
    }
    editor->current->content[i] = '\0';
    
    if (str[i] != '\0') { // 存在剩余未插入的字符串
        newNode->content[0] = '\0';
        newNode->next = editor->current->next;
        newNode->prev = editor->current;
        editor->current->next = newNode;
        if (newNode->next != NULL) {
            newNode->next->prev = newNode;
        }
        editor->current = newNode;
        editor->totalNodes++;
        
        i++;
        while (str[i] != '\0' && i < MAX_SIZE) { // 拷贝剩余字符串到新结点
            editor->current->content[i - MAX_SIZE] = str[i];
            i++;
        }
        editor->current->content[i - MAX_SIZE] = '\0';
    }
    
    printf('字符串插入成功\n');
}

// 字符串删除功能
void deleteString(NovelEditor* editor, int length) {
    if (editor->current == NULL) {
        printf('请先定位到位置再删除字符串\n');
        return;
    }
    
    int i = 0;
    while (editor->current->content[i] != '\0' && i < length && i < MAX_SIZE) { // 删除指定长度的字符串
        editor->current->content[i] = '\0';
        i++;
    }
    
    if (editor->current->content[i] == '\0') { // 当前结点已删除完毕
        Node* nextNode = editor->current->next;
        if (nextNode != NULL && nextNode->content[0] != '\0') { // 合并下一个结点
            while (i - MAX_SIZE < MAX_SIZE && nextNode->content[i - MAX_SIZE] != '\0') {
                editor->current->content[i - MAX_SIZE] = nextNode->content[i - MAX_SIZE];
                nextNode->content[i - MAX_SIZE] = '\0';
                i++;
            }
        }
        else { // 删除下一个结点
            editor->current->next = nextNode->next;
            if (nextNode->next != NULL) {
                nextNode->next->prev = editor->current;
            }
            free(nextNode);
            editor->totalNodes--;
        }
    }
    
    printf('字符串删除成功\n');
}

// 

代码实现了以下功能:

  • 初始化小说编辑器系统init(NovelEditor* editor) 函数用于初始化小说编辑器系统,将头结点、当前结点和结点总数都设置为 NULL 或 0。
  • 定位功能locate(NovelEditor* editor, int segment, int offset) 函数用于定位到小说中的指定位置,其中 segment 表示段号,offset 表示段内偏移。
  • 字符串插入功能insertString(NovelEditor* editor, char* str) 函数用于在当前位置插入字符串。
  • 字符串删除功能deleteString(NovelEditor* editor, int length) 函数用于删除当前位置的指定长度的字符串。

使用示例:

int main() {
    NovelEditor editor;
    init(&editor);
    
    // 定位到第二段,段内偏移为 10
    locate(&editor, 2, 10);
    
    // 插入字符串 "Hello World!" 到当前位置
    insertString(&editor, "Hello World!");
    
    // 删除当前位置的 5 个字符
    deleteString(&editor, 5);
    
    return 0;
}

代码分析:

  • 代码使用链表结构来存储小说内容,每个结点代表一段内容,content 数组存储该段内容的字符串。
  • locate 函数通过遍历链表来定位到指定位置。
  • insertString 函数使用 malloc 函数动态分配内存创建新结点,并将字符串插入到当前结点或新创建的结点中。
  • deleteString 函数删除指定长度的字符串,并根据情况合并或删除下一个结点。

注意事项:

  • 代码中使用 MAX_SIZE 定义了每个结点的最大字符数量,可以根据需要修改。
  • 代码只实现了基本的功能,还可以根据需要添加其他功能,例如保存、加载、查找等。

希望本代码能够帮助你更好地理解 C 语言的链表和字符串操作,并为你提供一个开发小说编辑器系统的基础。

C语言小说编辑器系统代码实现 - 定位、插入和删除字符串

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

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