qq_53893977 2021-10-05 18:40 采纳率: 41.7%
浏览 113
已结题

利用单链表做一个字典,有一些问题,希望大家可以看一下

先说问题吧,代码在下面:
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;
}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月13日
    • 创建了问题 10月5日

    悬赏问题

    • ¥15 35114 SVAC视频验签的问题
    • ¥15 impedancepy
    • ¥15 在虚拟机环境下完成以下,要求截图!
    • ¥15 求往届大挑得奖作品(ppt…)
    • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
    • ¥50 浦育平台scratch图形化编程
    • ¥20 求这个的原理图 只要原理图
    • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
    • ¥20 微信的店铺小程序如何修改背景图
    • ¥15 UE5.1局部变量对蓝图不可见