【问题标题】:[ERROR ]request for member in which is of pointer type maybe you meant to use -> ?) in C BST[错误]请求指针类型的成员可能您打算在C BST中使用->?)
【发布时间】:2019-01-11 09:06:24
【问题描述】:

我正在尝试从 bst 中删除一个节点 在线: ((strcmp((*A)->caracterise.nom , Etud.nom) == 0) && (strcmp((*A)->caracterise.prenom , Etud.prenom) == 0) && (( *A)->caracterise.note == Etud.note))

我在“* A”中收到对成员“caracterise”的 [错误] 请求,它的指针类型为“ABR {aka noud*}”(也许您打算使用“->”?)

注意:学生是学生; noud 是节点; caracterise 是学生信息; nom prenom note 是姓名姓氏 gpa; fG 是左 bst; fD 是正确的 bst; ABR 是 BST

struct etudiant
{
char nom[13]; 
char prenom[13];
float note;
};

struct noud
{
etudiant caracterise;
struct noud*fG;
struct noud*fD;
};

typedef struct noud*ABR;

void supprimer(ABR** A, etudiant Etud){
if ((strcmp((*A)->caracterise.nom , Etud.nom) == 0) && (strcmp((*A)->caracterise.prenom , Etud.prenom) == 0) && ((*A)->caracterise.note == Etud.note)) {
    //if ((test(*A, Etud) == 0)&& (*A->caracterise.note == Etud.note)){
    ABR* a;
    a = (ABR*)malloc (sizeof(noud));
    a = (*A)->fD ;
    ABR* b;
    b = (ABR*)malloc (sizeof(noud));
    if ( a != NULL ) {
        if ( a->fG != NULL ) {
            while ( a->fG->fG != NULL ) {
                a = a->fG ;
            }
            b = a->fG ;
            b->fG = (*A)->fG ;
            a->fG = b->fD ;
            b->fD = (*A)->fD;
            a = (*A);
            (*A) = b ;
            free(a);
        }else{
            a->fG = (*A)->fG ;
            free(*A);
            (*A) = a ;
        }
    }else{
        a = *A ;
        (*A) = (*A)->fG ;
        free(a);
    }
}else{
    if ( v.priorite > (*A)->val.priorite ) {
        supprimer(&(*A)->fD, Etud);
    }else{
        supprimer(&(*A)->fG, Etud);
        }
    }
}

【问题讨论】:

  • 这就是你在 typedef 后面隐藏指针时得到的结果。 Anoud *** 类型,所以 *Anoud ** 类型,您无法使用 -> 访问。
  • 与你的错误无关,a = malloc (sizeof(noud))后面紧跟a = (*A)->fD的赋值会导致内存泄漏。
  • 这被称为业力,see this。尝试用不太复杂的数据类型重写这个程序。使用直观的变量名称。放弃指针取消引用以支持 [ ] 索引。

标签: c pointers binary-search-tree


【解决方案1】:

AABR**,所以是 struct noud***,所以 (*A)struct noud** 而不是 struct noud*(*A)->caracterise 是错误的(但 (**A)->caracterise 合法)

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2010-10-27
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多