当前位置:   article > 正文

数据结构实验三预习报告

数据结构实验三预习报告

一、实验内容

二、实验要求

三、实现提示:

四、实验方案及其论证

五、伪代码

六、源码


一、实验内容

  • 对于一篇给定的英文文章,分别利用线性表和二叉排序树来实现单词频率的统计,实现低频词的过滤,并比较两种方法的效率。具体要求如下:

二、实验要求

  1. 读取英文文章文件(Infile.txt),识别其中的单词。
  2. 分别利用线性表和二叉排序树构建单词的存储结构。当识别出一个单词后,若线性表或者二叉排序树中没有该单词,则在适当的位置上添加该单词;若该单词已经被识别,则增加其出现的频率。
  3. 统计结束后,删除出现频率低于五次的单词,并显示该单词和其出现频率。
  4. 其余单词及其出现频率按照从高到低的次序输出到文件中(Outfile.txt),同时输出用两种方法完成该工作所用的时间。
  5. 计算查找表的ASL值,分析比较两种方法的效率。
  6. 系统运行后主菜单如下: 
  •  
  • 当选择1后进入以下界面:

  • 其中选择2时显示利用线性表来实现所有功能所用的时间。

    当在主菜单选择2二叉排序树后,进入的界面与上图类同。

三、实现提示:

1、在统计的过程中,分词时可以利用空格或者标点符号作为划分单词依据,文章中默认只包含英文单词和标点符号。

2、对单词进行排序时,是按照字母序进行的,每个结点还应包含该单词出现的频率。

3、存储结构的定义

  • 二叉排序树的存储表示
  • typedef struct BSTNode{

    string  WordName;           //单词名称

       int count;                        //单词出现频率

    struct BSTNode *next;

    } BSTNode, *BSTree;

    4、实现过程可参见教材上线性表和二叉排序树的相关算法。

四、实验方案及其论证

 语言:C

      运行环境:C-Free5.0

      可行性分析:建立单链表存储InFile.txt英语文章单词及频率,建立二叉排序树存储InFile.txt英语文章单词和频率,分别实现单词统计,删除频率低的单词,输出其余单词,并计算ASL值。

五、伪代码

线性表实现伪代码

  1. double LLNode(int M)
  2. {// 统计文章 InFile.txt 中的单词
  3. printf("**************************************\n");
  4. FILE *fp;
  5. char ch,array[1000][20];int i=0,j=0,k=0,jj;
  6. fp=fopen("InFile.txt","r");// 打开文件
  7. if (fp==NULL){ printf("cannot open file\n");exit(0);}
  8. LNode *L,*P,*Q;// 定义结构指针
  9. L=Q=(LNode *)malloc(sizeof(LNode));L->next=NULL;
  10. while((ch=fgetc(fp))!=EOF)
  11. {
  12. if(ch=='-'||ch=='\'')continue;//
  13. else if(ch<65||(ch>90&&ch<97)||ch>122)// 单词
  14. {
  15. if(j==0)continue;// 输入的是空格或数字或符号
  16. if(L->next){// 第二个以后的单词进入单链表
  17. P=(LNode *)malloc(sizeof(LNode));array[i][j]=0;
  18. for(jj=0;array[i][jj]!='\0';jj++)
  19. P->Wordname[jj]=array[i][jj];
  20. P->Wordname[jj]='\0';P->count=1;P->next=NULL;
  21. while(1)
  22. {
  23. if(strcmp(Q->next->Wordname,P->Wordname)!=0) Q=Q->next;
  24. else {Q->next->count++;break;}// 有相同的单词6
  25. if(!Q->next){Q->next=P;break;}// 没有相同的单词
  26. }if(M==1)printf(" %s",array[i]);
  27. }
  28. else {// 第一个单词 ,头结点无数据
  29. P=(LNode *)malloc(sizeof(LNode));array[i][j]=0;
  30. for(jj=0;array[i][jj]!='\0';jj++)
  31. P->Wordname[jj]=array[i][jj];
  32. P->Wordname[jj]='\0';P->count=1;P->next=NULL;L->next=P;
  33. if(M==1)printf("%s",array[i]);
  34. }
  35. i++;j=0;Q=L;//Q 指向头结点
  36. }
  37. else if(ch>64&&ch<91)array[i][j++]=ch+32;// 大写字母
  38. else array[i][j++]=ch;
  39. }
  40. if(M==1)printf("\n 单词数: %d\n",i);
  41. if(M==1||M==2||M==3)k=wordscount(Q,M);
  42. if(M==1||M==2||M==4||M==5)L=deletelow(L,M);
  43. if(M==1||M==2||M==5)k=tjsyword(L,M);
  44. return (k+1)/2.0;
  45. }

