Problem p02265 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <stdio.h>
#include <stdlib.h>
typedef struct node {
  int key;
  struct node *prev;
  struct node *next;
} Node;

Node *nil;
void init() {
  nil = (Node *)malloc(sizeof(Node));
  nil->prev = nil;
  nil->next = nil;
}

void insert(int key) {
  Node *x = (Node *)malloc(sizeof(Node));
  x->key = key;
  x->next = nil->next;
  nil->next->prev = x;
  nil->next = x;
  x->prev = nil;
}

Node *listSearch(int key) {
  Node *cur = nil->next;
  while (cur != nil && cur->key != key)
    cur = cur->next;
  return cur;
}

void deleteNode(Node *t) {
  if (t == nil)
    return;
  t->prev->next = t->next;
  t->next->prev = t->prev;
  free(t);
}

void deleteFirst() { deleteNode(nil->next); }

void deleteLast() { deleteNode(nil->prev); }

void deleteKey(int key) { deleteNode(listSearch(key)); }

void printList() {
  Node *cur = nil->next;
  int isf = 0;
  while (1) {
    if (cur == nil) {
      break;
    } else {
      if (isf++ > 0)
        printf(" ");
      printf("%d", cur->key);
      cur = cur->next;
    }
  }
  printf("\\n");
}

int main() {
  int i, n;
  int key;
  char com[15];
  scanf("%d", &n);

  init();

  for (i = 0; i < n; i++) {
    scanf("%s %d", com, &key);
    if (com[0] == 'i') {
      insert(key);
    } else if (com[0] == 'd') {
      if (com[6] == 'F')
        deleteFirst();
      else if (com[6] == 'L')
        deleteLast();
      else
        deleteKey(key);
    }
  }

  printList();

  return 0;
}

Error: TLE

Fixed submission:

#include <cstdio>
#include <cstdlib>
struct Node {
  int value;
  Node *prev, *next;
};
Node *head;
void Init() {
  head = (Node *)malloc(sizeof(Node));
  head->next = head;
  head->prev = head;
}

Node *FindNode(int x) {
  Node *temp = head->next;
  while (temp != head && temp->value != x)
    temp = temp->next;
  return temp;
}
void Insert(int x) {
  Node *temp = (Node *)malloc(sizeof(Node));
  temp->value = x;
  head->next->prev = temp;
  temp->next = head->next;
  head->next = temp;
  temp->prev = head;
}

void Delete(Node *temp) {
  if (!temp)
    return;
  temp->next->prev = temp->prev;
  temp->prev->next = temp->next;
  free(temp);
}

void DeleteFirst() { Delete(head->next); }
void DeleteLast() { Delete(head->prev); }

void PrintList() {
  Node *temp = head->next;
  int flag = 0;
  while (1) {
    if (temp = head)
      break;
    else {
      if (flag++ > 0)
        printf(" ");
      printf("%d", temp->value);
      temp = temp->next;
    }
  }
  printf("\\n");
}
int main() {
  int n;
  scanf("%d", &n);
  char str[12];
  int x;
  Init();
  /*
  while(n--)
  {
          scanf("%s%d",str,&x);
          if(str[0]=='i'){Insert(x);}
          else if(str[0]=='d'&&str[6]=='F')DeleteFirst();
          else if(str[0]=='d'&&str[6]=='L')DeleteLast();
          else if(str[0]=='d'){Delete(FindNode(x));}
  }
  */
  for (int i = 0; i < n; i++) {
    scanf("%s %d", str, &x);
    if (str[0] == 'i') {
      Insert(x);
    } else if (str[0] == 'd') {
      if (str[6] == 'F')
        DeleteFirst();
      else if (str[6] == 'L')
        DeleteLast();
      else
        delete (FindNode(x));
    }
  }
  /*
  Node* temp=head->next;
  while(temp->next!=head)
  {
      printf("%d ",temp->value);
      temp=temp->next;
  }
  printf("%d\\n",temp->value);
  */
  PrintList();
  return 0;
}