Advertisement
nguyenvanquan7826

quan ly tau hoa

Apr 9th, 2013
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.09 KB | None | 0 0
  1. /*****************************************************************************
  2. *                Chuong trinh quan ly va dieu hanh tuyen xe lua              *
  3. *               Chuong trinh cai dat danh sach lien ket kep, moi nut         *
  4. *                    cua danh sach duoc cap phat bang mot bien dong          *
  5. * Nguoi viet chuong trinh: Trinh Van Chien                                   *
  6. * SV lop TIN DIA CHAT K55  - MSSV 102 105 0008                               *
  7. *****************************************************************************/
  8.  
  9. #include <iostream>
  10. #include <cstdlib>
  11. #include <cstring>
  12. #include <iomanip>
  13. using namespace std;
  14.  
  15. #define TRUE 1
  16. #define FALSE 0
  17.  
  18. // Khai bao cau truc cua mot doan xe lua
  19. typedef struct doan
  20. {
  21.    char gatruoc[12];
  22.    char gasau[12];
  23.    int chieudai;   // km
  24.    int thoigian;   // thoi gian xe lua chay tren doan, tinh theo gio
  25. };
  26.  
  27. // Khai bao cau truc cua mot nut
  28. struct node
  29. {
  30.    doan info;
  31.    struct node *left, *right;
  32. };
  33. typedef struct node *NODEPTR;
  34.  
  35. // Tac vu getnode: cap phat mot nut cho danh sach lien ket kep
  36. NODEPTR getnode(void)
  37. {
  38.    NODEPTR p;
  39.    p = (NODEPTR)malloc(sizeof(struct node));
  40.    return(p);
  41. }
  42.  
  43. // Tac vu freenode: huy nut da cap phat
  44. void freenode(NODEPTR p)
  45. {
  46.    free(p);
  47. }
  48.  
  49. // Tac vu initialize: khoi dong danh sach lien ket kep
  50. void initialize(NODEPTR *plist)
  51. {
  52.    *plist = NULL;
  53. }
  54.  
  55. // Tac vu empty: kiem tra danh sach lien ket kep co bi rong khong
  56. int empty(NODEPTR *plist)
  57. {
  58.    return((*plist == NULL) ? TRUE : FALSE);
  59. }
  60.  
  61. // Tac vu listsize: xac dinh so nut co trong danh sach lien ket kep
  62. int listsize(NODEPTR *plist)
  63. {
  64.    NODEPTR p;
  65.    int n;
  66.    p = *plist;  // p chi nut dau
  67.    n = 0;
  68.    while(p != NULL)
  69.    {
  70.       p = p->right;
  71.       n++;
  72.    }
  73.    return(n);
  74. }
  75.  
  76. /* Tac vu nodepointer: xac dinh con tro chi nut thu i (i=0,1,2,...) trong
  77.    danh sach lien ket kep */
  78. NODEPTR nodepointer(NODEPTR *plist, int i)
  79. {
  80.    NODEPTR p;
  81.    int vitri;
  82.    p = *plist;      // p chi nut dau dslk vong
  83.    vitri = 0;
  84.    while(p != NULL && vitri < i)
  85.    {
  86.       p = p->right;
  87.       vitri++;
  88.    }
  89.    return(p);
  90. }
  91.  
  92. // Tac vu position: xac dinh vi tri cua nut p trong danh sach lien ket kep
  93. int position(NODEPTR *plist, NODEPTR p)
  94. {
  95.     int vitri;
  96.     NODEPTR q;
  97.     q = *plist;
  98.     vitri = 0;
  99.     while(q != NULL && q != p)
  100.     {
  101.         q = q->right;
  102.         vitri++;
  103.     }
  104.     if(q == NULL)
  105.         return(-1);
  106.     return(vitri);
  107. }
  108.  
  109. // Tac vu push: them nut vao dau danh sach lien ket
  110. void push(NODEPTR *plist, doan x)
  111. {
  112.    NODEPTR p;
  113.    p = getnode();
  114.    p->info = x;
  115.    if(*plist == NULL)  // truong hop danh sach rong
  116.    {
  117.       p->left = NULL;
  118.       p->right = NULL;
  119.       *plist = p;
  120.    }
  121.    else
  122.    {
  123.       // tao lien ket giua p va plist
  124.       p->right = *plist;
  125.       (*plist)->left = p;
  126.  
  127.       p->left = NULL;
  128.       *plist = p;
  129.    }
  130. }
  131.  
  132. // Tac vu insertright: them nut moi sau nut p
  133. void insertright(NODEPTR p, doan x)
  134. {
  135.    NODEPTR q, r;  // q la nut can them vao, p la nut truoc, r la nut sau
  136.    if(p == NULL)
  137.       cout<<"Nut p khong hien huu, khong them nut duoc"<<endl;
  138.    else
  139.    {
  140.       q = getnode();
  141.       q->info = x;
  142.       r = p->right;
  143.       // tao hai lien ket giua r va q
  144.       if (r != NULL)
  145.         r->left = q;
  146.       q->right = r;
  147.       // tao hai lien ket giua p va q
  148.       q->left = p;
  149.       p->right = q;
  150.    }
  151. }
  152.  
  153. // Tac vu insertleft: them nut moi truoc nut p
  154. void insertleft(NODEPTR *plist, NODEPTR p, doan x)
  155. {
  156.    NODEPTR q, r;  // q la nut can them vao, p la nut sau, r la nut truoc
  157.    if(p == NULL)
  158.       cout<<"Nut p khong hien huu, khong them nut duoc"<<endl;
  159.    else
  160.    {
  161.       if(p == *plist)  // them nut vao dau danh sach
  162.          push(plist, x);
  163.       else
  164.       {
  165.          q = getnode();
  166.          q->info = x;
  167.          r = p->left;
  168.          // tao hai lien ket giua r va q
  169.          r->right = q;
  170.          q->left = r;
  171.          // tao hai lien ket giua p va q
  172.          q->right = p;
  173.          p->left = q;
  174.       }
  175.    }
  176. }
  177.  
  178. // Tac vu pop: xoa nut o dau danh sach lien ket
  179. doan pop(NODEPTR *plist)
  180. {
  181.    NODEPTR p;
  182.    doan x;
  183.    if(empty(plist))  // truong hop danh sach rong
  184.       cout<<"Danh sach rong, khong xoa nut duoc"<<endl;
  185.    else
  186.    {
  187.       p = *plist;  // p la nut can xoa
  188.       x = p->info;
  189.       if((*plist)->right == NULL)  // truong hop danh sach co mot nut
  190.          *plist = NULL;
  191.       else
  192.       {
  193.          *plist = p->right;
  194.          (*plist)->left = NULL;
  195.       }
  196.       freenode(p);
  197.       return(x);
  198.    }
  199. }
  200.  
  201. // Tac vu delnode: xoa nut co con tro la p
  202. doan delnode(NODEPTR *plist, NODEPTR p)
  203. {
  204.    NODEPTR q, r;
  205.    doan x;
  206.    if(p == NULL)
  207.       cout<<"Nut p khong hien huu, khong xoa nut duoc"<<endl;
  208.    else
  209.    {
  210.       if(*plist == NULL)  // truong hop danh sach rong
  211.          cout<<"Danh sach rong, khong xoa nut duoc";
  212.       else
  213.       {
  214.          if(p == *plist)  // truong hop xoa nut dau
  215.             x = pop(plist);
  216.          else
  217.          {
  218.             x = p->info;
  219.             q = p->left;   // q la nut truoc
  220.             r = p->right;  // r la nut sau
  221.             // tao hai lien ket giua q va r
  222.             r->left = q;
  223.             q->right = r;
  224.             freenode(p);
  225.          }
  226.          return(x);
  227.       }
  228.    }
  229. }
  230.  
  231. // Tac vu righttraverse: duyet danh sach tu trai sang phai (duyet xuoi)
  232. void righttraverse(NODEPTR *plist)
  233. {
  234.    NODEPTR p;
  235.    int stt;
  236.    if(empty(plist))
  237.       cout<<endl<< "(khong co doan nao)";
  238.    else
  239.    {
  240.       p = *plist;  // p chi nut dau
  241.       stt = 0;
  242.       while(p != NULL)
  243.       {
  244.          cout<<setw(5)<<stt++<<setw(12)<<p->info.gatruoc<<setw(12)<<p->info.gasau<<setw(12)<<p->info.chieudai<<setw(7)<<p->info.thoigian<<endl;
  245.          p = p->right;
  246.       }
  247.    }
  248. }
  249.  
  250. // Tac vu lefttraverse: duyet danh sach tu phai sang trai (duyet nguoc)
  251. void lefttraverse(NODEPTR *plist)
  252. {
  253.    NODEPTR p;
  254.    int stt;
  255.    if(empty(plist))
  256.       cout<<endl<< "(khong co doan nao)";
  257.    else
  258.    {
  259.       stt = 0;
  260.       p = nodepointer(plist, listsize(plist)-1);  // p chi nut cuoi
  261.       while(p != NULL)
  262.       {
  263.          cout<<setw(5)<<stt++<<setw(12)<<p->info.gatruoc<<setw(12)<<p->info.gasau<<setw(12)<<p->info.chieudai<<setw(7)<<p->info.thoigian<<endl;
  264.          p = p->left;
  265.       }
  266.    }
  267. }
  268.  
  269. // Tac vu search1: tim ga truoc cua mot doan
  270. NODEPTR search1(NODEPTR *plist, char x[])
  271. {
  272.    NODEPTR p;
  273.    p = *plist;
  274.    while(strcmp(p->info.gatruoc, x) != 0 && p != NULL)
  275.       p = p->right;
  276.    return(p);
  277. }
  278.  
  279. // Tac vu search2: tim ga sau cua mot doan
  280. NODEPTR search2(NODEPTR *plist, char x[])
  281. {
  282.    NODEPTR p;
  283.    p = *plist;
  284.    while(strcmp(p->info.gasau, x) != 0 && p != NULL)
  285.       p = p->right;
  286.    return(p);
  287. }
  288.  
  289. // Tac vu clearlist: xoa toan bo danh sach lien ket kep
  290. void clearlist(NODEPTR *plist)
  291. {
  292.    while(*plist != NULL)
  293.       pop(plist);
  294. }
  295.  
  296. void baolotrinh(NODEPTR *plist, char noidi[], char noiden[], char c)
  297. {
  298.    NODEPTR p, p1;
  299.    int kc, tg;
  300.  
  301.    if(c == 'x')
  302.    {
  303.        p = search1(plist, noidi);
  304.        if(p == NULL)
  305.        {
  306.          cout<<"Khong co noi di";
  307.          return;
  308.       }
  309.       if(strcmp(noidi, noiden) == 0)
  310.       {
  311.          cout<<"Noi di trung noi den";
  312.          return;
  313.       }
  314.        p1 = search2(plist, noiden);
  315.        if(p1 == NULL)
  316.        {
  317.          cout<<"Khong co noi den";
  318.          return;
  319.       }
  320.  
  321.       if(position(plist, p) <= position(plist, p1))
  322.       {
  323.          kc = tg = 0;
  324.          while(p != p1)
  325.          {
  326.             kc = kc + p->info.chieudai;
  327.             tg = tg + p->info.thoigian;
  328.             cout<<endl<<p->info.gatruoc<<" -> " <<p->info.gasau <<": " <<p->info.chieudai<<"Km " <<p->info.thoigian<<" gio";
  329.             p = p->right;
  330.          }
  331.          kc = kc + p1->info.chieudai;
  332.          tg = tg + p1->info.thoigian;
  333.          cout<<endl<<p1->info.gatruoc<<" -> " <<p1->info.gasau <<": " <<p1->info.chieudai<<"Km " <<p1->info.thoigian<<" gio";
  334.          cout<<endl<<"Tong chieu dai lo trinh: "<<kc<<" km. Tong thoi gian van chuyen "<<tg<<" gio";
  335.       }
  336.       else
  337.          cout<<"Khong di xuoi duoc";
  338.       return;
  339.    }
  340.  
  341.    if(c == 'n')
  342.    {
  343.        p = search2(plist, noidi);
  344.        if(p == NULL)
  345.        {
  346.          cout<<"Khong co noi di";
  347.          return;
  348.       }
  349.       if(strcmp(noidi, noiden) == 0)
  350.       {
  351.          cout<<"Noi di trung noi den";
  352.          return;
  353.       }
  354.        p1 = search1(plist, noiden);
  355.        if(p1 == NULL)
  356.        {
  357.         cout<<"Khong co noi den";
  358.          return;
  359.       }
  360.  
  361.       if(position(plist, p) >= position(plist, p1))
  362.       {
  363.          kc = tg = 0;
  364.          while(p != p1)
  365.          {
  366.             kc = kc + p->info.chieudai;
  367.             tg = tg + p->info.thoigian;
  368.             cout<<endl<<p->info.gatruoc<<" -> " <<p->info.gasau <<": " <<p->info.chieudai<<"Km " <<p->info.thoigian<<" gio";
  369.             p = p->left;
  370.          }
  371.          kc = kc + p1->info.chieudai;
  372.          tg = tg + p1->info.thoigian;
  373.          cout<<endl<<p1->info.gasau<<" -> " <<p1->info.gatruoc <<": " <<p1->info.chieudai<<"Km " <<p1->info.thoigian<<" gio";
  374.  
  375.          cout<<endl<<"Tong chieu dai lo trinh: "<<kc<<" km. Tong thoi gian van chuyen "<<tg<<" gio";
  376.       }
  377.       else
  378.          cout<<"Khong di nguoc duoc";
  379.       return;
  380.    }
  381. }
  382.  
  383. // chuong trinh chinh
  384. int main()
  385. {
  386.    NODEPTR plist, p, p1;
  387.    doan ga;
  388.    int vitri, chucnang;
  389.    char c;
  390.    char noidi[12], noiden[12];
  391.  
  392.    system("cls");
  393.  
  394.    // khoi dong danh sach lien ket kep
  395.    initialize(&plist);
  396.  
  397.    do
  398.    {
  399.       // menu chinh cua chuong trinh
  400.       cout<<endl<<endl<<"CHUONG TRINH QUAN LY VA DIEU HANH TAU THONG NHAT HA NOI - SAI GON"<<endl;
  401.       cout<<"Sinh vien thuc hien : TRINH VAN CHIEN  Lop TIN DIA CHAT K55"<<endl;
  402.       cout<<"\* * * * * * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * "<<endl;
  403.       cout<<"   1: Them mot doan"<<endl;
  404.       cout<<"   2: Xoa mot doan"<<endl;
  405.       cout<<"   3: Xem lo trinh 1 (lo trinh xuoi)"<<endl;
  406.       cout<<"   4: Xem lo trinh 2 (lo trinh nguoc)"<<endl;
  407.       cout<<"   5: Xem thong tin cua doan thu i"<<endl;
  408.       cout<<"   6: Hieu chinh thong tin ve doan thu i"<<endl;
  409.       cout<<"   7: Thong tin lo trinh"<<endl;
  410.       cout<<"   0: Ket thuc chuong trinh"<<endl;
  411.       cout<<"Chuc nang ban chon: "<<endl;
  412.       cin>>chucnang;
  413.       switch(chucnang)
  414.       {
  415.          case 1:
  416.           {
  417.              cout<<"\nVi tri (0,1,2,...): ";
  418.              cin>>vitri;
  419.              cout<<"Ten ga truoc: ";
  420.              cin>>ga.gatruoc;
  421.              cout<<"Ten ga sau: ";
  422.              cin>>ga.gasau;
  423.              cout<<"Chieu dai (km): ";
  424.              cin>>ga.chieudai;
  425.              cout<<"Thoi gian (gio): ";
  426.              cin>>ga.thoigian;
  427.              if(vitri == 0)
  428.                 push(&plist, ga);
  429.              else
  430.                 insertright(nodepointer(&plist, vitri-1), ga);
  431.              break;
  432.           }
  433.           case 2:
  434.           {
  435.              cout<<"\nVi tri (0,1,2,...): ";
  436.              cin>>vitri;
  437.             p = nodepointer(&plist, vitri);
  438.             if(p == NULL)
  439.                cout<<"Vi tri khong hop le";
  440.             else
  441.                 if(vitri == 0)
  442.                    pop(&plist);
  443.                 else
  444.                    delnode(&plist, p);
  445.              break;
  446.           }
  447.           case 3:
  448.           {
  449.              cout<<endl<<"Xem lo trinh 1 (duyet xuoi): ";
  450.             cout<<endl<<"STT          TU         DEN         CD         TG"<<endl;
  451.              righttraverse(&plist);
  452.              break;
  453.           }
  454.           case 4:
  455.           {
  456.              cout<<endl<<"Xem lo trinh 1 (duyet nguoc): ";
  457.             cout<<endl<<"STT          TU         DEN         CD         TG"<<endl;
  458.              lefttraverse(&plist);
  459.              break;
  460.           }
  461.           case 5:
  462.           {
  463.              cout<<"\nVi tri (0,1,2,...): ";
  464.              cin>>vitri;
  465.             p = nodepointer(&plist, vitri);
  466.             if(p == NULL)
  467.                cout<<"Vi tri khong hop le";
  468.             else
  469.                cout<<endl<<"Doan: "<<vitri<<" Tu: "<<p->info.gatruoc<<" Den:" <<p->info.gasau<<" Chieu dai: " <<p->info.chieudai<< " km  Thoi gian: "<<p->info.thoigian<<" gio";
  470.              break;
  471.           }
  472.           case 6:
  473.           {
  474.              cout<<"\nVi tri: ";
  475.              cin>>vitri;
  476.             p = nodepointer(&plist, vitri);
  477.             if(p == NULL)
  478.                cout<<"Vi tri khong hop le";
  479.             else
  480.             {
  481.                 cout<<endl<<"Doan: "<<vitri<<" Tu: "<<p->info.gatruoc<<" Den:" <<p->info.gasau<<" Chieu dai: " <<p->info.chieudai<< " km  Thoi gian: "<<p->info.thoigian<<" gio";
  482.                 cout<<"Ten ga truoc: ";
  483.                 cin>>ga.gatruoc;
  484.                 cout<<"Ten ga sau: ";
  485.                 cin>>ga.gasau;
  486.                 cout<<"Chieu dai (km): ";
  487.                 cin>>ga.chieudai;
  488.                 cout<<"Thoi gian (gio): ";
  489.                 cin>>ga.thoigian;
  490.                 p->info = ga;
  491.             }
  492.              break;
  493.           }
  494.           case 7:
  495.           {
  496.             cout<<endl<<"Ban di xuoi hay nguoc (x/n): ";
  497.             cin>>c;
  498.              cout<<endl<<"Cho biet noi di: ";
  499.              cin>>noidi;
  500.              cout<<endl<<"Cho biet noi den: ";
  501.              cin>>noiden;
  502.             baolotrinh(&plist, noidi, noiden, c);
  503.              break;
  504.           }
  505.       }
  506.    } while(chucnang != 0);
  507.  
  508.    // Xoa toan bo cac nut tren danh sach lien ket
  509.    clearlist(&plist);
  510. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement