问题出自blog:http://blog.csdn.net/v_july_v/article/details/6803368
问题:高效统计一篇英文文章里出现的所有单词,按照在文章中首次出现的顺序打印出该单词和它出现的次数。
解决方式:利用Trie完成单词匹配,然后利用链表来统计单词出现的个数。
源代码:
1 #include <stdio.h> 2 #include <stdlib.h> // for calloc(), free() 3 #include <string.h> // for strlen(), memset() 4 5 enum { BranchSize = 26, StringSize = 40, NodeMax = 200 }; // 声明常量 6 7 /* 链表信息以及相关操作函数 */ 8 struct ListNode 9 { 10 int m_iCnt; // 统计单词出现的次数 11 char m_szStr[StringSize];// 当前链表项中单词 12 struct ListNode *m_pNxt; // 指向下一个链表结点 13 }; 14 15 struct ListHead 16 { 17 struct ListNode *m_pStart; // 指向链表开始结点 18 struct ListNode *m_pEnd; // 指向链表末尾结点 19 }; 20 21 typedef struct ListNode ListNode; 22 typedef struct ListHead ListHead; 23 24 // 分配头结点 25 ListHead* AllocListHead() 26 { 27 ListHead *pNew = NULL; 28 29 pNew = (ListHead *) calloc( 1, sizeof( ListHead ) ); 30 if ( NULL == pNew ) 31 { 32 printf( "Out of Memory. " ); 33 return NULL; 34 } 35 36 pNew->m_pEnd = NULL; 37 pNew->m_pStart = NULL; 38 39 return pNew; 40 } 41 42 // 分配链表结点 43 ListNode* AllocListNode( const char *szStr ) 44 { 45 ListNode *pNew = NULL; 46 47 pNew = (ListNode *)calloc( 1, sizeof(ListNode) ); 48 if ( NULL == pNew ) 49 { 50 printf( "Out of Memory. " ); 51 return NULL; 52 } 53 54 // 初始化信息 55 pNew->m_iCnt = 1; 56 pNew->m_pNxt = NULL; 57 strncpy( pNew->m_szStr, szStr, strlen( szStr ) ); 58 pNew->m_szStr[strlen(szStr)] = '