#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Word
{
char sEnglish[20]; //英文单词
char sChinese[40]; //中文意思
char sWordKind[10]; //词性
struct Word* pNext; //指向下一个节点指针
};
struct Word* pShead = NULL;//链表头指针
struct Word* pSSearch;//用于查询信息的指针
struct Word* pSFormer;//用于保存前一个节点的指针
struct Word* pSToThis;//用于指向新开辟的节点
//===============================菜单函数================================
char Menu()
{
char nChoose;
printf("-------------------------------------------------------------\n");
printf("| 欢迎使用英汉辞典 |\n");
printf("-------------------------------------------------------------\n");
printf("| |\n");
printf("| a.单词查询 |\n");
printf("| b.添加单词 |\n");
printf("| c.退出系统 |\n");
printf("| |\n");
printf("|请选择功能: |\n");
scanf("%c", &nChoose);
return nChoose;
}
//==============================查询单词函数============================
void Search()
{
char nChoose;
int nCheck = 0;//用于判断是否查询到单词
char sSearchWord[20];//需要查询的单词
while (1)
{
printf("-------------------------------------------------------------\n");
printf("| 请输入需要查询的单词:\n");
scanf("%s", sSearchWord);
pSSearch = pShead;
while (pSSearch != NULL)
{
if (strcmp(pSSearch->sEnglish, sSearchWord) == 0)
{
nCheck = 1;
printf("-------------------------------------------------------------\n");
printf("| 英文单词:%s\n", pSSearch->sEnglish);
printf("| 词 性:%s\n", pSSearch->sWordKind);
printf("| 中文意思:%s\n", pSSearch->sChinese);
printf("-------------------------------------------------------------\n");
break;
}
pSSearch = pSSearch->pNext;
}
if (nCheck == 0)
{
printf("-------------------------------------------------------------\n");
printf("| 词库中不含该单词 |\n");
printf("-------------------------------------------------------------\n");
}
printf("是否继续?(Y/N)\n");
getchar();
scanf("%c", &nChoose);
if (nChoose=='N'||nChoose=='n')
{
break;
}
}
}
//==============================添加单词函数============================
void Insert()
{
char nChoose;
char sEnglish[20]; //英文单词
char sChinese[40]; //中文意思
char sWordKind[10]; //词性
while (1)
{
printf("-------------------------------------------------------------\n");
printf("| 请输入英文单词:\n");
scanf("%s", sEnglish);
printf("| 请输入中文意思:\n");
scanf("%s", sChinese);
printf("| 请输入词性:\n");
scanf("%s", sWordKind);
pSToThis = (struct Word*)malloc(sizeof(struct Word));//开辟一个新节点来保存信息
//将刚输入的信息保存到节点中
strcpy(pSToThis->sEnglish, sEnglish);
strcpy(pSToThis->sChinese, sChinese);
strcpy(pSToThis->sWordKind, sWordKind);
pSToThis->pNext = NULL;//指向下一个节点的指针置空,即放在链表最后
if (pShead == NULL)//判断头指针是否指空,
{
pShead = pSToThis;//如果指空,则表示链表为空,头指针指向新加的节点
}
else
{
pSSearch = pShead;//从链表头开始遍历找到链表的最后一个节点
while (pSSearch != NULL)//如果指向当前的节点不为空,则循环
{
pSFormer = pSSearch;//让指向前一个节点的指针指向当前找到的节点
pSSearch = pSSearch->pNext;//指向当前的节点指向下一个节点
}
pSFormer->pNext = pSToThis;//原最后一个节点指向下一个节点的指针指向下一个节点
}
printf("-------------------------------------------------------------\n");
printf("| 新单词添加成功! |\n");
printf("-------------------------------------------------------------\n");
printf("|英文单词:%s\n", pSToThis->sEnglish);
printf("|词 性:%s\n", pSToThis->sWordKind);
printf("|中文意思:%s\n", pSToThis->sChinese);
printf("-------------------------------------------------------------\n");
printf("是否继续?(Y/N)\n");
getchar();
scanf("%c", &nChoose);
if (nChoose == 'N' || nChoose == 'n')
{
break;
}
}
}
//==============================拆分单词的函数==========================
int GetWord(int w, char str[], int n, char cC[], int m)
{
int i;
for (i = 0; w + i < 1000; i++)
{
if (str[w + i] == '-')
{
cC[i] = '\0';//第一个;前面存储的姓名信息
w = w + i + 1;//r用于记录读取的一行,数据处理到第几位
break;
}
cC[i] = str[w + i];//在不是;的时候将值赋给需要存储的变量
}
return w;//将变化的r值返回,用于下一次调用
}
//==============================读取信息函数============================
void Read()
{
int i;
int r = 0;
char str[200]; //读取一行字符串
char sEnglish[20]; //英文单词
char sChinese[40]; //中文意思
char sWordKind[10]; //词性
FILE *fp;
if ((fp = fopen("Word.txt", "r")) == NULL)
{
printf("-------------------------------------------------------------\n");
printf("| |\n");
printf("| 暂无词库数据记录 |\n");
printf("| |\n");
printf("-------------------------------------------------------------\n");
}
else
{
while (fgets(str, 200, fp))
{
r = 0;//记录一行数据读取到哪一位
r = GetWord(r, str, 1000, sEnglish, 20);//调用子函数拆分数据
r = GetWord(r, str, 1000, sChinese, 20);
r = GetWord(r, str, 1000, sWordKind, 40);
pSToThis = (struct Word*)malloc(sizeof(struct Word));//开辟一个新节点来保存信息
//将刚输入的信息保存到节点中
strcpy(pSToThis->sEnglish, sEnglish);
strcpy(pSToThis->sChinese, sChinese);
strcpy(pSToThis->sWordKind, sWordKind);
pSToThis->pNext = NULL;//指向下一个节点的指针置空
//将新读取出的信息插入链表中
if (pShead==NULL)//如果头指针指向空
{
pShead = pSToThis;//头指针指向新节点
pSFormer = pSToThis;//记录前一个节点的指针指向当前节点
}
else
{
pSFormer->pNext = pSToThis;//将新的节点添加在上一个节点的后面
pSFormer = pSToThis;//记录前一个节点的指针指向当前节点
}
}
printf("-------------------------------------------------------------\n");
printf("| |\n");
printf("| 词库数据装载成功 |\n");
printf("| |\n");
printf("-------------------------------------------------------------\n");
fclose(fp);
}
}
//==============================保存信息函数============================
void Save()
{
FILE *fp;//读取文件
fp = fopen("Word.txt", "w");//打开文件。w代表写入操作
pSSearch = pShead;//从链表头开始,逐个节点保存信息
while (pSSearch!=NULL)
{
fputs(pSSearch->sEnglish, fp);
fputs("-", fp);
fputs(pSSearch->sChinese, fp);
fputs("-", fp);
fputs(pSSearch->sWordKind, fp);
fputs("-", fp);
fputs("\n", fp);
pSSearch = pSSearch->pNext;//指向下一个节点
}
fclose(fp);
}
//主函数
int main()
{
char nChoose2;
int nChoose;
int nEnd = 1;
Read();
while (nEnd)
{
nChoose = Menu();
switch (nChoose)
{
case 'c':
printf("是否将系统单词保存到文件?(Y/N)\n");
getchar();
scanf("%c", &nChoose2);
if (nChoose2=='Y'||nChoose2=='y')
{
Save();
}
nEnd = 0;
break;
case 'a':
Search();
break;
case 'b':
Insert();
break;
default:
printf("-------------------------------------------------------------\n");
printf("| 错误的选项号 |\n");
printf("-------------------------------------------------------------\n");
break;
}
}
return 0;
}
【数据结构课设】英汉互译词典
最新推荐文章于 2023-02-07 11:14:11 发布