Aizu Online JudgeのALDS1_3_Cの問題を解いています。

双方向連結リスト | アルゴリズムとデータ構造 | Aizu Online Judge

原因不明のエラーに悩んでいます。以下がソースコードになります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define QUEUE_SIZE 2000000
#define next(x) ((x + 1) % QUEUE_SIZE)

struct job {
    char *command;
    int key;
} jobs[QUEUE_SIZE];

struct cell {
    int key;
    struct cell *prev;
    struct cell *next;
} head;

int front, rear;

void init(void);
void enqueue(char *command,  int key);
struct job dequeue(void);
void insert(int key);
void delete(int key);
void deleteFirst(void);
void deleteLast(void);

int main(void)
{
    int n, key;
    char *command;
    struct cell *p;

    scanf("%d", &n);
    init();
    for (int i = 0; i < n; i++) {
        scanf("%s %d", command, &key);
        enqueue(command, key);
    }

    while (front != rear) {
        struct job deq = dequeue();
        if (deq.command == "insert") {
            insert(deq.key);
        } else if (deq.command == "delete") {
            delete(deq.key);
        } else if (deq.command == "deleteFirst") {
            deleteFirst();
        } else if (deq.command == "deleteLast") {
            deleteLast();
        } else {
            exit(1);
        }
    }

    // リスト出力
    for (p = head.next; p != NULL; p = p->next) {
        printf("%d ", p->key);
    }
    printf("\n");
    return 0;
}

void init(void)
{
    front = rear = 0;
}

void enqueue(char *command, int key)
{
    if (next(rear) == front) {
        fprintf(stderr, "queue is full.");
        exit(1);
    }
    jobs[rear].command = (char *)malloc(sizeof(char) * sizeof(command) + 1);
    strcpy(jobs[rear].command, command);
    jobs[rear].key = key;
    rear = next(rear);
}

struct job dequeue()
{
    struct job deq;
    if (front == rear) {
        fprintf(stderr, "queue is empty.\n");
        exit(1);
    }
    deq = jobs[front];
    front = next(front);
    return deq;
}

void insert(int key)
{
    struct cell *new;
    new->key = key;
    new->next = head.next;
    new->prev = &head;
    head.next = new;
}

void delete(int key)
{
    struct cell *p;
    if (head.next == NULL) {
        fprintf(stderr, "doubly linked list is empty.\n");
        exit(1);
    }
    p = head.next;
    while (p != NULL && p->key != key) {
        p = p->next;
    }
    p->prev->next = p->next;
    p->next->prev = p->prev;
}

void deleteFirst()
{
    if (head.next == NULL) {
        fprintf(stderr, "doubly linked list is empty.\n");
        exit(1);
    }
    head.next->next->prev = &head;
    head.next = head.next->next;
}

void deleteLast()
{
    if (head.next == NULL) {
        fprintf(stderr, "doubly linked list is empty.\n");
        exit(1);
    }
    struct cell *p;
    p = head.next;
    while (p->next != NULL) {
        p = p->next;
    }
    p->prev->next = NULL;
}

ここで、main関数内でstruct job 型の変数を宣言すると、scanf関数で入力を受け取れなくなります。試しにmain関数のwhile文以下をコメントアウトして、実行すると受け取れました。main関数内でstruct job型の変数を宣言すると、途端に2つ目のscanf関数で入力を受け取れなくなるのです。解決策を教えて下さい。