题目描述:
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] = '
本文介绍了一个C语言程序,用于从源文件中读取单词,并根据单词中包含的相同字母进行归类,最终写入到新的文件中。通过链表结构实现了高效的数据存储。
1099

被折叠的 条评论
为什么被折叠?



