2013-06-03 41 views
1

我在二叉树上有一个函数的问题。树中有客户端结构,其中包含一个ID号和一个日期字段。我需要做3个函数,2个find_client函数,一个使用节点的id号进行搜索,一个使用日期,他们都会将地址返回到包含所有匹配节点的新树。在这两个函数上面有一个find_client函数来决定根据用户输入调用哪个函数,我试图使用函数指针来工作,但是我遇到了一个问题。首先,该结构:如何使用函数指针?

typedef struct date{ 
int day; 
int month; 
int year; 
}date; 

typedef struct time{ 
    int hours; 
    int minutes; 
}time; 

typedef struct client{ 
    char *first_name; 
    char *sur_name; 
    unsigned int id; 
    unsigned long reg_num; 
    date rent_date; 
    time rent_time; 
    int price_for_day; 
}client; 

typedef struct client_tree { 
    struct client c; 
    struct client_tree *left, *right; 
} clientTree; 
typedef union clientData{ 
    unsigned int id; 
    date date; 
}clientData; 

现在的功能我用:

clientTree* findClient(clientTree* t){ 
    clientTree* n=NULL; 
    int i=0; 
    clientData u; 
    while(i!=1 && i!=2){ 
     printf("\nPlease enter 1 to search via I.D. number, or press 2 to search by date: "); 
     scanf("%d", &i); 
     __fpurge(stdin); 
     if(i==1){ 
      printf("\nEnter the id number please: "); 
      scanf("%u", &u.id); 
      __fpurge(stdin); 
     } 
     else if (i==2){ 
      printf("\nEnter the day please: "); 
      scanf("%d", &u.date.day); 
      __fpurge(stdin); 
      printf("\nEnter the month please: "); 
      scanf("%d", &u.date.month); 
      __fpurge(stdin); 
      printf("\nEnter the year please: "); 
      scanf("%d", &u.date.year); 
      __fpurge(stdin); 
     } 
     else 
      printf("\nNot valid, try again."); 
    } 
    clientTree* (*pt2Function)(clientTree*, clientData) = NULL; 
    pt2Function=GetPtr2(i); 
    n= (*pt2Function)(t, u); 
    return n; 
} 


clientTree* findClientDate(clientTree* t, clientData u){ 
    if(!t) 
     return NULL; 

    if(t->c.rent_date.day==u.date.day && t->c.rent_date.month==u.date.month && t->c.rent_date.year==u.date.year){ 
     clientTree* n = createClientTree(); 
     treeAddClient(n,t->c); 
     n->left=findClientDate(t->left, u); 
     n->right=findClientDate(t->right, u); 
     return n; 
    } 
    return NULL; 
} 
clientTree* findClientId(clientTree* t, clientData u){ 
    if(!t) 
     return NULL; 

    if(t->c.id==u.id){ 
     clientTree *n = createClientTree(); 
     treeAddClient(n,t->c); 
     n->left=findClientId(t->left, u); 
     n->right=findClientId(t->right, u); 
     return n; 
    } 
    return NULL; 
} 


clientTree*(*GetPtr2(int opCode))(clientTree*, clientData){ 
if(opCode == 1) 
    return &findClientId; 
else 
    return &findClientDate; 
} 

我得到一个错误:“冲突的类型‘GetPtr2’” 我不是很方便用函数指针,有什么建议?

P.S.同时这两种功能要求:

clientTree* treeAddClient(clientTree* root, client c){ 
    if (!root) { 
     root=createClientTree(); 
     root->c=c; 
     return root; 
    } 
    if (c.id > root->c.id) 
     root->right = treeAddClient(root->right, c); 
    else if (c.id < root->c.id) 
     root->left = treeAddClient(root->left, c); 
    else 
     return NULL; 
    return root; 
} 

clientTree* createClientTree(){ 
    clientTree *t; 
    t=ALLOC(clientTree, 1); 
    return t; 
} 
+0

刚读函数指针今天这个教程:函数指针教程(http://www.beningo.com/index.php/软件的技术/ 139-一个引入到功能pointers.html)。它可能有帮助。 –

回答

1
clientTree* (*pt2Function)(clientTree*, clientData) = NULL; 

在这里,您intialized pt2Function为NULL。并且ptrFunction是一个函数指针,它可以指向一个函数,该函数可以接收2个参数,类型为clientTree*, clientData,返回类型为clientTree*

所以,在你的榜样,你可以像使用 -

pt2Function = findClientDate; 

现在,你可以通过pt2Function像调用函数findClientDate -

(*findClientDate)(t,u); 

所以,在你的例子,你应该改变的签名功能clientTree*(*GetPtr2(int opCode))(clientTree*, clientData)。它应该是 -

clientTree* GetPtr2(int opCode); 

现在你可以声明一个函数指针像 -

clientTree* (*fPtr)(int opCode) = NULL; 
fPtr = GetPtr2; 
1

你GetPtr2的声明看起来是正确的......但如果是它第一次被宣布?这可能是编译器报告的冲突的来源。

此外,可以考虑使用一个typedef使事情变得更简单:

typedef clientTree *(* MyFuncPtr)(clientTree *, clientData); 

MyFuncPtr GetPtr2(int opCode);