統計該短文中不同單詞和它的出現次數

本程序從正文文件text.in讀入一篇英文短文,統計該短文中不同單詞和它的出現次數,並按詞典編輯順序將單詞及它的出現次數輸出到正文文件word.out中.
程序用一棵有序二叉樹存儲這些單詞及其出現的次數,一邊讀入一邊建立.然後中序遍歷該二叉樹,將遍歷經過的二叉樹上的節點的內容輸出.
程序中的外部函數
int getword(FILE* pFile,char* pszWordBuffer,int nBufferLen);
從與pFile所對應的文件中讀取單詞置入pszWordBuffer,並返回1;若單詞遇文件尾,已無單詞可讀時,則返回0.



// testtest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//
// #include <iostream>
// #include <istream>
// #include <ostream>
// #include <ios>
//
// using   namespace   std;


#include <stdio.h>
#include <malloc.h>
#include <ctype.h>
#include <string.h>
 
#define SOURCE_FILE "text.in"
#define OUTPUT_FILE "word.out"
#define MAX_WORD_LEN 128
 
typedef struct treenode
{
      char szWord[MAX_WORD_LEN];
      int nCount;
      struct treenode* pLeft;
      struct treenode* pRight;
}BNODE;
 
int getword(FILE* pFile,char* pasWordBuffer,int nBufferLen)
{
    int result = 0;
    result = fscanf(pFile, "%s", pasWordBuffer);
    if(EOF == result || 0 == result)
        result = 0;
    else
        result = 1;

    return result;
}
 
void binary_tree(BNODE** ppNode,char* pszWord)
{
    BNODE* pCurrentNode = NULL; //
    BNODE* pMemoNode = NULL; //
    int nStrCmpRes = 0; //

      if(ppNode != NULL && pszWord != NULL)
      {
//              BNODE* pCurrentNode = NULL;
//              BNODE* pMemoNode = NULL;
//              int nStrCmpRes=0;
 
             pCurrentNode = *ppNode; //____(1)_____
 
             while(pCurrentNode)
             {
                    /*尋找插入位置*/
                    nStrCmpRes = strcmp(pszWord, pCurrentNode->szWord); //___(2)___
 
                    if(!nStrCmpRes)
                    {
                           pCurrentNode->nCount++; //___(3)___
 
                           return;
                    }
                    else
                    {
                           pMemoNode=pCurrentNode;// ___(4)___
                           pCurrentNode = nStrCmpRes>0? pCurrentNode->pRight : pCurrentNode->pLeft;
                    }
             }
      }
 
      pCurrentNode = new BNODE;
 
      if(pCurrentNode != NULL)
      {
             memset(pCurrentNode,0,sizeof(BNODE));
             strncpy(pCurrentNode->szWord,pszWord,MAX_WORD_LEN-1);
             pCurrentNode->nCount=1;
      }
 
      if(pMemoNode==NULL)
      {
             *ppNode= pCurrentNode; // ___(5)___
      }
      else if(nStrCmpRes>0)
      {
             pMemoNode->pRight=pCurrentNode;
      }
      else
      {
             pMemoNode->pLeft=pCurrentNode;
      }
}
 
void midorder(FILE* pFile,BNODE* pNode)
{
      if(!pNode||!pFile) return; //___(6)___
 
      midorder(pFile,pNode->pLeft);
      fprintf(pFile,"%s %d/n",pNode->szWord,pNode->nCount);
      midorder(pFile,pNode->pRight);
}
 
void main()
{
      FILE* pFile=NULL;
      BNODE* pRootNode=NULL;
      char szWord[MAX_WORD_LEN]={0};
 
      pFile=fopen(SOURCE_FILE,"r");
 
      if(pFile==NULL)
      {
             printf("Can't open file %s/n",SOURCE_FILE);
             return;
      }
 
      while(getword(pFile,szWord,MAX_WORD_LEN) == 1)
      {
             binary_tree(&pRootNode,szWord);  // ___(7)___
      }
 
      fclose(pFile);
 
      pFile=fopen(OUTPUT_FILE,"w");
      midorder(pFile,pRootNode);
      fclose(pFile);
}
發佈了4 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章