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

}