0

私のプログラムは、後置式を読み取り、ツリー実装を使用して中置式と前置式に変換することになっています。pop()メソッドは常に最初の要素を消去せずに提供しますが、その理由がわかりません。どんな助けでも感謝します。

        //tree structur
        typedef struct asa {
          enum {  number_exp,sous_exp_op } type;
          union {
                  int                                    child;
                  struct {
                           struct asa*      left;
                           struct asa*      right;
                           char              oper; }       tree;
              } op;
        } asa;

        //stack
        typedef struct stack {
            int size;

                struct {
                  asa *  element;
                  struct stack* link;
                }e;

        } stack;

        struct stack *top;

        (...)

       asa * pop(){
        asa* e ;
        stack * temp;
        if(top->size == 0 ){
            printf("ERR0R : empty stack\n");
            exit (EXIT_FAILURE);
        }
        else if (top->size >= 1){
            temp = top->e.link;
            e= top->e.element;

            top = temp;
        }
        return e;
    }

void push(asa* node ){
    if(top->size == 0 ){
        top->e.element = node;
        top->e.link = NULL;
        top->size++;
    }
    else if (top->size > 0){
        pile * next = (pile*) malloc(sizeof(top));
        next = top;
        top->e.element = node;
        top->e.link = next;
        top->size++;
    }
}

ログのスナップショット:

ここに画像の説明を入力

4

1 に答える 1

1

あなたの差し迫った問題は、nextいつそれを割り当てるとすぐに破棄しtop->size > 0、構造体全体ではなくポインターのサイズを割り当てていることです。それらを修正するには、関数の最後を に置き換えnext = topて、呼び出しを修正します。top = nextsizeof

    else if (top->size > 0){
        pile * next = (pile*) malloc(sizeof(*top));
        next->e.element = node;
        next->e.link = top;
        next->size = top->size + 1;
        top = next;
    }

また、このスタックの実装は不必要に複雑でエラーが発生しやすいと感じます。スタック サイズが必要な場合は、個々のノードごとではなく、リンク リストのノードとは別にサイズを維持する必要があります。標準のリンクされたリストのイディオムは、空のリスト (スタック) を NULL として表すことです。したがって、push も pop も、空のスタックをチェックするための追加のコードは必要ありません。

typedef struct stack {
    asa *element;
    struct stack *next;
} stack;

void push(stack **head, asa *elem)
{
  stack *new_head = malloc(sizeof(stack));
  new_head->next = head;
  new_head->elem = elem;
  *head = new_head;
}

asa *pop(stack **head)
{
  stack *old_head = *head;
  asa *top_elem = old_head->elem;
  *head = old_head->next;
  free(old_head);
  return top_elem;
}
于 2012-11-18T07:23:31.993 に答える