题目描述:
1,一个文件中存有空格分开的单词
现在要将这个文件读入到另外一个文件,保存格式如下:
live evil
search casher
........
就是含有相同字母的单词要放到一行。
用c实现,可以使用fopen,fread,fwrite等
接口:
bool TransferDictionary(char * OriginalFile,char * NewFile);
我的解法:

/**//********************************************************
作者:Bring.Zhang 时间:2006.10
文件名:main.cpp
题目描述:
1,一个文件中存有空格分开的单词
现在要将这个文件读入到另外一个文件,保存格式如下:
live evil
search casher
........
就是含有相同字母的单词要放到一行。
用c实现,可以使用fopen,fread,fwrite等
接口:
bool TransferDictionary(char * OriginalFile,char * NewFile);
*******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <memory.h>
#include <string.h>

typedef struct word_tag//单词结点

...{
char* word;
struct word_tag* next;
// WordNode(){word=NULL; next=NULL;}
}WordNode;

typedef struct head_node_tag//链接的头结点

...{
WordNode* link;
struct head_node_tag* next;
int value;
int count;
// WordHeadNode(){link=NULL; next=NULL; value=0;count=0;}
}WordHeadNode;

WordHeadNode * start=NULL;

bool TransferDictionary(char* OriginalFile,char*NewFile);
char* ReadFile(const char* fname);
int GetValue(const char* word);
bool InsertNode(char* word);
void FreeSpace(WordHeadNode* start);

bool InsertNode(char* word)

...{
WordHeadNode *head,*pre,*pTmp;
WordNode * node,*npTmp;

int tmp;

pTmp = start;
if (start == NULL)

...{
head = (WordHeadNode*)malloc(sizeof(WordHeadNode));
//初始化
head->count = 0;
head->link = NULL;
head->next = NULL;
head->value = 0;

start = head;

node = (WordNode*)malloc(sizeof(WordNode));
//初始化
node->word = word;
node->next = NULL;
head->link = node;
head->count += 1;
head->value = GetValue(node->word);

return true;
}
else

...{
tmp = GetValue(word);
while (pTmp!=NULL && tmp!=pTmp->value)
//每次插入都要检索,当文件很大时效率大打折扣
//可以加个索引,加快检索速度

...{
pre = pTmp;
pTmp = pTmp->next;
}
if (pTmp == NULL)

...{
//该特征值不存在,头结点链表末尾插入
head = (WordHeadNode*)malloc(sizeof(WordHeadNode));
//初始化
head->count = 0;
head->link = NULL;
head->next = NULL;
head->value = 0;
pre->next = head;

node = (WordNode*)malloc(sizeof(WordNode));
node->next = NULL;
node->word = word;
head->link = node;
head->count += 1;
head->value = GetValue(node->word);
return true;
}

//特征值存在就在,单词链表末尾插入,链接头count加1
node = (WordNode*)malloc(sizeof(WordNode));
node->next = NULL;
node->word = word;

npTmp = pTmp->link;
pTmp->count += 1;
while (npTmp->next != NULL)
npTmp = npTmp->next;

if (npTmp == NULL)
return false;
npTmp->next = node;
return true;
}
}

char* ReadFile(const char* fname)

...{
FILE *fp;
fp = fopen(fname,"r");
if (fp == NULL)

...{
perror("Open file failed! ");
exit(0);
}

fseek(fp,0L,SEEK_END);
long fsize = ftell(fp);
if (fsize==0L)

...{
puts("The file is empty! ");
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] = '