#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;

}