Problem p02265 (C++) — buggy submission, verdict: Runtime Error

// 双方向連結リスト
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <vector>

// リスト要素の構造体
typedef struct l_e {
  int key;
  // 前の要素へのポインタ
  l_e *previous;
  // 後ろの要素へのポインタ
  l_e *next;
} list_element;

// リストの情報の構造体
typedef struct l_i {
  list_element *head; // 先頭の要素
  list_element *tail; // 最後尾の要素
} list_info;

list_info st_list_info;

void create_list(void);
int insert_list(int key);
int delete_list(int key);
int delete_first(void);
int delete_last(void);

int main(void) {

  char str[20];
  int n, x, i;

  // リストの初期化
  create_list();

  scanf("%d", &n);

  for (int i = 0; i < n; i++) {
    scanf("%s", &str[0]);

    // 各命令毎の処理
    if (strcmp(str, "insert") == 0) {
      scanf("%d", &x);
      insert_list(x);
    } else if (strcmp(str, "delete") == 0) {
      scanf("%d", &x);
      delete_list(x);
    } else if (strcmp(str, "deleteFirst") == 0) {
      delete_first();
    } else if (strcmp(str, "deleteLast") == 0) {
      delete_last();
    }

    // ---------- デバッグ用 ----------
    /*
    i = 0;

        // 結果の表示
        list_element *p = st_list_info.head;

        while( p != NULL )
        {
            if( i )
            {
                printf(" ");
            }

            printf("%d", p->key);

            p = p->next;

            i++;
        }

        printf("\\n");
            */
    // ---------- デバッグ用 ----------
  }

  i = 0;

  // 結果の表示
  list_element *p = st_list_info.head;

  while (p != NULL) {
    if (i) {
      printf(" ");
    }

    printf("%d", p->key);

    p = p->next;

    i++;
  }

  printf("\\n");

  return 0;
}

// リストを作成する関数
void create_list(void) {
  st_list_info.head = NULL;
  st_list_info.tail = NULL;

  return;
}

// リストの先頭へ要素を追加する関数
int insert_list(int key) {

  list_element *element = new list_element;

  element->key = key;
  element->previous = NULL;
  element->next = NULL;

  if (st_list_info.head == NULL && st_list_info.tail == NULL) {
    st_list_info.head = element;
    st_list_info.tail = element;
  } else {
    // 元の先頭要素の前方のポインタの設定
    st_list_info.head->previous = element;
    // 追加した要素のポインタの設定
    element->previous = NULL;
    element->next = st_list_info.head;
    // 先頭要素のポインタの更新
    st_list_info.head = element;
  }

  return 0;
}

// 指定されたキーを持つ最初の要素をリストから削除する関数
int delete_list(int key) {
  int ret = -1;
  list_element *p = st_list_info.head;

  while (p != NULL) {
    if (p->key == key) {
      if (p == st_list_info.head) {
        // 先頭要素を削除する時
        delete_first();

      } else if (p == st_list_info.tail) {
        // 末尾要素を削除する時
        delete_last();
      } else {
        // ポインタを繋ぎかえる
        p->previous->next = p->next;
        p->next->previous = p->previous;
        // 要素を削除する
        delete (p);
      }

      ret = 0;
      // 処理終了
      break;
    }

    // ポインタの更新
    p = p->next;
  }

  return ret;
}

// リストの先頭要素を削除する関数
int delete_first(void) {
  list_element *p = st_list_info.head;

  if (p->next != NULL) {
    // 先頭要素の前方向のポインタを設定
    p->next->previous = NULL;
    // 先頭要素へのポインタを再設定
    st_list_info.head = p->next;
  } else {
    // 要素が一つしかない時
    create_list();
  }

  // 要素を削除
  delete (p);

  return 0;
}

// リストの末尾要素を削除する関数
int delete_last(void) {
  list_element *p = st_list_info.tail;

  if (p->previous != NULL) {
    // 末尾要素の後方向のポインタを設定
    p->previous->next = NULL;
    // 末尾要素へのポインタを再設定
    st_list_info.tail = p->previous;
  } else {
    // 要素が一つしかない時
    create_list();
  }

  // 要素を削除
  delete (p);

  return 0;
}


