我正在嘗試使用兩個堆疊制作一個后綴來中綴程式。基本思路是這樣的——
ptr1 --> ptr2 --> ptr3 --> ptr4 --> NULL
| --------- | -------- | --------- |
(4*5) ----5 -------- 6 -------- 10
每個運算元是一個單獨的堆疊,ptr 堆疊用于每個運算元的第一個元素的記憶體地址。但是我收到了分段錯誤。我認為這是由于 (*ptr) = (*ptr)->next1; pop 函式中的陳述句。有人可以解釋/解決這個問題以制作一個 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;
}
uj5u.com熱心網友回復:
你的問題肯定出在函式 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 函式中處理 NULL 情況(通常,NULL 保護每個函式是好的)。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://www.uj5u.com/caozuo/419659.html
標籤:
下一篇:實作自定義輸入功能
