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

#define MAX_SIZE 50 #define PAGE_SIZE 20

// 节点结构 typedef struct Node { struct Node* prev; struct Node* next; char content[MAX_SIZE]; int count; } Node;

// 小说结构 typedef struct Novel { Node* head; Node* tail; int numPages; int currentPage; } Novel;

// 创建一个新节点 Node* createNode() { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->prev = NULL; newNode->next = NULL; newNode->count = 0; return newNode; }

// 在指定节点之后插入字符串 void insertAfter(Node* node, const char* str) { int len = strlen(str); int i, j; for (i = node->count, j = 0; i < MAX_SIZE && j < len; i++, j++) { node->content[i] = str[j]; } node->count = i; if (j < len) { Node* newNode = createNode(); for (i = 0; i < MAX_SIZE && j < len; i++, j++) { newNode->content[i] = str[j]; } newNode->count = i; newNode->prev = node; newNode->next = node->next; if (node->next != NULL) { node->next->prev = newNode; } node->next = newNode; } }

// 从指定节点删除指定数量的字符 void deleteChars(Node* node, int numChars) { int i; for (i = 0; i < numChars && node != NULL; i++) { node->count--; if (node->count < 0) { node = node->prev; if (node != NULL) { node->count--; } } } }

// 合并相邻的节点 void mergeNode(Node* node) { if (node->next != NULL) { Node* nextNode = node->next; int i; for (i = 0; i < nextNode->count; i++) { node->count++; node->content[node->count] = nextNode->content[i]; if (node->count == MAX_SIZE) { node->next = nextNode->next; if (nextNode->next != NULL) { nextNode->next->prev = node; } free(nextNode); break; } } } }

// 显示整个小说 void displayNovel(Novel* novel) { Node* node = novel->head; while (node != NULL) { int i; for (i = 0; i < node->count; i++) { printf('%c', node->content[i]); } node = node->next; } printf("\n"); }

// 显示指定页面的内容 void displayPage(Novel* novel, int pageNo, int pageSize) { Node* node = novel->head; int count = 0; while (node != NULL && count < pageNo * pageSize) { count += node->count; node = node->next; } if (node != NULL) { int i, j; for (i = count - node->count, j = 0; j < pageSize && i < count; i++, j++) { printf('%c', node->content[i]); } printf("\n"); } }

// 搜索指定字符串并在小说中计数 int searchAndCount(Novel* novel, const char* str) { int count = 0; Node* node = novel->head; while (node != NULL) { int i; for (i = 0; i < node->count; i++) { int j; for (j = 0; j < strlen(str); j++) { if (node->content[i + j] != str[j]) { break; } } if (j == strlen(str)) { count++; } } node = node->next; } return count; }

// 替换小说中的指定字符串 void replaceString(Novel* novel, const char* str, const char* replacement) { Node* node = novel->head; while (node != NULL) { int i; for (i = 0; i < node->count; i++) { int j; for (j = 0; j < strlen(str); j++) { if (node->content[i + j] != str[j]) { break; } } if (j == strlen(str)) { deleteChars(node, strlen(str)); insertAfter(node, replacement); i += strlen(replacement) - 1; } } node = node->next; } }

// 保存小说到文件 void saveNovel(Novel* novel, const char* filename) { FILE* file = fopen(filename, "w"); if (file != NULL) { Node* node = novel->head; while (node != NULL) { int i; for (i = 0; i < node->count; i++) { fputc(node->content[i], file); } node = node->next; } fclose(file); printf("小说保存成功。\n"); } else { printf("无法保存小说。\n"); } }

// 从文件加载小说 void loadNovel(Novel* novel, const char* filename) { FILE* file = fopen(filename, "r"); if (file != NULL) { Node* node = createNode(); novel->head = node; while (!feof(file)) { char ch = fgetc(file); if (ch == EOF) { break; } node->content[node->count] = ch; node->count++; if (node->count == MAX_SIZE) { Node* newNode = createNode(); node->next = newNode; newNode->prev = node; node = newNode; } } novel->tail = node; fclose(file); printf("小说加载成功。\n"); } else { printf("无法加载小说。\n"); } }

