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

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


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

            思路如下:
            gHeadList是一個鏈表的頭,其中的每一個HeadNode的child是一個指向同一類的word的鏈表(這些word含有相同的hashcode,即含有相同的字母種類并且各個字母的出現(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);

            //得到一個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 閱讀(2118) 評論(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
            @麥田守望者
            題目也是在網(wǎng)上看見的,可能是以前參加mini-test的前輩帶出來的吧
              回復  更多評論
              
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(1)

            隨筆檔案

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产成人午夜AV影院| 狠狠色综合久久久久尤物 | 久久er国产精品免费观看2| 91精品国产91久久久久福利 | 久久激情五月丁香伊人| 丁香五月综合久久激情| 性高朝久久久久久久久久| 老色鬼久久亚洲AV综合| 久久91亚洲人成电影网站| 99久久精品免费看国产| 久久中文字幕人妻丝袜| 九九99精品久久久久久| 7777精品伊人久久久大香线蕉| 久久精品国产清高在天天线| 久久精品成人一区二区三区| 久久精品水蜜桃av综合天堂| 久久综合成人网| 久久精品视频网| 久久一日本道色综合久久| 久久国产美女免费观看精品| 久久久久99精品成人片试看| 亚洲精品国产自在久久| 久久本道综合久久伊人| 99久久99久久| 97久久精品午夜一区二区| 色99久久久久高潮综合影院| 一本大道久久a久久精品综合 | 国内精品久久国产大陆| 伊人久久大香线蕉AV色婷婷色| 日韩va亚洲va欧美va久久| 久久精品国产一区二区电影| 99久久成人18免费网站| 久久国产高清字幕中文| 精品乱码久久久久久久| 久久精品欧美日韩精品| 欧洲人妻丰满av无码久久不卡 | 亚洲精品乱码久久久久久中文字幕 | 伊人久久大香线焦综合四虎| 国产精品久久免费| 99久久免费国产精品| 国产视频久久|