• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 2,  comments - 8,  trackbacks - 0

            題目描述: 
            一個文件中存有空格分開的單詞 
            現在要將這個文件讀入到另外一個文件,保存格式如下: 
            live evil 
            search casher 
            .. 
            就是含有相同字母的單詞要放到一行。 
            用c實現,可以使用fopen,fread,fwrite等 
            接口: 
            bool TransferDictionary(char * OriginalFile,char * NewFile);
              


            網上一些大俠給出的解法的問題主要在于不能區分諸如ab,abb,babba等含有相同字母,但是字母出現次數不相同的情況

            思路如下:
            gHeadList是一個鏈表的頭,其中的每一個HeadNode的child是一個指向同一類的word的鏈表(這些word含有相同的hashcode,即含有相同的字母種類并且各個字母的出現次數也相同),hashcode成員則保存該類word排序后的值;

            具體解法如下:


            #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;
            }
            posted on 2007-06-28 21:24 Darkblue 閱讀(2104) 評論(4)  編輯 收藏 引用

            FeedBack:
            # re: 一道微軟的Mini-Test筆試題(一)
            2007-06-29 09:44 | WarTalker
            閣下的代碼清晰明了,讀后受益匪淺。  回復  更多評論
              
            # re: 一道微軟的Mini-Test筆試題(一)
            2007-06-29 14:11 | SuperPlayeR
            本來看到嘩嘩一長串代碼就準備跳過的,看到1樓的評論說寫的不錯,又回頭認真讀了一遍,確實不虛此行,受教了~//bow //thanks  回復  更多評論
              
            # re: 一道微軟的Mini-Test筆試題(一)
            2007-06-30 19:49 | 麥田守望者
            強啊! 不知道題目在哪里獲取的啊?  回復  更多評論
              
            # re: 一道微軟的Mini-Test筆試題(一)
            2007-07-03 16:15 | Darkblue
            @麥田守望者
            題目也是在網上看見的,可能是以前參加mini-test的前輩帶出來的吧
              回復  更多評論
              
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(1)

            隨筆檔案

            最新評論

            閱讀排行榜

            評論排行榜

            香蕉久久一区二区不卡无毒影院| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 一本一道久久综合狠狠老| 亚洲国产成人久久精品99| 久久夜色精品国产亚洲| 久久99中文字幕久久| 伊人久久一区二区三区无码| 久久A级毛片免费观看| 精品久久人人做人人爽综合 | 中文字幕成人精品久久不卡| 久久只这里是精品66| 久久国产一区二区| 99久久国产亚洲综合精品| 狠狠人妻久久久久久综合| 亚洲香蕉网久久综合影视| 久久99精品国产99久久6| 久久久久99精品成人片直播| 久久精品中文字幕大胸| 国产综合成人久久大片91| 久久精品国产亚洲AV高清热| 热久久视久久精品18| 久久精品无码av| 99久久精品无码一区二区毛片 | 四虎国产精品免费久久久| 亚洲国产精品久久久天堂| 伊人 久久 精品| 四虎国产精品成人免费久久| 久久久久一级精品亚洲国产成人综合AV区 | 伊人色综合久久天天人手人婷| 久久丝袜精品中文字幕| 久久精品免费网站网| 韩国三级中文字幕hd久久精品| 久久九九全国免费| 国产99久久精品一区二区| www.久久热| 久久精品国产精品青草| 久久久久国产一级毛片高清版| 人人狠狠综合久久亚洲婷婷| 久久―日本道色综合久久| 婷婷综合久久狠狠色99h| 国产精品va久久久久久久|