• <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 閱讀(2104) 評論(4)  編輯 收藏 引用

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

            常用鏈接

            留言簿(1)

            隨筆檔案

            最新評論

            閱讀排行榜

            評論排行榜

            久久综合一区二区无码| 久久青青色综合| 久久免费美女视频| 色99久久久久高潮综合影院| 精品久久久久久中文字幕| 久久精品国产福利国产秒| 久久久91人妻无码精品蜜桃HD | 久久黄色视频| 热re99久久6国产精品免费| 久久96国产精品久久久| 久久久久久亚洲精品成人| 久久天天躁狠狠躁夜夜2020| 欧美日韩精品久久久久| 99久久精品免费看国产| 欧洲性大片xxxxx久久久| 2020久久精品亚洲热综合一本| 国内精品久久久久久久久电影网| 久久精品中文字幕一区| 久久免费视频网站| 性欧美丰满熟妇XXXX性久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 欧美喷潮久久久XXXXx| 一本色道久久88加勒比—综合| 亚洲乱码日产精品a级毛片久久| 久久久久亚洲Av无码专| 欧美亚洲国产精品久久| 国内精品久久久久久久久| 久久久久夜夜夜精品国产| 久久精品国产亚洲AV香蕉| 亚洲国产精品嫩草影院久久 | 亚洲国产精品无码久久青草| 午夜精品久久久久久中宇| 婷婷久久综合九色综合绿巨人| 久久综合狠狠综合久久综合88| 国产日韩久久免费影院| 99久久精品午夜一区二区| 久久久久久人妻无码| 亚洲精品美女久久久久99| 精品永久久福利一区二区| 九九99精品久久久久久| 久久亚洲精品中文字幕三区|