我正在一个项目中,其目标是将中缀表达式转换为后缀。我的程序具有相同的功能,但是我必须缩短它。 为此,我创建了三个函数,这些函数应在链接的同一列表中添加节点,并在我的主要函数中向我显示该列表。 但这是行不通的,例如,如果在我的函数treat_number推送后显示列表,那行得通,但是主函数中什么都没有显示。 所以我的问题是如何保存列表? 非常感谢:)
int treat_parenthesis(t_node *stack, t_eval *eval, t_node *postfix)
{
if (eval->ch == '(') {
push(&stack, eval->ch);
}
else if (eval->ch == ')')
{
while(stack != NULL && stack->value != '(') {
push(&postfix, pop(&stack));
}
if (stack != NULL && stack->value != '(')
return -1;
else {
pop(&stack);
}
}
}
void treat_number(t_node *stack, t_eval *eval, t_node *postfix)
{
if (eval->ch >= '1' && eval->ch <= '9') {
push(&postfix, eval->ch);
//print_list(postfix);
}
}
void treat_operator(t_node *stack, t_eval *eval, t_node *postfix)
{
if (eval->ch == '(') {
push(&stack, eval->ch);
}
else if (eval->ch == ')')
{
while(stack != NULL && stack->value != '(') {
push(&postfix, pop(&stack));
}
if (stack != NULL && stack->value != '(')
return -1;
else {
pop(&stack);
}
}
//main function
int infix_to_postfix(char *infix, t_eval *eval)
{
int i = -1;
t_node *postfix = malloc(sizeof(t_node));
t_node *stack = malloc(sizeof(t_node));
while((eval->ch = infix[++i]) != '\0')
{
if (eval->ch == ' ')
{
continue;
}
treat_number(stack, eval, postfix);
treat_parenthesis(stack, eval, postfix);
treat_operator(stack, eval, postfix);
}
while (stack != NULL) {
push(&postfix, pop(&stack));
print_list(postfix);
}
stack = NULL;
reverse_list(&postfix);
print_list(postfix);
return (0);
}
//struct in include (.h)
typedef struct s_node
{
int value;
struct s_node *next;
} t_node;
typedef struct s_eval
{
char ch;
} t_eval;
//function to add node
void push(t_node **head_ref, char c)
{
t_node *new_node = malloc(sizeof(t_node));
if (new_node == NULL)
return ;
new_node->value = c;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
char pop(t_node **head_ref)
{
t_node *pop_node = malloc(sizeof(t_node));
if (pop_node == NULL)
return (-1);
pop_node = (*head_ref);
(*head_ref) = (*head_ref)->next;
return (pop_node->value);
}