双方向連結リスト

以下の命令を受け付ける双方向連結リストを実装しなさい。

insertFirst x 先頭に要素の継ぎ足し
insertLast x 末尾に要素の継ぎ足し
delete x キーxを持つ最初の要素を削除
deleteFirst 先頭の要素を削除
deleteLast 末尾の要素を削除
deleteAll 全要素の削除

入力: 最初の行に命令数n、続くn行においてそれぞれ命令。
出力: 全ての命令が修了した後の連結リスト内のキーの空白区切りによる連続した出力および改行。

入力例1:
6
insertFirst 100
deleteAll
insertLast 50
insertLast 8
insertLast 20
deleteFirst

出力例1
8 20


解答は以下のソースコードになります。

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

int main(void){
    int n,data[10000];
    int i=0,len=0,j=0;
    char name[10000][10000];
    char countname[10000][10000];
    int countdata[10000];
    int counttime=0;

    scanf("%d",&n);
    //printf("%d\n",n);
    for (i=0;i<n;i++){
       scanf("%s %d",&name[i], &data[i]);
       //printf("%s %d\n",name[i], data[i]);
       //len++;
    }
    
    for (i=0;i<n;i++){
      //printf("countdata=%d name=%s data=%d len=%d\n",countdata[i],name[i],data[i],len);
      if (strcmp(name[i],"insertFirst")==0){
         
          insertFirst(countdata, data[i], &len);
          
      }else if (strcmp(name[i],"insertLast")==0){
          insertLast(countdata, data[i], &len);
          
      }else if (strcmp(name[i],"delete")==0){
          
          deleteX(data, data[i], &len);
          
      }else if (strcmp(name[i],"deleteFirst")==0){
          
          deleteFirst(countdata, &len);
          
      }else if (strcmp(name[i],"deleteLast")==0){
          deleteLast(countdata, &len);
      }else if (strcmp(name[i],"ddeleteAll")==0){
          deleteAll(countdata, &len);
      }else {
          printf("error\n");
      }
    }
    
    for (j=0;j<len;j++){
       printf("%d ",countdata[j]);
    }
    return 0;
}

void deleteX(int data[10000],int x, int *len){
    int i= 0,j=0;
    for (i=0;i<*len;i++){
        if (data[i] == x){
            printf("data=%d i=%d",data[i],i);
            for (j=i;j<*len;j++){
                data[i] = data[i+1];
            }
            (*len)--;
            break;
        }
    }
    return;
}

void deleteFirst(int data[10000], int *len){
    int i=0;
    for (i=0;i<*len;i++){
        data[i] = data[i+1];
    }
    (*len)--;
    return;
}

void deleteLast(int data[10000], int *len){
    data[*len-1] = 0;
    (*len)--;
    return;
}

void insertFirst(int data[10000],int num, int *len){
    int i=0;
    for (i=*len-1;i>=0;i--){
        data[i+1] = data[i];
    }
    data[0] = num;
    (*len)++;
    return;
}

void insertLast(int data[10000],int num, int *len){
    data[*len] = num;
    (*len)++;
    return;
}

void deleteAll(int data[10000], int *len){
    int i=0;
    for (i=0;i<*len;i++){
        data[i] = 0;
    }
    len = 0;
    return;
}