
#include <stdafxh> //这行是VC编译时要的头文件,你若TC就不要本行了
#include <stdioh>
typedef struct dictnode{char key; char value; dictnode pre; dictnode next;} DictNode;
DictNode pHead = NULL;
//(1)make:构造空的字典
int make()
{
if(pHead)return -1;
pHead = (DictNode)malloc(sizeof(DictNode));
memset(pHead,0,sizeof(DictNode));
pHead->pre = pHead;
pHead->next = pHead;
return 0;
}
//(2)size:返回字的字典中记录数
int size()
{
int i;
DictNodep;
for(i=0,p=pHead; p->next!=pHead; p=p->next,i++);
return i;
}
//(3)IsEmpy:如果字典为空则返回真,否则返回假
int IsEmpy()
{
return (pHead->pre==pHead);
}
//(4)Clear:将字典重置为空
void Clear()
{
DictNode p,ptmp;
for(p=pHead->next; p!=pHead ; )
{
ptmp = p;
p = p->next;
free(ptmp->key);
free(ptmp->value);
free(ptmp);
}
pHead->next = pHead->pre = pHead;//最后一个空节点也是第一个节点
}
//(5)Insert:插入记录到字典
int Insert(char key,charvalue)
{
DictNode p, ptmp;
if(!key||!value||!key||!value) return -100;//调用错误
ptmp = (DictNode)malloc(sizeof(DictNode));
if(!ptmp) return -2; //内存不足这种极端的情况很难出现,但有可能
memset(ptmp,0,sizeof(DictNode));
ptmp->key =(char) malloc(strlen(key)+1);
if(!ptmp->key){free(ptmp);return -2;} //内存不足这种极端的情况很难出现,但有可能
strcpy(ptmp->key,key);
ptmp->value = (char)malloc(strlen(value)+1);
if(!ptmp->value){free(ptmp->key);free(ptmp); return -2;} //内存不足这种极端的情况很难出现,但有可能
strcpy(ptmp->value,value);
for(p=pHead->next; p->next!=pHead; p=p->next) if(p->key&&!strcmp(p->key,key)) return 1;//记录存在,插入失败
ptmp->next = pHead; pHead->pre = ptmp;
ptmp->pre = p; p->next = ptmp;
return 0;// *** 作成功返回0
}
//(6)remove:与给定关键字的记录相同则删除,该记录被返回,否则字典保持不变
DictNode remove(char key)
{
DictNode p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
if(p==pHead) return NULL;
p->pre->next = p->next;
p->next->pre = p->pre;
p->pre = p->next = NULL;
return p;//结点p的空间(key value p三个)没有释放,外面要接收返回值并主动释放结点空间或做别的处理如插入另一表中等
}
//(7)IsPrensent:如果存在与给定关键字匹配的记录则返回真,否则返回假
int IsPrensent(char key)
{
DictNode p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
return (p!=pHead);
}
//(8)Find:如果存在与给定关键字相同的记录,则返回记录;如果没有找到,则返回空
DictNode Find(char key)
{
DictNode p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
if(p==pHead) return NULL;
return p; //不要对Find返回的记录key值做变更,value值可以修改,value加长时要重新分配空间。因为记录还在字典链表中
}
void main()
{
const char prtstr = "";
DictNode ptmp;
char keybuf[80];
char valuebuf[1024];
int c;
make();
while(1)
{
system("cls");//清屏
printf("%s 选择菜单 %s",prtstr,prtstr);
printf("\n\tF---词条查找\n\tI---插入新词条\n\tR---删除词条\n\tC---清空字典\n\tS---显示字典词条数\n\tQ---退出\n");
printf("请选择 *** 作菜单:");
fflush(stdin);
c = getchar();
if(c>='a'&&c<='z') c -= ('a'-'A');//换大写
if(c!='F'&&c!='I'&&c!='R'&&c!='C'&&c!='S'&&c!='Q') continue;
fflush(stdin);
switch(c)
{
case 'F':
printf("词条查找:\n请输入Key值:");scanf("%s",keybuf);
fflush(stdin);
ptmp = Find(keybuf);
if(ptmp){printf("Key:%s Value:%s",ptmp->key,ptmp->value);}
else{printf("没找到词条:%s,你可以先选择插入这个新词条",keybuf);}
break;
case 'I':
printf("插入新词条:\n请输入Key值:");scanf("%s",keybuf);
fflush(stdin);
if(IsPrensent(keybuf)){printf("词条%s已存在\n",keybuf);}
else
{
printf("请输入它的解释:");gets(valuebuf);
if(!Insert(keybuf,valuebuf))printf("插入成功\n");
else printf("插入失败\n");
}
break;
case 'R':
printf("删除词条:\n请输入Key值:");scanf("%s",keybuf);
fflush(stdin);
ptmp = remove(keybuf);
if(ptmp)
{
free(ptmp->value);free(ptmp->key);free(ptmp);
printf("记录key:[%s]已删除\n",keybuf);
}
else
printf("未找到待删除的记录key:[%s]\n",keybuf);
break;
case 'C':
printf("清空字典:\n真的要清吗\n请输入Yes以确认删除 *** 作(首字母大写):");scanf("%s",keybuf);
fflush(stdin);
if(strcmp(keybuf,"Yes")){printf("放弃了清空 *** 作\n");}
else {Clear();printf("Ok,你坚持 *** 作,现在字典已清空了\n");}
break;
case 'S':
printf("显示字典词条数:\n当前词条总数:%d\n", size());
break;
case 'Q':
Clear(); free(pHead);
printf("Byebye");
exit(0);
}
printf("\n按回车键继续");
fflush(stdin);
getchar();
}
}
//VC71 下调试通过,运行功能正常
告诉你个简单的办法,下载2到3个版本的“幻影WiFi”用手机电脑都可以下载,下载下来以后,打开软件里面自带了很多种密码字典,而且还可以自己编辑密码字典。并且编辑起来非常简单!字典在文件管理里面可以看到!
如果我的回答对你有帮助,请采纳!
以上就是关于用c语言编写电子英汉词典。全部的内容,包括:用c语言编写电子英汉词典。、用什么软件可以检测wifi的安全性。、急急急!!!!用c语言实现字典 要求:用无序双向循环链表实现字典的基本 *** 作如下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)