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' 的类型冲突”我不方便使用函数指针,有什么建议吗?

PS还调用了这两个函数:

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;
}
4

2 回答 2

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

在这里你初始化pt2Function为 NULL。AndptrFunction是一个函数指针,它可以指向一个可以接受 2 个类型参数clientTree*, clientData且返回类型为的函数clientTree*

因此,在您的示例中,您可以使用 -

pt2Function = findClientDate;

findClientDate现在您可以通过以下方式调用该函数pt2Function-

(*findClientDate)(t,u);

因此,在您的示例中,您应该更改 function 的签名clientTree*(*GetPtr2(int opCode))(clientTree*, clientData)。它应该是 -

clientTree* GetPtr2(int opCode);

现在您可以声明一个函数指针,例如 -

clientTree* (*fPtr)(int opCode) = NULL;
fPtr = GetPtr2;
于 2013-06-03T17:58:05.800 回答
1

您对 GetPtr2 的声明看起来是正确的......但它首先在哪里声明?这可能是编译器报告的冲突的根源。

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

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

MyFuncPtr GetPtr2(int opCode);
于 2013-06-03T18:05:02.770 回答