1. 程式人生 > >C++經典題目二:統計一篇英文文章中的單詞個數

C++經典題目二:統計一篇英文文章中的單詞個數

要求:統計處一篇英文文章中的不同的單詞,並得到單詞個數。

用一個單向連結串列儲存所出現的單詞,注意幾點:1)檔案輸入輸出;2)字串處理;3)連結串列資料結構

再看程式碼——演算法實現如下:

//================================================================
// 讀入一篇英文文章,統計其中的單詞,並得到每個單詞出現的次數
// 連結串列的應用
//================================================================
#include "stdafx.h"
#include "string.h"
#include <malloc.h>

typedef struct _link		// 定義該連結串列是為了儲存不重複出現的單詞
{
	char* ch;
	int num;
	_link* next;
}link;

int _tmain(int argc, _TCHAR* argv[])
{
	// 讀入一個txt.檔案操作
	FILE *fp;
	fp = fopen("test1.txt","r");
	char word[1025];
	int pos = 0;		// 亦可用 size_t型別
	char c;
	link *head, *pnow, *ptmp;
	head = pnow = ptmp = NULL;

	while (!feof(fp))
	{
		c = fgetc(fp);		//逐個獲取的字元
		if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c=='\''))
			word[pos++]=c;
		else if (pos>0)
		{
			word[pos] = '\0';
			// 連結串列遍歷,比較連結串列中的節點值與當前單詞
			ptmp = head;
			while (ptmp)
			{
				if (strcmp(word, ptmp->ch)==0)
				{
					ptmp->num++;
					break;
				}
				ptmp = ptmp->next;
			}
			// 如果連結串列中沒有當前單詞,在連結串列末尾插入節點
			if (ptmp == NULL)
			{
				ptmp = (link*)malloc(sizeof(link));	//注意一下兩行的用法
				ptmp->ch = (char*)malloc(pos);
				strcpy(ptmp->ch, word);
				ptmp->num=1;
				ptmp->next = NULL;
				if (pnow)	// 插入當前節點為末節點
				{
					pnow->next = ptmp;
					pnow = ptmp;
				}
				else		// 此處為第一次出現單詞的時候
					head = pnow = ptmp;
			}
			pos=0;
		}
	}
	fclose(fp);	// 對檔案進行操作,關閉檔案

	// 讀取連結串列,輸出單詞及其出現的個數
	ptmp = head;
	FILE *fp1 = fopen("result.txt","w");
	while (ptmp)
	{
		fprintf(fp1,"%d\t%s\n", ptmp->num, ptmp->ch);
		ptmp = ptmp->next;
	}
	fclose(fp1);

	return 0;
}