如何通过其他功能在同一链接列表中添加节点

时间:2018-12-29 22:46:11

标签: c

我正在一个项目中,其目标是将中缀表达式转换为后缀。我的程序具有相同的功能,但是我必须缩短它。 为此,我创建了三个函数,这些函数应在链接的同一列表中添加节点,并在我的主要函数中向我显示该列表。 但这是行不通的,例如,如果在我的函数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);
}

0 个答案:

没有答案