Error: 0

Fixed submission:

// 双方向連結リスト
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <vector>

// リスト要素の構造体
typedef struct l_e {
  int key;
  // 前の要素へのポインタ
  l_e *previous;
  // 後ろの要素へのポインタ
  l_e *next;
} list_element;

// リストの情報の構造体
typedef struct l_i {
  list_element *head; // 先頭の要素
  list_element *tail; // 最後尾の要素
} list_info;

list_info st_list_info;

void create_list(void);
int insert_list(int key);
int delete_list(int key);
int delete_first(void);
int delete_last(void);

int main(void) {

  char str[20];
  int n, x, i;

  // リストの初期化
  create_list();

  scanf("%d", &n);

  for (int i = 0; i < n; i++) {
    scanf("%s", &str[0]);

    // 各命令毎の処理
    if (strcmp(str, "insert") == 0) {
      scanf("%d", &x);
      insert_list(x);
    } else if (strcmp(str, "delete") == 0) {
      scanf("%d", &x);
      delete_list(x);
    } else if (strcmp(str, "deleteFirst") == 0) {
      delete_first();
    } else if (strcmp(str, "deleteLast") == 0) {
      delete_last();
    }

    // ---------- デバッグ用 ----------
    /*
    i = 0;

        // 結果の表示
        list_element *p = st_list_info.head;

        while( p != NULL )
        {
            if( i )
            {
                printf(" ");
            }

            printf("%d", p->key);

            p = p->next;

            i++;
        }

        printf("\\n");
            */
    // ---------- デバッグ用 ----------
  }

  i = 0;

  // 結果の表示
  list_element *p = st_list_info.head;

  while (p != NULL) {
    if (i) {
      printf(" ");
    }

    printf("%d", p->key);

    p = p->next;

    i++;
  }

  printf("\\n");

  return 0;
}

// リストを作成する関数
void create_list(void) {
  st_list_info.head = NULL;
  st_list_info.tail = NULL;

  return;
}

// リストの先頭へ要素を追加する関数
int insert_list(int key) {

  list_element *element = new list_element;

  element->key = key;
  element->previous = NULL;
  element->next = NULL;

  if (st_list_info.tail == NULL) {
    st_list_info.head = element;
    st_list_info.tail = element;
  } else {
    // 元の先頭要素の前方のポインタの設定
    st_list_info.head->previous = element;
    // 追加した要素のポインタの設定
    element->previous = NULL;
    element->next = st_list_info.head;
    // 先頭要素のポインタの更新
    st_list_info.head = element;
  }

  return 0;
}

// 指定されたキーを持つ最初の要素をリストから削除する関数
int delete_list(int key) {
  int ret = -1;
  list_element *p = st_list_info.head;

  while (p != NULL) {
    if (p->key == key) {
      if (p == st_list_info.head) {
        // 先頭要素を削除する時
        delete_first();

      } else if (p == st_list_info.tail) {
        // 末尾要素を削除する時
        delete_last();
      } else {
        // ポインタを繋ぎかえる
        p->previous->next = p->next;
        p->next->previous = p->previous;
        // 要素を削除する
        delete (p);
      }

      ret = 0;
      // 処理終了
      break;
    }

    // ポインタの更新
    p = p->next;
  }

  return ret;
}

// リストの先頭要素を削除する関数
int delete_first(void) {
  list_element *p = st_list_info.head;

  // 先頭要素の前方向のポインタを設定
  p->next->previous = NULL;
  // 先頭要素へのポインタを再設定
  st_list_info.head = p->next;
  // 要素を削除
  delete (p);

  return 0;
}

// リストの末尾要素を削除する関数
int delete_last(void) {
  list_element *p = st_list_info.tail;

  // 末尾要素の後方向のポインタを設定
  p->previous->next = NULL;
  // 末尾要素へのポインタを再設定
  st_list_info.tail = p->previous;
  // 要素を削除
  delete (p);

  return 0;
}