• <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

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


            網(wǎng)上一些大俠給出的解法的問題主要在于不能區(qū)分諸如ab,abb,babba等含有相同字母,但是字母出現(xiàn)次數(shù)不相同的情況

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

            具體解法如下:


            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>

            bool    TransferDictionary(char * srcFile,char * destFile); 

            //從源文件中讀入數(shù)據(jù)
            char*    ReadFile(const char* fname);

            //將處理后的數(shù)據(jù)寫到目的文件中
            bool    WriteFile(const char* fname);

            //得到一個(gè)word的hash碼,實(shí)際就是返回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 閱讀(2106) 評論(4)  編輯 收藏 引用

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

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(1)

            隨筆檔案

            最新評論

            閱讀排行榜

            評論排行榜

            国内精品伊人久久久久影院对白 | 国内精品久久久久久久亚洲| 亚洲AⅤ优女AV综合久久久| 久久青青草原综合伊人| 奇米综合四色77777久久| 久久综合色区| 久久伊人精品一区二区三区| 99久久亚洲综合精品网站| 国产精品一区二区久久| 久久精品99久久香蕉国产色戒| 亚洲va中文字幕无码久久| 久久综合久久综合亚洲| 亚洲精品第一综合99久久| 亚洲国产高清精品线久久 | 久久国产一区二区| 久久精品中文字幕有码| 久久亚洲sm情趣捆绑调教| 久久精品综合网| 久久偷看各类wc女厕嘘嘘| 91精品无码久久久久久五月天| 国产激情久久久久影院| 久久久久久久久波多野高潮| 久久青青草原精品国产| 久久播电影网| 色狠狠久久AV五月综合| 久久伊人亚洲AV无码网站| 久久精品国产亚洲av麻豆蜜芽| 国产精品毛片久久久久久久| 欧美一级久久久久久久大| 国产成人久久精品区一区二区| 国产综合成人久久大片91| 色婷婷综合久久久中文字幕| 国产高潮久久免费观看| 91久久精一区二区三区大全| 久久精品一本到99热免费| 国产激情久久久久影院老熟女免费 | 国产精品日韩深夜福利久久| 久久久久久人妻无码| 久久精品卫校国产小美女| 久久婷婷人人澡人人| 久久精品18|