从C中的动态堆栈的不兼容指针类型问题分配

时间:2016-12-14 17:31:24

标签: c pointers stack

我有两个主要问题。 我的代码是"元素"的堆栈(堆),由结构构成如下:

typedef struct etCel{
    element *ele;
    struct cel *suiv;   
} cel;

typedef cel* pile;

第一个问题是" isEmpty" function,生成分段错误:

int isEmpty(stack p){
    if(p->ele){
        return 0;
    }else{
        return 1;
    }
}

int affiche_pile(pile p){
    printf("Valeurs de la pile:\n");

    while(p->ele){
        affiche_element(p->ele);
        printf("\n");
        p=p->suiv;
    }

    return 1;
}

int pile_est_vide(pile p){
    if(p->ele){
        return 0;
    }else{
        return 1;
    }
}

pile push(stack p, element e){
    element *nvoele;
    nvoele = (element*)malloc(sizeof(element));
    stack ptmp = (stack)malloc(sizeof(cel));

    assert(ptmp);

    nvoele = &e;
    ptmp->ele = nvoele;
    ptmp->suiv = p; //ERROR HERE
    return ptmp;    
}

element pop(stack p){
    stack ptmp = init_stack();

    if(isEmpty(p) != 1){
        ptmp = p->suiv; //ERROR HERE
        free(p);
        return *(ptmp->ele);
    }else{
        printf("Erreur! La pile est vide!\n");
    }
}

int fill_stack(stack p, int q){
    element tmp = init_element();
    element *ptmp = &tmp;

    for(int i = 0; i < q; i++){
        input_element(ptmp);
        push(p, tmp);
    }

    return 1;
}

第二个问题是分配问题,它发生在其他功能中,例如这个&#34; pop&#34;功能:

element pop(stack p){
    stack ptmp = init_stack();
    if(isEmpty(p) != 1){
        ptmp = p->suiv;
        free(p);
        return *(ptmp->ele);
    }else{
        printf("Erreur! La pile est vide!\n");
    }
}

它会生成此错误:

  

警告:从不兼容的指针类型分配[启用   默认] ptmp = p-&gt; suiv;

我确定它只是某种语法错误,感谢任何帮助,谢谢

----编辑: 这是什么元素:

typedef struct etElement{
    float num;
} element;

element init_element(){
    element p;
    p.num=0.0;
    return p;
}

int affiche_element(element *p){
    printf("Valeur de l\'element:\n");
    printf("%f, ", p->num);
    printf("\n");
    return 1;
}

int affecte_element(element *p, float x){
    p->num = x;
    return 1;
}

int saisir_element(element *p){
    float x = 0;
    scanf("%f", &x);

    if(affecte_element(p, x)){
        return 1;
    } else { 
        return 0; 
    }
}

int compare_element(element *p, element *e){
    if(p->num > e->num){
        printf("%f > %f\n", p->num, e->num);
        return 3;
    }

    if(p->num == e->num){
        printf("%f = %f\n", p->num, e->num);
        return 2;
    }

    if(p->num < e->num) {
        printf("%f < %f\n", p->num, e->num);
        return 1;
    } else {
        return 0;
    }
}

代码的最小例子:

int main(){

    //Initialisation
    stack p = init_stack();

    if(isEmpty(p)==1){
        printf("Empty.\n");
    }else{
        printf("Not empty.\n");
    }

    element e = init_element();
    element *pele = &e;
    assign_element(pele,3.0);

    //Empilation
    if(push(p,e)){
        p=push(p,e);
    }else{
        printf("Echec de l\'empilation.\n");
    }

    show_stack(p);
}

这实际上是我编译的减去一些printfs

虽然我在这里,这里的元素:

typedef struct etElement{
    float num;
} element;

1 个答案:

答案 0 :(得分:1)

struct cel无处定义。

typedef struct etCel{
    element *ele;
    struct cel *suiv;   // <<< this looks wrong to me
} cel;

不应该是:

typedef struct etCel{
    element *ele;
    struct etCel *suiv;   // <<< changement here
} cel;