













網上一些大俠給出的解法的問題主要在于不能區分諸如ab,abb,babba等含有相同字母,但是字母出現次數不相同的情況
思路如下:
gHeadList是一個鏈表的頭,其中的每一個HeadNode的child是一個指向同一類的word的鏈表(這些word含有相同的hashcode,即含有相同的字母種類并且各個字母的出現次數也相同),hashcode成員則保存該類word排序后的值;
具體解法如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
bool TransferDictionary(char * srcFile,char * destFile);

//從源文件中讀入數據
char* ReadFile(const char* fname);

//將處理后的數據寫到目的文件中
bool WriteFile(const char* fname);

//得到一個word的hash碼,實際就是返回word按字母排序后的字符串
char* GetHashCode(char *word);

//將word插入到表中正確的位置
bool InsertWord(char * word);

//釋放空間
void Free();


struct Node
{
char *word;
Node *next;
};
struct HeadNode
{
char* hashcode;
Node* child;
HeadNode* link;
};

HeadNode *gHeadList=NULL;

void Free()
{
HeadNode *pHead=gHeadList,*pTmpHead=NULL;
Node *pTmp=NULL;
while(NULL != pHead)
{
Node *pNode=pHead->child;
while(NULL != pNode)
{
pTmp=pNode->next;
free(pNode->word);
free(pNode);
pNode=pTmp;
}
pTmpHead=pHead->link;

free(pHead->hashcode);
free(pHead);
pHead=pTmpHead;
}
}

bool WriteFile(const char* fname)
{
FILE *fp=NULL;
fp = fopen(fname,"w");

HeadNode* hTmp = gHeadList;
Node *nTmp = NULL;

while (hTmp != NULL)
{
nTmp = hTmp->child;

if(nTmp == NULL )continue;

fwrite(nTmp->word,sizeof(char),strlen(nTmp->word),fp);
printf("\n%s",nTmp->word);

nTmp=nTmp->next;
while (nTmp!=NULL)
{
fwrite(" ",sizeof(char),1,fp);
fwrite(nTmp->word,sizeof(char),strlen(nTmp->word),fp);

printf(" %s",nTmp->word);
nTmp = nTmp->next;
}
fwrite("\n",sizeof(char),1,fp);

hTmp = hTmp->link;
}
return true;
}

bool InsertWord(char * word)
{
char *hashcode=GetHashCode(word);

Node *pNode=(Node*)malloc(sizeof(Node));
pNode->word=strdup(word);
pNode->next=NULL;

HeadNode *pHead=gHeadList;

while(pHead != NULL)
{
if(0 == strcmp(pHead->hashcode,hashcode))
{
Node *pTmp=pHead->child;
pHead->child=pNode;
pNode->next=pTmp;
return true;
}

pHead=pHead->link;
}

pHead=(HeadNode*)malloc(sizeof(HeadNode));
pHead->hashcode=strdup(hashcode);
pHead->child=pNode;
pHead->link=gHeadList;

gHeadList=pHead;
return true;
}

char* GetHashCode(char *word)
{
char value[26]={0};
int len=strlen(word);
if(len<=0)return NULL;

char *hashcode=(char*)malloc(len+1);
int i=0;
for(i=0;i<len;i++)
value[word[i]-'a']+=1;

int pos=-1;
for(i=0;i<26;i++)
{
for(int j=0;j<value[i];j++)
hashcode[++pos]='a'+i;
}
hashcode[len]='\0';

return hashcode;
}

char* ReadFile(const char* fname)
{
FILE *fp = fopen(fname,"r");
if (fp == NULL)
{
perror("Open file failed!\n");
exit(0);
}

fseek(fp,0L,SEEK_END);
long fsize = ftell(fp);
if (fsize==0L)
{
perror("The file is empty!\n");
exit(0);
}
char *file_buf = (char*)malloc((size_t)fsize+1);
rewind(fp);

int Ret = fread(file_buf,sizeof(char),fsize,fp);

if (Ret == 0)
{
return NULL;
}

file_buf[fsize] = '\0';

return file_buf;
}


bool TransferDictionary(char * OriginalFile,char * NewFile)
{
char * buf=ReadFile(OriginalFile);
if(buf == NULL)return false;

const char *delimer=" ";
char * word=strtok(buf,delimer);
while(word != NULL)
{
printf("Get a word:%s\n",word);

InsertWord(strlwr(word));

word=strtok(NULL,delimer);
}

WriteFile(NewFile);

return true;
}


int main()
{
char OriginalFile[100],TargetFile[100];

memset(OriginalFile,0,100);
memset(TargetFile,0,100);

printf("Enter the original file name:");
scanf("%s",OriginalFile);
printf("Enter the target file name:");
scanf("%s",TargetFile);

TransferDictionary(OriginalFile,TargetFile);

Free();

return 0;
}
#include <stdlib.h>
#include <string.h>






















































































































































































































