一道微软MiniTest笔试题

来源:互联网 发布:lededitor软件下载 编辑:程序博客网 时间:2024/05/02 01:05

 

题目描述:
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] 
= '

 

原创粉丝点击