Đây là đề bài :

Hãy viết chương trình cài đặt thuật toán dồn toa với dữ liệu đầu vào:
Vị trí các toa bên phải cho bởi mảng T.T[i] là số của toa đứng ở vị trí thứ i.i=1,2...N.
Kết quả đầu ra là:
1.Kết luận dồn toa đc( nếu đc thì ghi thêm cách di chuyển từng toa)
2.Ko dồn toa đc.

Sau khi đọc đề thì mình đã có hướng giải bài trên theo cách hiểu đề của mình( ko biết có đúng ý của bài chưa).
Thuật toán của mình là tạo ra 3 stack.
stack 1: đường ray dồn các toa đã được sắp xếp
stack2: đường ray các toa chưa được sắp xếp
stack3: đường ray phụ.
B1: viết hàm tìm số toa nhỏ nhất của stack2.rồi gán nó cho 1 biến,vdu là a.
B2: cho stack2 chạy từng toa.Nếu stack2 khác a thì lấy toa đó ra và đẩy vào stack3.Cứ làm vậy cho tới khi tìm được toa ==a thì đẩy toa đó qua stack1.và thoát khỏi stack2.
B3: lấy các toa ở stack3 đẩy lên lại stack2.sau đó quay lại B1.
Mình đã thử làm và đây là code của mình.Mình làm theo danh sách liên kết đơn.tất nhiên là bài mình làm chạy ko ra kết quả .
Code:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
typedef struct bai2_chuong2{
        int toa;
        struct bai2_chuong2 *next;
        }stack;
stack* getnode(int x){
    stack *p;
    p=(stack*)malloc(sizeof(stack));
    p->toa=x;
    p->next=NULL;
    return p;
}
int push(stack **pdau1,stack **pdau2){
    (*pdau2)->next=(*pdau1);
    pdau1=pdau2;
}
int pop(stack **pdau){
    stack *p;
    p=*pdau;
    (*pdau)=(*pdau)->next;
    free(p);
}
stack* min(stack **pdau){
      stack *min,*p;
      min=*pdau;
      for(p=min->next;p!=NULL;p=p->next)
      if(p->toa<min->toa) min=p;
      return min;
}
int main(){
    stack *stack1=NULL,*stack2=NULL,*stack3=NULL,*m,*p; //stack1=toa sap xep roi,stack 2 toa chua sap xep,stack 3 toa phu/
    int x,n=0;
    
    printf("Nhap so toa theo lan luot_Muon ket thuc thi nhap 0: ");
    while(1){
             scanf("%d",&x);
             if(x==0) break;
             else{
                  if(stack2==NULL){
                                   stack2=getnode(x);
                                   p=stack2;
                                   }
                  else{
                       p->next=getnode(x);
                       p=p->next;
                       }
                  p->next=NULL;
             }
    }         
    while((stack2!=NULL)||(stack3!=NULL)){
                                                        while(stack2!=NULL){
                                                                            m=min(&stack2);
                                                                            if(stack2->toa!=m->toa){
                                                                                               push(&stack3,&stack2);
                                                                                               pop(&stack2);
                                                                                               
                                                                                               }
                                                                            else{
                                                                            push(&stack1,&stack2);
                                                                            pop(&stack2);
                                                                            while(stack3!=NULL){
                                                                                                
                                                                                                push(&stack2,&stack3);
                                                                                                pop(&stack3);
                                                                                                }
                                                                            break;
                                                                            }
                                                        }
    }
    for(p=stack1;p!=NULL;p=p->next)
    printf(" %d ",p->toa);
    getch();
}
Vậy mấy bạn có thể giúp mình chỉ ra lỗi sai trong code vs.:(. Hoặc nếu thuật toán sai thì có thể giúp mình 1 thuật toán khác nếu có code nữa thì càng tốt(Để sau khi làm xong mình so sánh và học tập theo..Thank you so much.