一、问题分析:
是否能成功插入英文单词?
插入后是否保持词典按字母顺序排列?
是否能正确处理多次插入?
是否能成功删除词典中存在的英文单词?
是否能正确处理删除词典中不存在的单词?
删除后是否保持词典按字母顺序排列?
是否能够正确搜索词典中存在的英文单词?
是否能正确处理搜索词典中不存在的单词?
二、主要算法描述--原型:
- 插入算法:
输入:要插入的英文单词word
算法:
创建一个新的节点newNode,并将word存储在其中。
遍历词典链表,找到合适的位置插入 'newNod
将 'newNo
- 删除算法:
输入:要删除的英文单词 '
算法:
遍历词典链表,找到要删除的节点 'tar
如果找到了节点,将其从链表中移除并释放内存。
- 搜索算法:
输入:要搜索的英文单词word
输出:若单词存在,返回true;否则,返回false
算法:
遍历词典链表,查找是否存在单词等于 'word
若找到,返回 '
- 按字典顺序显示算法:
算法:
遍历词典链表,按顺序输出每个节点的单词。
- 主要算法思路--条列式:
- 插入算法思路:
创建一个新的节点,存储要插入的英文单词。
遍历词典链表,找到合适的位置插入新节点,以保持字典的字母顺序。
- 删除算法思路:
遍历词典链表,找到要删除的节点。
如果找到了节点,将其从链表中移除并释放内存。
- 搜索算法思路:
遍历词典链表,查找是否存在单词等于搜索词的节点。
若找到,返回存在;否则,返回不存在。
- 按字典顺序显示算法思路:
遍历词典链表,按顺序输出每个节点的单词
#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;
}