// 统计小说中的单词数量 int countWords(Novel* novel) { int count = 0; Node* node = novel->head; while (node != NULL) { int i; for (i = 0; i < node->count; i++) { if (node->content[i] == ' ' || node->content[i] == '\n') { count++; } } node = node->next; } return count; }

// 统计小说中的数字数量 int countDigits(Novel* novel) { int count = 0; Node* node = novel->head; while (node != NULL) { int i; for (i = 0; i < node->count; i++) { if (node->content[i] >= '0' && node->content[i] <= '9') { count++; } } node = node->next; } return count; }

// 统计小说中的标点符号数量 int countPunctuation(Novel* novel) { int count = 0; Node* node = novel->head; while (node != NULL) { int i; for (i = 0; i < node->count; i++) { if (node->content[i] == '.' || node->content[i] == ',' || node->content[i] == ';' || node->content[i] == ':' || node->content[i] == '?' || node->content[i] == '!') { count++; } } node = node->next; } return count; }

int main() { Novel novel; novel.head = NULL; novel.tail = NULL; novel.numPages = 0; novel.currentPage = 0;

int choice;
do {
    printf("\n--- 小说编辑器 ---\n");
    printf("1. 插入\n");
    printf("2. 删除\n");
    printf("3. 显示\n");
    printf("4. 显示页面\n");
    printf("5. 搜索和计数\n");
    printf("6. 替换\n");
    printf("7. 保存\n");
    printf("8. 加载\n");
    printf("9. 统计单词/数字/标点符号\n");
    printf("10. 退出\n");
    printf("请输入您的选择: ");
    scanf("%d", &choice);
    printf("\n");

    char str[MAX_SIZE];
    int pageNo, pageSize, numChars;
    char filename[100];
    char replacement[MAX_SIZE];

    switch (choice) {
        case 1:
            printf("请输入要插入的字符串: ");
            getchar();
            fgets(str, MAX_SIZE, stdin);
            insertAfter(novel.tail, str);
            break;
        case 2:
            printf("请输入要删除的字符数: ");
            scanf("%d", &numChars);
            deleteChars(novel.tail, numChars);
            mergeNode(novel.tail);
            break;
        case 3:
            displayNovel(&novel);
            break;
        case 4:
            printf("请输入页面编号: ");
            scanf("%d", &pageNo);
            printf("请输入页面大小: ");
            scanf("%d", &pageSize);
            displayPage(&novel, pageNo, pageSize);
            break;
        case 5:
            printf("请输入要搜索的字符串: ");
            getchar();
            fgets(str, MAX_SIZE, stdin);
            int count = searchAndCount(&novel, str);
            printf("计数: %d\n", count);
            break;
        case 6:
            printf("请输入要替换的字符串: ");
            getchar();
            fgets(str, MAX_SIZE, stdin);
            printf("请输入替换字符串: ");
            fgets(replacement, MAX_SIZE, stdin);
            replaceString(&novel, str, replacement);
            break;
        case 7:
            printf("请输入要保存的文件名: ");
            scanf("%s", filename);
            saveNovel(&novel, filename);
            break;
        case 8:
            printf("请输入要加载的文件名: ");
            scanf("%s", filename);
            loadNovel(&novel, filename);
            break;
        case 9:
            printf("单词数量: %d\n", countWords(&novel));
            printf("数字数量: %d\n", countDigits(&novel));
            printf("标点符号数量: %d\n", countPunctuation(&novel));
            break;
        case 10:
            printf("正在退出...\n");
            break;
        default:
            printf("无效的选择,请重试。\n");
            break;
    }
} while (choice != 10);

return 0;

}

C语言小说编辑器实现:基础功能与中文注释

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

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