以下のコードは双方向リストを用いて入力した数値を昇順に格納するプログラムです。

void insert() は p の指す要素の前に w の指す要素を挿入する。
struct data_t *insert_pos(struct data_t *p, struct data_t :*w):先頭要素 p を受け取り、
w の挿入する位置を返す。
void printasc(struct data_t*p), void printdsc(struct data_t *p): 先頭要素 p を受けと

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

struct data_t{
  int num;
  struct data_t *next, *prev;
};

void insert(struct data_t *p, struct data_t *w){
    p->prev->next=w;
    w->prev=p->prev;
    p->prev=w;
    w->next=p;
}

void remove_list(struct data_t *p,int index){
  struct data_t *a;
  int i=0;
  for(a=p->next;a!=p;a=a->next){
    if(i== index){
      a->next->prev=a->prev;
      a->prev->next=a->next;
      break;
    }
    i+=1;
  }
}


void printall(struct data_t *p){
  struct data_t *a;
  for(a=p->next;a!=p;a=a->next){
  printf("[p:%p, bp:%p, fp:%p, data:%d]\n", a, a->prev, a->next, a->num);
  }
  printf("\n");
}


int main(){
  struct data_t *p, *w, *head;
  int d, count=0;
  head->next=head;
  head->prev=head;
  printf("State Input\n");
  for(;scanf("%d", &d)!=EOF;count++){
    w=(struct data_t *)malloc(sizeof(struct data_t));
    w->num=d;
    insert(head, w);
  }
  printf("State Remove\n");
  while(scanf("%d", &d)!=EOF){
    if(count<=d){
      printf("List does not have the index number:%d\n", d);
    }else if(count>d){
      remove_list(head, d);
      count-=1;
    }
  }
  printall(head);
  return 0;
}