Code:

#include "conio.h"
#include "stdio.h"
#include "alloc.h"

typedef unsigned int Position;
typedef int ElementType;
typedef struct Node{
   ElementType Element;
   Node* Prev;
   Node* Next;
};
typedef Node* List;
Node* Make_Node(ElementType x){
   Node* temp = (Node*)malloc(sizeof(Node));
   temp->Element = x;
   temp->Prev = NULL;
   temp->Next = NULL;
   return temp;
}
//khoi tao Double List
List MakeNull_List(){
   List temp = (List)malloc(sizeof(Node));
   temp->Prev = NULL;
   temp->Next = NULL;
   return temp;
}
//kiem tra Double List rong
char Empty_List(List L){
   return L->Next == NULL;
}
//Them 1 node vao Double List
void Insert(List &L, Node* p) {
      p->Next = L->Next;
      p->Prev = L;
      L->Next = p;
      if(L->Next!=NULL)
         L->Next->Prev = p;
}
//nhap n phan tu la so nguyen vao Double List
List Input_List(unsigned int n) {
   List temp = MakeNull_List();
   ElementType x;
   unsigned int i = 1;
   while(i<=n) {
      printf("\tValue %d = ",i);
      scanf("%d",&x);
      Insert(temp,Make_Node(x));
      i++;
   }
   return temp;
}
//Xuat Double List
void Out_List(List L) {
   List temp = L->Next;
   while(temp!=NULL) {
      printf("%d\t",temp->Element);
      temp = temp->Next;
   }
}
//Bubble Sort theo 1 chieu
void Bubble_Sort(List L) {
   for(List i=L->Next; i!=NULL; i=i->Next)
      for(List j=i->Next; j!=NULL; j=j->Next)
         if(i->Element>j->Element)
         {
            ElementType temp = i->Element;
            i->Element = j->Element;
            j->Element = temp;
         }
}
//chuong trinh chinh
void main() {
   unsigned int n;
   Position p;
   ElementType x;
   printf("Input n = ");
   scanf("%d",&n);
   List S = Input_List(n);
   printf("This List: \n");
   Out_List(S);
   Bubble_Sort(S);
   printf("\nSort Double List:\n");
   Out_List(S);
   getch();
}