我正在尝试使用两个堆栈来制作后缀以插入程序。基本的想法是-
ptr1 -> ptr2 --> ptr3 --> ptr4 --> NULL
?
(4*5)
每个操作数是一个单独的堆栈,ptr堆栈用于每个操作数的第一个元素的内存地址。但是我得到了一个分割错误。我认为这是由于pop函数中的(*ptr) = (*ptr)->next1;语句造成的。有人能解释/修复这一点,使pop函数返回顶部的操作数堆栈的地址,同时弹出ptr堆栈吗?完整的代码-
struct bracket {
char c;
struct bracket* next;
};
struct outer {
struct bracket *down;
struct outer *next1;
};
struct outer* push_ptr (struct bracket *ptr,struct outer * out){
struct outer *temp = NULL;
temp = (struct outer*)malloc(sizeof(struct outer));
temp->down = ptr;
temp->next1 = out;
return temp;
}
struct bracket* push_ch(char ch,struct bracket *head){
struct bracket *temp = NULL;
temp = (struct bracket*)malloc(sizeof(struct bracket));
temp->c = ch;
temp->next = head;
return temp;
}
struct bracket* pop(struct outer **ptr){
struct bracket *top = (struct bracket*)malloc(sizeof(struct bracket));
top = (*ptr)->down;
(*ptr) = (*ptr)->next1;
return top;
}
int main(){
char c[] = "25,9,6,/,-,3,/";
struct outer * address = NULL;
struct bracket * num;
for (int i=0;i<strlen(c);i=i+1){
if(c[i]==',') continue;
else if (c[i]=='*' || c[i]=='-' || c[i]=='+' || c[i]=='/'){
struct bracket *top1 = pop(&address);
struct bracket *top2 = pop(&address);
}
else {
num = NULL;
while(c[i]!=','){
num = push_ch(c[i],num);
i = i+1;
}
address = push_ptr(num,address);
}
}
return 0;
}发布于 2022-01-23 09:52:13
你的问题肯定是函数pop().
struct bracket* pop(struct outer **ptr){
struct bracket *top = (struct bracket*)malloc(sizeof(struct bracket));
top = (*ptr)->down;
(*ptr) = (*ptr)->next1;
return top;
}你每次都会从外部ptr弹出,最终,在某一时刻,它仍然是空的。让我们了解当它是空的时候会发生什么。因此,您传递一个指向NULL的引用结构外部**ptr。因此它将无法在这一行上检索(*ptr)->down ..。
top = (*ptr)->down;你就会有一个分割错误。您应该在pop函数中处理空情况(一般来说,空保护每个函数是好的)。pop函数的另一种实现可能是.
struct bracket* pop(struct outer **ptr){
struct bracket *top = (struct bracket*)malloc(sizeof(struct bracket));
if (*ptr)
{
top = (*ptr)->down;
(*ptr) = (*ptr)->next1;
}
else
top = NULL;
return top;
}这将修复分段错误。如果外部结构不包含任何元素,它将返回NULL。
https://stackoverflow.com/questions/70819015
复制相似问题