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

            glxhyt

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              15 隨筆 :: 0 文章 :: 4 評論 :: 0 Trackbacks
            回調函數應用
              1#include <iostream>
              2using namespace std;
              3
              4#define MAX 5
              5
              6typedef struct tagNode_t
              7{
              8    struct tagNode_t *pPre;
              9    struct tagNode_t *pNex;
             10    void * pData;
             11}
            Node_t;
             12
             13typedef struct tagList_t
             14{
             15    Node_t pHead;
             16}
            List_t;
             17
             18
             19typedef enum tagStatusEnum
             20{
             21    LIST_NG = 0,
             22    LIST_OK,
             23}
            StatusEnum;
             24
             25//函數指針
             26typedef StatusEnum (*pFun ) (void* data);
             27typedef StatusEnum (*pVistFun)(void* ctx, void* data);
             28
             29StatusEnum CreateList(Node_t* p , int* i); 
             30StatusEnum DeleteList(List_t* p);
             31
             32StatusEnum PrintList(List_t* list, pFun print);
             33StatusEnum PrintStatus(void* p);
             34
             35StatusEnum List_ForEach(List_t* p, pVistFun, void* pvCtx);
             36StatusEnum FindMax(void* pvCtx, void* pvData);
             37StatusEnum Sum(void* pvCtx, void* pvData);
             38
             39
             40StatusEnum ListForEach(List_t* p, pVistFun Fun, void* pvCtx)
             41{
             42    StatusEnum Status = LIST_OK;
             43    Node_t *pstTemp = (p->pHead).pNex;
             44    while((NULL != pstTemp ) && (Status != LIST_NG))
             45    {
             46        Status = Fun(pvCtx, pstTemp->pData);
             47        pstTemp = pstTemp->pNex;
             48    }

             49    
             50    return Status;
             51}

             52
             53
             54StatusEnum Sum(void* pvCtx, void* pvData)
             55{
             56    int *piCtx = (int*)pvCtx;
             57    int *piData = (int*)pvData;
             58    *piCtx += *piData;
             59    return LIST_OK;
             60}

             61
             62StatusEnum FindMax(void* pvCtx, void* pvData)
             63{
             64    int *piMax = (int*)pvCtx;
             65    int *piData = (int*)pvData;
             66    if ( *piMax < *piData)
             67    {
             68        *piMax = *piData;
             69    }

             70    
             71    return LIST_OK;
             72}

             73
             74
             75StatusEnum CreateList(Node_t *p , int *i)  
             76{
             77    Node_t *pTemp = new Node_t;
             78    pTemp->pPre  = NULL;
             79    pTemp->pNex  = NULL;
             80    pTemp->pData = i;
             81    
             82    //Head Insert
             83    pTemp->pNex = (p)->pNex;
             84    (p)->pNex  = pTemp;
             85    pTemp->pPre = p;
             86    
             87    if (NULL != pTemp->pNex)
             88    {
             89        pTemp->pNex->pPre = pTemp;
             90    }

             91    
             92    return LIST_OK;
             93}

             94
             95StatusEnum PrintList(List_t *p, pFun print)
             96{
             97    Node_t *pTemp = p->pHead.pNex;
             98    while ( NULL != pTemp)
             99    {
            100        print(pTemp->pData);
            101        pTemp = pTemp->pNex;
            102    }

            103    
            104    return LIST_OK;
            105}

            106
            107
            108StatusEnum PrintStatus(void* p)
            109{
            110    //cout<<"A "<<(int) (*p);    
            111    cout<<""<<*(int*)p<<endl;
            112    return LIST_OK;
            113}

            114
            115
            116StatusEnum DeleteList(List_t *p)
            117{
            118    Node_t *pTemp = p->pHead.pNex;
            119    Node_t *pCur = NULL;
            120    while ( NULL != pTemp)
            121    {
            122        pCur = pTemp;
            123        pTemp = pTemp->pNex;
            124        delete pCur;
            125    }

            126    
            127    return LIST_OK;
            128}

            129
            130int main(int argc, char ** argv)
            131{
            132    List_t list;
            133    (list.pHead).pPre = NULL;
            134    (list.pHead).pNex = NULL;
            135    (list.pHead).pData = NULL;
            136    
            137    //Create
            138    int aiData[MAX] = {1,3,4,5,2};
            139    for (int i = 0; i < MAX; ++ i)
            140    {
            141        CreateList(&(list.pHead), &(aiData[i]));
            142    }
                
            143
            144    
            145    //Print   
            146    PrintList(&list, PrintStatus);
            147    
            148    //Max
            149    int iMax = 0;
            150    ListForEach(&list, FindMax, &iMax);
            151    cout<<"Max: "<<iMax<<endl;
            152    
            153    //Sum
            154    int iSum = 0;
            155    ListForEach(&list, Sum, &iSum); 
            156    cout<<"Sum: "<<iSum<<endl;  
            157    
            158    //Delete
            159    DeleteList(&list);
            160    
            161    return 0;
            162}

            163
            164
            165


            好郁悶的void* int*

            StatusEnum CreateList(Node_t *p , void *i);

            StatusEnum PrintStatus(void* p)

            操作:
            構造的時候
                for (int i = 0; i < 5; ++ i) 
                {
                    CreateList(&((list.pHead)), (void*)i);
                }

            打印的時候
            StatusEnum PrintStatus(void* p)
            {
                //cout<<"A "<<(int) (*p);   
               // cout<<"B "<<*((int*)p)<<endl;
                cout<<(int)p<<endl;

                return LIST_OK;
            }

            就這么點代碼,糾結死我了,why? 為什么這樣就不用
            考慮生命周期了呢,為什么打印不是cout<<"B "<<*((int*)p)<<endl;
            而是 cout<<(int)p<<endl;
            posted on 2011-11-27 21:05 郭龍 閱讀(381) 評論(0)  編輯 收藏 引用
            一本色道久久综合狠狠躁| 国产L精品国产亚洲区久久| 亚洲中文字幕伊人久久无码| 久久久精品无码专区不卡| 久久久亚洲裙底偷窥综合| 国产成人精品久久一区二区三区| 精品综合久久久久久97超人 | 久久久久黑人强伦姧人妻| 亚洲天堂久久久| 色综合久久久久| 人妻久久久一区二区三区| 国内精品欧美久久精品| 久久久久亚洲精品天堂| 日本久久中文字幕| 日本免费久久久久久久网站| 77777亚洲午夜久久多喷| 国产综合免费精品久久久| 久久99精品久久久久久hb无码| 久久精品国产精品亚洲人人 | 国产亚洲成人久久| 久久国产精品77777| 久久精品无码一区二区WWW| 国产精品成人99久久久久91gav| 久久精品国产亚洲av水果派| 久久久久久精品无码人妻| 亚洲精品乱码久久久久久不卡| 久久91精品国产91久久户| 国产精品9999久久久久| 国产麻豆精品久久一二三| 久久久久av无码免费网| 国产激情久久久久影院老熟女免费| 中文国产成人精品久久不卡| 亚洲国产一成久久精品国产成人综合 | 国产高潮国产高潮久久久91| 麻豆精品久久精品色综合| 国产精品久久久久久久| 久久综合精品国产二区无码| 无码人妻少妇久久中文字幕蜜桃 | 2020久久精品国产免费| 99精品久久精品| 99久久国产综合精品网成人影院|