【发布时间】:2016-12-14 17:31:23
【问题描述】:
我有两个主要问题。 我的代码是“元素”的堆栈(堆),由结构制成:
typedef struct etCel{
element *ele;
struct cel *suiv;
} cel;
typedef cel* pile;
第一个问题是“isEmpty”函数,它会产生Segmentation fault:
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;
}
第二个问题是赋值问题,出现在其他函数比如这个“pop”函数中:
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->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;
【问题讨论】:
-
这里有几个练习可以说明我刚才所说的:github.com/nbro/c-exercises
-
element是什么?请出示minimal reproducible example。 -
@JessicaChambers 请发布minimal reproducible example,这意味着暴露问题的最少代码,以便我们可以将其复制/粘贴到我们的计算机上,编译它并查看有什么问题。如果有任何意见,也请发表。
-
...您发布的内容可能是最小,但不是完整。我们需要一些可以编译的东西,以便重现您遇到的相同情况。
-
请发布所有您的代码,
init_element、affecte_element、empile和affiche_pile仍然丢失。 Il faut vraiment vous Tirer les vers du nez.