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