先说问题吧,代码在下面:
1.导入文本文件里的单词显示成功了,但是打印的话只会显示出一个问号
2.在使用主函数的删除和查找方法时,不能正常输入
3.肯定还会有问题,希望大家可以看一看,帮忙找一下
谢谢了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//数据类型为:
typedef struct _Item
{
char *eng;
char *note;
}ITEM, *PITEM;
///结点类型为:
typedef struct _Node
{
ITEM data;
struct _Node *next;
}NODE, *PNODE;
//单链表类型为:
typedef struct _Dict
{
struct _Node node;
PNODE head;
PNODE next;
PNODE last;
}DICT, *PDICT;
char* Find(PDICT dict, char *english);
int Load(PDICT dict, char *fromFile);
int Delete(PDICT dict, char *english);
int Insert(PDICT dict, PITEM item);
int SaveAs(PDICT dict);
int Init(PDICT dict1,PDICT dict2);
void ShowHist(PDICT pdict1);
int main(void){
PDICT pdict;
pdict=(PDICT)malloc(sizeof(struct _Node));
PDICT pdict1;
pdict1=(PDICT)malloc(sizeof(struct _Node));
PITEM pitem;
char *fromFile;//这个我觉得是作为一个地址指针传到Load方法里在打开文件里使用(相当于FILE *fp里的fp),但是 传进去之后(FILE fronfile)显示类型不能转换,就没有用,直接在方法里 (FILE *fp)
int r;
r=Init(pdict,pdict1);
if(r==0){
printf("初始化成功!!!\n");
}
while(-1){
int a;
printf("==================================\n");
printf("1——初始化\n");
printf("2——导入单词表\n");
printf("3——插入单词\n");
printf("4——删除单词\n");
printf("5——保存修改\n");
printf("6——查看历史记录\n");
printf("7——查找单词\n");
printf("==================================\n");
printf("Select:");
scanf("%d",&a) ;
switch(a){
case 1:
Init(pdict,pdict1);//这个函数我看了,没问题的
break;
case 2:
r= Load(pdict, fromFile);
if(r==0){
printf("导入完成.\n");
printf("%c\n",pdict->next->data.note);
}
break;
case 3:
printf("请输入要插入的单词:");
scanf("%c",pitem->eng);
printf("请输入该单词的翻译:");
scanf("%c",pitem->note);
int m;
m=Insert(pdict, pitem);
if(m==0){
printf("插入成功!!!");
}else{
printf("该单词已存在!!!");
}
break;
case 4:
printf("请输入要删除的单词:");
char english1[20];
scanf("%s",&english1);
r = Delete(pdict,english1);
if(r==0){
printf("删除成功!!!");
}else{
printf("没找到相关单词!!!");
}
break;
case 5:
r=SaveAs(pdict);
if(r==0){
printf("保存成功!!!");
}
break;
case 6:
ShowHist(pdict1);
break;
case 7:
char english2[20];
printf("请输入要查找的单词:");
scanf("%s",&english2);
char *s;
s=Find(pdict,english2);
printf("%c",s);
pdict1->node.data.note=s;
pdict1->node.data.eng=english2;
break;
}
}
return 0;
}
//初始化pdict(主链表),pdict1(作为收录查询单词的链表)为空表
int Init(PDICT dict1,PDICT dict2)
{
PNODE pnode1;
PNODE pnode2;
pnode1 = (struct _Node*)malloc(sizeof(struct _Node));
pnode2 = (struct _Node*)malloc(sizeof(struct _Node));
dict1->head=pnode1;
dict1->head->next=NULL;
dict1->last=dict1->head;
dict2->head=pnode1;
dict2->head->next=NULL;
dict2->last=dict2->head;
return 0;
}
//是将filename代表的cet4word.txt文件的内容读入单链表dict中,所有结点按英文单词的字典序升序排列。若成功,返回0,若失败返回值自定义
int Load(PDICT dict, char *fromFile){
FILE *fp;
PNODE pnode1,pnode2,pnode3;
pnode1 = (struct _Node*)malloc(sizeof(struct _Node));
pnode2 = (struct _Node*)malloc(sizeof(struct _Node));
pnode3 = (struct _Node*)malloc(sizeof(struct _Node));
dict->head=pnode1;
dict->head->next=pnode2;
dict->last=pnode2;
fp = fopen("D:\\Develop\\c语言\\C练习\\cet4word.txt","r");
char ch;
//每一个单词后面都会有一个逗号,而且在翻译后面会换行,所以设计如下算法
while(EOF != (ch= fgetc(fp))){//判断是不是逗号,不是的话输出
if(ch!=44){
//putchar(ch);
pnode2->data.eng=&ch;
}else
{//遇到逗号了,进行循环
while(ch!='\n')//直到识别出回车
{
ch=fgetc(fp);//遇到回车,循环终止,带着现在字符的位置回到大循环继续
//putchar(ch);
pnode2->data.note=&ch;
pnode2->next=pnode3;
dict->last=pnode3;
pnode2=pnode3;
}
printf("\n");
}
}
pnode2->next=NULL;
fclose(fp);
return 0;
}
//将item代表的一个词条按升序插入到单链表dict中。若成功,返回0,否则返回值自定义
int Insert(PDICT dict, PITEM item){
PNODE pnode1,pnode2;
pnode1 = (struct _Node*)malloc(sizeof(struct _Node));
pnode2 = (struct _Node*)malloc(sizeof(struct _Node));
pnode1=dict->head;
while(-1){
int m;
m=strcmp(pnode1->next->data.eng,item->eng);
if(m<0){
pnode1=pnode1->next;
}else if(m=0){
return -1;
break;
}else{
pnode2->data.eng=item->eng;
pnode2->data.note=item->note;
pnode2=pnode1->next;
pnode1->next=pnode2;
return 0;
break;
}
}
}
//删除dict中某个单词对应的词条,不需要返回被删除的内容。若成功返回0,若失败返回值自行定义
int Delete(PDICT dict, char *english){
PNODE p1,p2;
dict->head=p1;
p1=(PNODE)malloc(sizeof(struct _Node));
p2=(PNODE)malloc(sizeof(struct _Node));
while(p1 !=NULL){
if(p1->next->data.eng == english){
p2=p1->next;
p1->next=p2->next;
p2=NULL;
return 0;
break;
}
p1=p1->next;
}
return -1;
}
//将变化后的词典保存到一个文本文件中,格式自定义
int SaveAs(PDICT dict){
FILE *fp;
fp=fopen("D:\\Develop\\c语言\\C练习\\更新后的文件","w+");
fputs(dict->next->data.eng,fp);
fclose(fp);
return 0;
}
//显示查词典的历史记录,按时间从近到远排列
void ShowHist(PDICT dict){
PNODE pnode;
pnode = (PNODE)malloc(sizeof(struct _Node));
dict->head=pnode;
while(pnode!=NULL){
printf("%s",*pnode->data.eng);
printf("%s",*pnode->data.note);
pnode=pnode->next;
}
}
//在dict中精确查找英文单词english,若存在对应的词条,返回其note部分,否则返回NULL
char* Find(PDICT dict, char *english){
PNODE p;
p=(PNODE)malloc(sizeof(struct _Node));
dict->head=p;
while(p != NULL)
{
if(p->data.eng == english){
return p->data.note;
break;
}
p=p->next;
}
return NULL;
}