简易英文词典

本文详细描述了一个英文单词字典的数据结构和算法,包括插入、删除、搜索以及按字典顺序显示的功能,使用C语言实现,涉及链表操作和内存管理。
摘要由CSDN通过智能技术生成

一、问题分析:

是否能成功插入英文单词?

插入后是否保持词典按字母顺序排列?

是否能正确处理多次插入?

是否能成功删除词典中存在的英文单词?

是否能正确处理删除词典中不存在的单词?

删除后是否保持词典按字母顺序排列?

是否能够正确搜索词典中存在的英文单词?

是否能正确处理搜索词典中不存在的单词?

二、主要算法描述--原型:

  1. 插入算法:

输入:要插入的英文单词word

算法:

创建一个新的节点newNode,并将word存储在其中。

遍历词典链表,找到合适的位置插入 'newNod

将 'newNo

  1. 删除算法:

输入:要删除的英文单词 '

算法:

遍历词典链表,找到要删除的节点 'tar

如果找到了节点,将其从链表中移除并释放内存。

  1. 搜索算法:

输入:要搜索的英文单词word

输出:若单词存在,返回true;否则,返回false

算法:

遍历词典链表,查找是否存在单词等于 'word

若找到,返回 '

  1. 按字典顺序显示算法:

算法:

遍历词典链表,按顺序输出每个节点的单词。

  • 主要算法思路--条列式:
  1. 插入算法思路:

创建一个新的节点,存储要插入的英文单词。

遍历词典链表,找到合适的位置插入新节点,以保持字典的字母顺序。

  1. 删除算法思路:

遍历词典链表,找到要删除的节点。

如果找到了节点,将其从链表中移除并释放内存。

  1. 搜索算法思路:

遍历词典链表,查找是否存在单词等于搜索词的节点。

若找到,返回存在;否则,返回不存在。

  1. 按字典顺序显示算法思路:

遍历词典链表,按顺序输出每个节点的单词

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

// 结点定义
typedef struct Node {
    char word[50];
    struct Node* next;
} Node;

// 英文词典定义
typedef struct Dictionary {
    Node* head;
} Dictionary;

// 初始化词典
void initDictionary(Dictionary* dict) {
    dict->head = NULL;
}

// 插入单词
void insertWord(Dictionary* dict, const char* word) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        printf("内存分配失败。\n");
        exit(EXIT_FAILURE);
    }

    strcpy(newNode->word, word);
    newNode->next = NULL;

    Node** current = &(dict->head);

    // 找到合适的位置插入
    while (*current != NULL && strcmp(word, (*current)->word) > 0) {
        current = &((*current)->next);
    }

    newNode->next = *current;
    *current = newNode;
}

// 删除单词
int deleteWord(Dictionary* dict, const char* word) {
    Node** current = &(dict->head);

    // 找到要删除的节点
    while (*current != NULL && strcmp(word, (*current)->word) != 0) {
        current = &((*current)->next);
    }

    // 删除节点
    if (*current != NULL) {
        Node* temp = *current;
        *current = temp->next;
        free(temp);
        return 1; // 删除成功
    } else {
        return 0; // 删除失败(单词不存在)
    }
}

// 搜索单词
int searchWord(Dictionary* dict, const char* word) {
    Node* current = dict->head;

    // 在链表中搜索
    while (current != NULL) {
        if (strcmp(word, current->word) == 0) {
            return 1; // 找到了
        }
        current = current->next;
    }

    return 0; // 未找到
}

// 显示词典
void displayDictionary(Dictionary* dict) {
    Node* current = dict->head;

    printf("词典:\n");
    while (current != NULL) {
        printf("%s\n", current->word);
        current = current->next;
    }
}

// 清空输入缓冲区
void flushInputBuffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

// 从一行中提取单词
void extractWordsFromLine(char* line, Dictionary* dict) {
    char* token = strtok(line, " ");
    while (token != NULL) {
        if (strcmp(token, "0") == 0) {
            return;
        }
        insertWord(dict, token);
        token = strtok(NULL, " ");
    }
}

// 释放内存
void freeDictionary(Dictionary* dict) {
    Node* current = dict->head;
    Node* next;

    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }

    dict->head = NULL; // 将词典的头指针置为空
}

// 示例用法
int main() {
    Dictionary myDict;
    initDictionary(&myDict);

    int choice;
    char line[256];  // 改为使用字符数组读取一整行

    do {
        // 用户菜单
        printf("\n1. 插入单词\n");
        printf("2. 删除单词\n");
        printf("3. 搜索单词\n");
        printf("4. 按字典顺序显示\n");
        printf("0. 退出\n");

        printf("请选择操作(0-4): ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("请输入要插入的单词(多个单词用空格分隔,输入0结束): ");
                flushInputBuffer(); // 清空输入缓冲区
                fgets(line, sizeof(line), stdin);
                extractWordsFromLine(line, &myDict);
                break;
            case 2:
                printf("请输入要删除的单词: ");
                scanf("%s", line);
                if (deleteWord(&myDict, line)) {
                    printf("%s 删除成功。\n", line);
                } else {
                    printf("%s 不存在于词典中,删除失败。\n", line);
                }
                break;
            case 3:
                printf("请输入要搜索的单词: ");
                scanf("%s", line);
                if (searchWord(&myDict, line)) {
                    printf("%s 在词典中找到。\n", line);
                } else {
                    printf("%s 在词典中未找到。\n", line);
                }
                break;
            case 4:
                displayDictionary(&myDict);
                break;
            case 0:
                break;
            default:
                printf("无效的选择,请重新输入。\n");
        }

    } while (choice != 0);

    // 释放内存
    freeDictionary(&myDict);

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值