程序用一棵有序二叉樹存儲這些單詞及其出現的次數,一邊讀入一邊建立.然後中序遍歷該二叉樹,將遍歷經過的二叉樹上的節點的內容輸出.
程序中的外部函數
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);
}