二叉排序树实现伪代码

  1. int STBNode(int m)
  2. {
  3. printf("**************************************\n");
  4. FILE *fp;
  5. char ch[40],cc[20];int i=0,j=0,l=1;double kk=1;
  6. BSTree *B,*SS,*T,*N,*M;
  7. T=B=(BSTree* )malloc(sizeof(BSTree));
  8. fp=fopen("InFile.txt","r");// 打开文件
  9. if (fp==NULL){ printf("cannot open file\n");exit(0);}
  10. fscanf(fp,"%s",cc);// 取出根节点
  11. for(i=0;cc[i]!='\0';i++)
  12. if(cc[i]>64&&cc[i]<91)cc[i]=cc[i]+32;
  13. strcpy(B->wordname,cc);
  14. B->count=1;B->lchild=B->rchild=NULL;
  15. if(m==1)printf("%s ",B->wordname);
  16. while(fscanf(fp,"%s",ch)!=EOF)
  17. {
  18. j=0;
  19. for(i=0;ch[i]!='\0';i++)
  20. {// 单词处理
  21. if(ch[i]=='-'||ch[i]=='\'')continue;
  22. if(ch[i]>64&&ch[i]<91)cc[j++]=ch[i]+32;
  23. else if(ch[i]>96&&ch[i]<123)cc[j++]=ch[i];
  24. else {// 连续多个单词在一起时
  25. cc[j]='\0';j=0;
  26. if(cc[0]!='\0'){
  27. SS=(BSTree* )malloc(sizeof(BSTree));
  28. SS->lchild=SS->rchild=NULL;SS->count=1;
  29. strcpy(SS->wordname,cc);
  30. if(m==1)printf("%s ",cc);l++;
  31. N=seachbstree(B,cc);// 到树中比较,返回访问树的最后一个节点;
  32. if(N==NULL)continue;
  33. if(!N->lchild||!N->rchild)// 插入到树中
  34. {
  35. if(strcmp(N->wordname,SS->wordname)>0){N->lchild=SS;kk++;}
  36. else
  37. if(strcmp(N->wordname,SS->wordname)<0){N->rchild=SS;kk++;}
  38. }B=T;
  39. }
  40. }
  41. }cc[j]='\0';
  42. if(cc[0]!='\0')
  43. {// 读入的是单个单词时
  44. SS=(BSTree* )malloc(sizeof(BSTree));
  45. SS->lchild=SS->rchild=NULL;SS->count=1;
  46. N=seachbstree(B,cc);
  47. if(m==1)printf("%s ",cc);l++;
  48. if(N==NULL)continue;
  49. strcpy(SS->wordname,cc);
  50. if(!N->lchild||!N->rchild)// 插入到树中
  51. {
  52. if(strcmp(N->wordname,SS->wordname)>0){N->lchild=SS;kk++;}
  53. else if(strcmp(N->wordname,SS->wordname)<0){N->rchild=SS;kk++;}
  54. }
  55. B=T;
  56. }
  57. }
  58. if(m==1)printf("\n 单词数: %d",l);
  59. M=(BSTree* )malloc(sizeof(BSTree));
  60. if(m==3){asl=LevelOrderTraverse(T)/kk;
  61. printf(" 单词种数: %d\n",(int)kk);}
  62. if(m==4||m==5||m==2)
  63. {
  64. deleteLOW(M,T,m);
  65. if(m==5||m==2)
  66. {
  67. FILE *fp=fopen("OutFile1.txt","w");
  68. clock_t start=clock();
  69. InOrderTraverse(L,m,fp);
  70. clock_t end=clock();
  71. if(m==5){printf(" 高频词个数: %d\n",(int)gp);
  72. asl=LevelOrderTraverse(L)/gp;gp=0;}
  73. printf("\ntime:%.3fs\n",double(end-start)/CLOCKS_PER_SEC);
  74. fprintf(fp,"\ntime:%.3fs\n",double(end-start)/CLOCKS_PER_SEC);
  75. fclose(fp);
  76. }
  77. }
  78. }

六、源码

https://blog.csdn.net/qq_52934831/article/details/118164928

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/427319
推荐阅读
相关标签
  

闽ICP备14008679号