1. Hi Khách, chúc bạn một ngày nhiều may mắn!

    Hãy TÌM KIẾM trước khi đặt câu hỏi.
    Hãy THÍCH khi thấy hữu ích.
    Hãy PHẢI HỒI nếu chưa hài lòng.

Code 40 thao tác danh sách liên kết đơn + kép

Thảo luận trong 'BT thực hành - Project' bắt đầu bởi Phú Teiuns, 17 Tháng năm 2010.

  1. Đăng ngày 17 Tháng năm 2010 #1

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    Code 40 thao tác danh sách liên kết đơn + kép. Các bạn xem "tham khảo" thôi nhé, khuyên các bạn nên tự viết sẽ giúp ích cho việc lập trình của mình hơnKhi nộp bài nhớ chỉnh hàm main dùm mình nhé, để thầy hỏi k biết trả lời hehe

    Code mình viết có sai sót gì hoặc góp ý giải thuật hay hơn thì reply góp vui cho topic này nhé!Nhớ thanks trước khi down nhé, hum thanks mốt hum koa share nữa đâu


    View attachment 83

    View attachment 84
  2. Đăng ngày 29 Tháng năm 2010 #2

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    LMApro thích bài này.
  3. Đăng ngày 4 Tháng sáu 2010 #3

    • Member

    xuanhuy

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    Bài viết được xuanhuy chỉnh sửa vào lúc 4-6-2010 22:25

    Trả lời 1# Phú Teiuns


    Minh ko hieu lam cac tung doan code trong code 40 thao tac danh sach lien ket don? Co ai giup minh voi? Minh dang lam bai tap ve cac thao tac tren danh sach lien ket don
  4. Đăng ngày 5 Tháng sáu 2010 #4

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    Trả lời 3# xuanhuy


    Bạn xem ý nghĩa từng hàm tại đây: http://tin32.com/diendan/viewthread.php?tid=451877
    Hoặc bạn xem lời gọi hàm main trong các switch case ứng với các menu ( file main.cpp ) để đối chiếu với các hàm trong file ( caidat.cpp ). Vì bài này mình làm theo phương pháp project có menu để chọn!
  5. Đăng ngày 6 Tháng sáu 2010 #5

    • Member

    xuanhuy

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    Bài viết được xuanhuy chỉnh sửa vào lúc 6-6-2010 09:22

    Bài viết được xuanhuy chỉnh sửa vào lúc 6-6-2010 09:19

    Trả lời 4# Phú Teiuns

    Ý của mình là mình ko hiểu lắm về từng câu lệnh về con trỏ? Bạn giải thích ý nghĩa từng câu lệnh giúp mình với? Mình sắp báo cáo rồi bạn?Cảm ơn bạn?
  6. Đăng ngày 6 Tháng sáu 2010 #6

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    Trả lời 5# xuanhuy

    Kiều con trỏ là kiểu cơ sở dùng lưu địa chỉ của một đối tượng dữ liệu khác. Kích thước của biến con trỏ tùy thuộc vào quy ước số byte địa chỉ có trong từng mô hình bộ nhớ của từng ngôn ngữ lập trình cụ thể.
    Cú pháp: <kieu_du_lieu> *<con_tro> // với con_tro là tên con trỏ, còn gọi biến con trỏ
    Examp: int *p // bạn tạo biến con trỏ p có 1 địa chỉ nào đó, có kích thước 2 byte
    Và p không có kiểu dữ liệu data ==> phép gán k=5 sau đó gán p=5 chẳng hạn là sai, nhưng p= &k thì ok ( vì nó chỉ lưu trữ địa chỉ ô nhớ )

    Thêm 1 vd khác: ta khai báo int *k, int *pi ;int *pj; k có địa chỉ ô nhớ là (10A7) chứa data là 5 , pi có địa chỉ ô nhớ là (A0B7)
    Ta làm 1 số phép toán sau:

    pi = &k; // trỏ con trỏ pi đến k , lúc này pi có địa chỉ 10A7
    pj = pi ; // trỏ con trỏ pj đến pi , mà lúc này pi đã trỏ đến k ==> pj cũng đã trỏ đến k ==> pj sẽ mang địa chỉ 10A7

    cout<<k; // =5
    cout<<*pi; // =5
    int kq = k* 5; // =25
    int kq = *pi * 5 // =25

    Nếu ta lấy pi + 1 thì *pi vẫn =5 // Đây chỉ là phép cộng ô địa chỉ con trỏ, giá trị con trỏ không thay đổi.
    Nhưng *pi + 1 thì sẽ bằng 6

    Mình hiểu cấu trúc con trỏ là như vậy, bạn thắc mắc gì thì reply lại nhé!
  7. Đăng ngày 6 Tháng sáu 2010 #7

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    Vd hàm tạo nút:
    Bạn nên debug sẽ thấy rõ các ô nhớ!
    NODE * tao_nut(int x)
    { NODE *p; // Tao con tro p co kieu NODE voi 1 dia chi chua xac dinh 0xCC00XXX
    p=new NODE; // Cap phat dong, tao dia chi cho con tro p, luc nay p da co dia chi, vd: 0000AOB4
    if(p==NULL) // May khong cap phat duoc ==> dia chi con tro se la 00000000
    {cout<<"\n khong du bo nho:";
    exit(0);
    }
    p->data=x; // Gan data = x cho con tro
    p->pNext=NULL; // Tro con tro pNext ve NULL, bay gio p da co hinh dang day du. p gom co 2 phan: phan ben trai chua dia chi 0000AOB4 ( nhu da vd ) chua du lieu = x, va phan ben phai la 1 con tro pNext co dia chi NULL: 00000000
    return p;
    }
  8. Đăng ngày 7 Tháng sáu 2010 #8

    • Member

    xuanhuy

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    Bài viết được xuanhuy chỉnh sửa vào lúc 7-6-2010 10:31

    Bài viết được xuanhuy chỉnh sửa vào lúc 7-6-2010 10:28

    Trả lời 4# Phú Teiuns

    vi du nhu:ham tao ds
    void tao_ds(LIST &l)
    { int x;NODE *p;
    do{
    cout<<"\n nhap x=";
    cin>>x;
    if(x==-1)
    break;
    p=tao_nut(x);
    if(l.pHead==NULL)
    l.pHead=l.pTail=p;
    else{
    l.pTail->pNext=p;
    l.pTail=p;
    }
    }while(1);
    }
    câu lệnh l.pHead=l.pTail=p;//có nghía là j bạn
    l.pTail->pNext=p;
    l.pTail=p;
    2 câu lệnh trên có nghĩa là j bạn
    rồi các lệnh return 0,1,2,3,4 là hàm trả về j bạn;
    rồi còn mấy kệnh này:p->pNext=l.pHead;
    l.pHead=p;
    l.pTail->pNext=p;
    l.pTail=p;
    NODE *k=p->pNext;
    NODE *m=k->pNext;
    p->pNext=m;
    tại sao hàm tạo dsach là dowhile(1);
    p2=truocp2->pNext;
    k->pNext=p->pNext;
    p->pNext=NULL;
    tong+=k->data;
    l.pHead=k->pNext;
    k=l.pHead;
    void noi_ds2(LIST &l,LIST &l1,LIST &l2)
    { khoitao(l1);
    khoitao(l2);
    cout<<"\nNhap danh sach l1. Ket thuc -1";
    tao_ds(l1);
    cout<<"\nNhap danh sach l2. Ket thuc -1";
    tao_ds(l2);
    if(l1.pHead==NULL)
    l=l2;
    if(l2.pHead==NULL)
    l=l1;
    else{
    l1.pTail->pNext=l2.pHead;
    l.pHead=l1.pHead;
    l.pTail=l2.pTail;
    }
    }
    .......
    bạn giải thích jùm mình với?
    mong được bạn giúp đỡ ?Mình cảm ơn bạn nhiều
  9. Đăng ngày 7 Tháng sáu 2010 #9

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    Trả lời 8# xuanhuy
    Bạn nên tìm hiểu qua sách hoặc google danh sách liên kết là gì, nó có hình dạng như thế nào? và liên kết với nhau ra sao?Trước khi làm các thao tác phức tạp như tách danh sách .. Bạn nên hiểu rõ bản chất của dslk và các thao tác như tạo, xuất, thêm phần tử ( trước, sau 1 nút), thêm đầu, thêm cuối, xóa phần tử của danh sách trước khi bạn làm các thao tác nâng cao!
    P/S: lần sau hỏi bạn gửi code kèm với tên hàm để mình dễ giải thích nhé, dưới đây mình giải thích hàm tạo danh sách liên kết, bạn hỏi thêm gì về các hàm khác thì reply mình sẽ giải đáp sớm nhất cho bạn. Thân!



    void tao_ds(LIST &l)
    { int x;NODE *p;
    do{
    cout<<"\n nhap x=";
    cin>>x; // Nhập data của phần tử p cần thêm vào danh sách
    if(x==-1) // Nếu nhập = -1
    break; // thì sẽ không thêm nữa, thoát khỏi vòng lặp vô hạn
    p=tao_nut(x); // Sau khi tao duoc nut p co 1 dia chi nao do ( vd: 0000A0B4 ) , nút này có 2 thành phần data = x và pNext ( chứa địa chỉ con trỏ tiếp theo)
    if(l.pHead==NULL) // Nếu pHead == NULL, Tức danh sách liên kết chưa có phần tử nào, vì lúc đầu khởi tạo pHead và pTail đều trỏ tới NULL
    l.pHead=l.pTail=p; // Lúc này pHead và pTail không trỏ về NULL nữa mà sẽ cùng trỏ về p ==> pHead và pTail đã có cùng địa chỉ của p là 0000A0B4
    // ==> Danh sách đã có 1 phần tử đầu tiên là p
    else{ // Ngược lại, danh sách đã có phần tử rồi, và 2 câu lệnh dưới đây làm nhiệm vụ thêm p sau danh sách đó
    // l.pTail là con trỏ trỏ đến phần tử cuối cùng ==> l.pTail cùng địa chỉ với pt cuối cùng đó = > l.ptail là cũng ngầm hiểu là phần tử cuối cùng
    l.pTail->pNext=p; // l.pTail ->pNext <=> phần tử cuối cùng của dsach -> pNext , và trỏ về p; lúc này danh sách đã có thêm p;
    l.pTail=p; // Dời l.pTail về cuối dãy sau khi thêm p, tức l.pTail bây giờ đã mang địa chỉ của p ==> Đúng theo cấu trúc của 1 danh sách :D /> /> />
    }
    }while(1); //Điều kiện 1 => Vòng lặp chạy vô hạn
    }
  10. Đăng ngày 8 Tháng sáu 2010 #10

    • Member

    xuanhuy

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    Trả lời 9# Phú Teiuns

    Bạn ơi! Bạn giúp mình giải thích lệnh code với? Đây là các Thao tác mình đã rút gọn đi rồi! Mình cảm ơn bạn nhiều !!

    Có phải trước khi vào mình khai báo Kiểu Struct ko!
    typedef struct tag_NODE
    {int data;
    struct tag_NODE* pNext;
    }NODE;

    typedef struct tag_LIST
    {NODE *pHead;
    NODE *pTail;
    }LIST;

    void khoitao(LIST &l)
    {l.pHead=l.pTail=NULL;
    }
    void xuat(LIST l)
    { for(NODE *p=l.pHead;p;p=p->pNext)
    {
    cout<<p->data<<" -> ";
    }
    cout<<"NULL";
    }
    NODE* timx(LIST l,int x)
    {
    for(NODE *p=l.pHead;p;p=p->pNext)
    if(p->data==x)
    return p;
    return NULL;
    }
    NODE* timmax(LIST l)
    { NODE *p=l.pHead;
    for(NODE *k=l.pHead->pNext;k;k=k->pNext)
    { if(k->data>p->data)
    p=k;
    }cout<<"\n gia tri max="<<p->data;
    cout<<"\n ";
    return p;
    return NULL;
    }
    NODE* timmin(LIST l)
    { NODE *p=l.pHead;
    for(NODE *k=l.pHead->pNext;k;k=k->pNext)
    { if(k->data<p->data)
    p=k;
    }cout<<"\n gia tri min="<<p->data;
    cout<<"\n ";
    return p;
    return NULL;
    }
    void themdau(LIST &l)
    {
    int x;
    cout<<"\n nhap x=";
    cin>>x;
    NODE *p=tao_nut(x);
    if(l.pHead==NULL)
    l.pHead=l.pTail=p; //chuyen p sau l.pHead
    else
    {p->pNext=l.pHead;
    l.pHead=p;
    }
    }
    void themdau2(LIST &l,NODE *p)
    { if(l.pHead==NULL)
    l.pHead=l.pTail=p;
    else
    {p->pNext=l.pHead;
    l.pHead=p;
    }
    }
    void themcuoi(LIST &l)
    {
    int x;
    cout<<"\n nhap x=";
    cin>>x;
    NODE *p=tao_nut(x);
    if(l.pTail==NULL)
    l.pHead=l.pTail=p;
    else
    {l.pTail->pNext=p;
    l.pTail=p;
    }
    }
    int them_sau_y_ptx(LIST &l,int x,int y)
    {
    NODE *p=tao_nut(y);
    NODE *q=timx(l,x);
    if(l.pHead==NULL)
    return 0;
    if(q==NULL)
    return 1;
    if(q==l.pTail)
    themcuoi(l);
    else
    {p->pNext=q->pNext;
    q->pNext=p;
    return 3;
    }

    }
    int them_truoc_y_ptx(LIST &l,int x,int y)
    {
    NODE *p=tao_nut(y);
    NODE *q=timx(l,x);
    if(l.pHead==NULL)
    return 0;
    else
    {if(q==NULL)
    return 1;
    if(q==l.pHead)
    themdau(l);
    else
    {NODE *k=l.pHead;
    while(k->pNext!=q)
    k=k->pNext;
    p->pNext=q;
    k->pNext=p;
    return 3;
    }
    }
    }
    int xoadau(LIST &l)
    {
    if(l.pHead==NULL)
    return 0;
    else
    {l.pHead=l.pHead->pNext;
    return 3;
    }
    }
    int xoacuoi(LIST &l)
    {
    NODE *k;
    if(l.pTail==NULL)
    return 0;
    else
    {for(k=l.pHead;k->pNext!=l.pTail;)
    k=k->pNext;
    k->pNext=NULL;
    l.pTail=k;
    return 3;
    }
    }
    int xoaptx(LIST &l,int x)
    { NODE *p=timx(l,x);
    if(l.pHead==NULL)
    return 0;
    if(p==NULL)
    return 1;
    if(p==l.pHead)
    {xoadau(l);
    return 2;
    }
    if(p==l.pTail)
    {xoacuoi(l);
    return 4;
    }
    else
    {NODE *k=l.pHead;
    while(k->pNext!=p)
    k=k->pNext;
    k->pNext=p->pNext;
    return 3;
    }
    }
    int xoa_node_p(LIST &l,NODE *p)
    {
    if(l.pHead==NULL)
    return 0;
    if(p==NULL)
    return 1;
    if(p==l.pHead)
    {xoadau(l);
    return 2;
    }
    if(p==l.pTail)
    {xoacuoi(l);
    return 4;
    }
    else
    {NODE *k=l.pHead;
    while(k->pNext!=p)
    k=k->pNext;
    k->pNext=p->pNext;
    return 3;
    }
    }
    int xoapt_truocx(LIST &l,int x)
    { NODE *p=timx(l,x);
    if(l.pHead==NULL) // dsach rong
    return 0;
    if(p==NULL) // khong tim thay
    return 1;
    if(p==l.pHead) // phan tu can tim dung dau dsach
    return 2;
    if(l.pHead->pNext==p) // phan tu dung thu 2 trong dsach
    { xoadau(l);
    return 3;
    }
    else
    {
    NODE *k=l.pHead;
    while(k->pNext!=p)
    k=k->pNext; // tim duoc nut k ke p
    NODE *q=l.pHead;
    while(q->pNext!=k)
    q=q->pNext; // tim duoc nut ke nut k
    q->pNext=p;
    return 4;
    }
    }
    int xoapt_saux(LIST &l,int x)
    {
    NODE *p=timx(l,x);
    if(l.pHead==NULL)
    return 0;
    if(p==NULL)
    return 1;
    if(p==l.pTail)
    {
    return 2;
    }
    else
    { NODE *k=p->pNext;
    NODE *m=k->pNext;
    p->pNext=m;
    }
    }
    void hoanvi(int &a,int &b)
    {int temp=a;a=b;b=temp;
    }
    void inter_sort(LIST l) //SX doi cho truc tiep
    { for(NODE *p=l.pHead;p!=l.pTail;p=p->pNext)
    {for(NODE *k=p->pNext;k;k=k->pNext)
    {if(p->data>k->data)
    hoanvi(p->data,k->data);}}
    xuat(l);
    }
    void selection_sort(LIST l) //SX kieu chon
    { for(NODE *p=l.pHead;p!=l.pTail;p=p->pNext)
    {NODE *k=p;
    for(NODE *q=p->pNext;q;q=q->pNext)
    {if(k->data>q->data)
    k=q;}
    hoanvi(k->data,p->data);}
    }
    void tach_LIST(LIST &l,LIST &l1,LIST &l2)
    { NODE *p;khoitao(l1);khoitao(l2);
    do
    {
    p=l.pHead;
    l.pHead=p->pNext;
    p->pNext=NULL;
    if(p->data%2==0)
    themdau2(l1,p);
    else
    themdau2(l2,p);
    }
    while(l.pHead!=NULL);
    l.pTail=NULL;
    }
    void noi_ds2(LIST &l,LIST &l1,LIST &l2)
    { khoitao(l1);
    khoitao(l2);
    cout<<"\nNhap danh sach l1. Ket thuc -1";
    tao_ds(l1);
    cout<<"\nNhap danh sach l2. Ket thuc -1";
    tao_ds(l2);
    if(l1.pHead==NULL)
    l=l2;
    if(l2.pHead==NULL)
    l=l1;
    else{
    l1.pTail->pNext=l2.pHead;
    l.pHead=l1.pHead;
    l.pTail=l2.pTail;
    }
    }
    void xoa_LIST(LIST &l)
    {
    NODE *k = l.pHead;
    while(k!=NULL)
    {
    l.pHead=k->pNext;
    k=l.pHead;
    }
    }
    int count_node(LIST l) //dem so nut
    {
    NODE *k=l.pHead;
    int count = 0;
    for(k;k!=NULL;k=k->pNext)
    {
    count++;
    }
    return count;
    }
    long tong_list(LIST l)
    {
    NODE *k=l.pHead;
    int tong = 0;
    for(k;k!=NULL;k=k->pNext)
    {
    tong+=k->data;
    }
    return tong;
    }
    void xoapt_x(LIST &l,NODE *p)
    {
    if(l.pHead==NULL)// ds rong
    l.pTail=NULL;
    if(p==l.pHead)// p o dau
    xoadau(l);
    if(p==l.pTail)// p o cuoi
    xoacuoi(l);
    else
    {
    NODE *k=l.pHead;
    for(;k;k=k->pNext)
    {
    if(k->pNext==p)
    {
    k->pNext=p->pNext;
    p->pNext=NULL;
    }
    }
    delete k;
    }
    }
    void Xoa_truoc_sau_x(LIST &l)
    {
    int x;
    if(l.pHead == l.pTail)
    return;
    cout<<"Nhap phan tu can xoa: ";cin>>x;
    xoapt_truocx(l,x);
    xoapt_saux(l,x);
    }
    void Tao_DS_RAND_SORT(LIST &l)
    { int x;NODE *p;int i=1, n;
    cout<<"Ban muon nhap bao nhieu phan tu: ";cin>>n;
    while(i<=n)
    {
    p=tao_nut(rand()%100);
    if(l.pHead==NULL)
    l.pHead=l.pTail=p;
    else {
    l.pTail->pNext=p;
    l.pTail=p;
    }
    i=i++;
    }
    }
    void Xoa_PT_Trung(LIST &l)
    {
    NODE *p1, *p2, *truocp2;
    p1=l.pHead;
    while(p1) // con tro p1 chay tu dau
    {
    p2=truocp2=p1->pNext;
    while(p2) // con tro p2 chay sau p1
    {
    if(p1->data == p2->data) // so sanh data p1 va p2
    {
    while(truocp2!=p2)
    {
    truocp2=truocp2->pNext;
    }
    xoa_node_p(l,p2);
    p2=truocp2->pNext;
    }
    else p2=p2->pNext;
    }
    p1=p1->pNext;
    }
    }
  11. Đăng ngày 8 Tháng sáu 2010 #11

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    Trả lời 10# xuanhuy

    Mình giúp bạn cũng được thôi, nhưng mình còn bận làm đồ án, bạn phải tự tìm hiểu chứ mình không thể giúp bạn hết được, tự tìm hiểu bạn sẽ nhớ và hiểu sâu hơn, khi nào cần lắm bạn mới hỏi! Bạn hỏi nhiều thế, mình có biết bạn đã hiểu đến đâu để giúp bạn được.
    Lần sau bạn gửi topic hỏi đáp nhé!
    Đây là tài liệu của thầy Nguyễn Trí Tuấn mà mình đã được học, bạn tham khảo, nếu không hiểu lập topic mình sẽ giúp: http://www.4shared.com/file/69219275/3302bf36/HCDH_Khoa_10_-_Tai_lieu_CTDL_-_Nguyen_Tri_Tuan.html
  12. Đăng ngày 13 Tháng sáu 2010 #12

    • Member

    xuanhuy

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    Trả lời 11# Phú Teiuns

    ban oi! ban giai thich jum minh ham xoa ptx
    cac lenh return 0,1,2,3,4 là trả về giá trị gì bạn???Cam on ban^_^
  13. Đăng ngày 13 Tháng sáu 2010 #13

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    rả lời 12# xuanhuy
    PHP:

    int xoaptx
    (LIST &l,int x)
    {       
     
    NODE *p=timx(l,x);
            if(
    l.pHead==NULL)
                    return 
    0;   // Trả về 0 nếu danh sách rỗng, không có phần tử nào để xóa
            
    if(p==NULL)
                    return 
    1;  // Trả về 1 nếu nhập x không tồn tại trong danh sách
            
    if(p==l.pHead)
            {
    xoadau(l);
            return 
    2;   // Trả về 2 nếu đã xóa được phần tử x ở vị trí đầu danh sách
            
    }
            if(
    p==l.pTail)
            {
    xoacuoi(l);
            return 
    4// Trả về 4 nếu đã xóa được phần tử x ở vị trí cuối danh sách
            
    }
            else
            {
    NODE *k=l.pHead;
            while(
    k->pNext!=p)
                    
    k=k->pNext;
            
    k->pNext=p->pNext;
            return 
    3;  // Trả về 3 nếu đã xóa được phần tử x ở trên danh sách ( khác phần tử đầu và cuối )
            
    }
    }
    Sau khi viết hàm này bạn có thể xử lý trong hàm main bằng cấu trúc if ... else để có câu xuất ra
  14. Đăng ngày 14 Tháng sáu 2010 #14

    • Member

    xuanhuy

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    Trả lời 13# Phú Teiuns


    Ban oi tra ve 0,1,2,3,4 có nghĩa là j bạn!!!
    mình có may ham ni mình cũng ko hiểu lắm! mong nhở bạn giúp! cảm ơn bạn!! ^_^
    void selection_sort(LIST l) //SX kieu chon
    { for(NODE *p=l.pHead;p!=l.pTail;p=p->pNext)
    {NODE *k=p;
    for(NODE *q=p->pNext;q;q=q->pNext)
    {if(k->data>q->data)
    k=q;}
    hoanvi(k->data,p->data);}
    }

    void tach_LIST(LIST &l,LIST &l1,LIST &l2)
    { NODE *p;khoitao(l1);khoitao(l2);
    do
    {
    p=l.pHead;
    l.pHead=p->pNext;
    p->pNext=NULL;
    if(p->data%2==0)
    themdau2(l1,p);
    else
    themdau2(l2,p);
    }
    while(l.pHead!=NULL);
    l.pTail=NULL;
    }
    void Xoa_PT_Trung(LIST &l)
    {
    NODE *p1, *p2, *truocp2;
    p1=l.pHead;
    while(p1) // con tro p1 chay tu dau
    {
    p2=truocp2=p1->pNext;
    while(p2) // con tro p2 chay sau p1
    {
    if(p1->data == p2->data) // so sanh data p1 va p2
    {
    while(truocp2!=p2)
    {
    truocp2=truocp2->pNext;
    }
    xoa_node_p(l,p2);
    p2=truocp2->pNext;
    }
    else p2=p2->pNext;
    }
    p1=p1->pNext;
    }
    }
  15. Đăng ngày 14 Tháng sáu 2010 #15

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
    Trả lời 14# xuanhuy

    Reply topic khác trong phần hỏi đáp C++ !
  16. Đăng ngày 4 Tháng tư 2011 #16

    • Moderator

    tiensjvn

    Số bài viết: 424
    Đã được thích: 287
    Điểm thành tích: 63
    Nơi ở:
    Bình Thuận
    Anh Phú ơi, em không chuyển được các thao tác trên dslk đơn sang dslk vòng, cứ sai hoài à, anh giúp em với.
  17. Đăng ngày 6 Tháng tư 2011 #17

    • Administrator

    Phú Teiuns

    Status: Funny!
    Số bài viết: 2,843
    Đã được thích: 714
    Điểm thành tích: 113
    Giới tính: Nam
    Nơi ở:
    Q9-TP.HCM
  18. Đăng ngày 11 Tháng tư 2011 #18

    • Member

    luckytomato611

    Số bài viết: 2
    Đã được thích: 0
    Điểm thành tích: 0
    ai xem giúp mình code này vđ chỗ nào. mói học nen làm cũng không bít sai đâu nũa !!

    --------------------------------------------------------------------------------------------
    #include<conio.h>
    #include<stdio.h>
    #include<alloc.h>
    #include<iostream>
    #include<string.h>
    #include<ctype.h>

    typedef struct MATHANG{
    char Mahang[10];
    char Tenhang[30];
    float Dongia;
    int Soluong;
    char Donvitinh[10];
    };

    typedef struct node{
    MATHANG *info;
    node *next;
    };
    node *head;

    int count = 0;
    void makedone()
    {
    MATHANG mh;
    node *p = new node;
    strcpy ( p -> info.Mahang, mh.Mahang);
    strcpy ( p -> info.Tenhang, mh.Tenhang);
    p -> info.Dongia = mh.Dongia;
    p -> info.Soluong = mh.Soluong;
    strcpy ( p -> info.Donvitinh, mh.Donvitinh);
    p -> next = NULL;
    return p;
    }

    void Insert ( node *p, int n)
    {
    node q, r;
    if ( n==0)
    {
    q= head -> next;
    head -> next = p;
    p -> next = q;
    cout << " Da chen mat hang vao dau danh sach!\n";
    cout ++;
    return;
    }
    q = head -> next ; int i = 0;
    while ( q !=NULL && i<n)
    {
    r = q;
    q = q-> next;
    i++;
    }
    r -> next = p;
    p -> next = q;
    cout<<" Da chen mat hang vao vi tri "<<n<<" trong danh sach ";
    cout ++;
    }

    void traver()
    {
    node *q = head -> next;
    cout << "\n __________________________\n";
    cout << "\n DANH SACH MAT HANG HIEN CO\n\n";
    while ( q!=NULL)
    {
    cout<<"\n Ma mat hang: "<<q->info.Mahang<<"\n";
    cout<<" Ten mat hang: "<<q -> info.Tenhang<<"\n";
    couut<<" Don gia : "<<q->info.Dongia<<"\n";
    cout<<" So luong : "<< q-> info.Soluong<<"\n";
    cout<<" Don vi tinh: "<<q -> info.Donvitinh<<"\n";
    q = q-> next;
    }
    getch();
    }

    void Timkiem ( node *p, char a[10])
    {
    node q;
    p=q;
    while ( q!=NULL && q->info.Mahang = a[10])
    {
    q=q->next;
    if ( q==NULL)
    cout<<" KHONG TIM THAY THONG TIN MAT HANG");
    else cout <<"Thong tin ma hang can tim:\n \n - Ma hang : "<<q->info.Mahang<<" \n - Ten hang: "<<q->info.Tenhang<<"\n - So luong: "<<q->info.Soluong<<"\n - Don gia: "<< q->info.Dongia<<"\n - Don vi tinh: "<< q->info.Donvitinh<<"\n";
    }
    }

    void Taotepmoi( node *p, int n )
    {
    FILE *f;
    node r;
    MATHANG mh;
    f = open ("C:\\QUANLYHANG.DAT","wb");
    cout << "Nhap so mat hang can nhap m : \n";
    cin>>m;
    fflush(stdin);
    if ( f == NULL) cout <<" Khong mo duoc FILE";
    else
    {
    for ( r=p, r-> next<=n; r=r->next)
    {
    cout<<"Mat hang thu: "<<i;
    cout<<" Ma hang: "; gets( mh.Mahang);
    cout<<" Ten hang: "; gets (mh.Tenhang);
    cout<< " Don gia: "; cin>>mh.Dongia;
    cout<<" So luong: "; cin>>mh.Soluong;
    cout<< "Don vi tinh"; gets(mh.Donvitinh);
    p=makenode(mh);
    fwrite(&mh,sizeof(mh),p,f);
    fflush(stdin);
    }
    fclose(f);
    }
    printf("Ban phim bat ky de tiep tuc");
    getch();
    }

    void Themmathang( node*p)
    {
    FILE *f;
    MATHANG mh;
    f=fopen("C:\\QUANLYHANG.DAT","ab");
    if (f == NULL)
    printf("Khong mo duoc FILE");
    else
    {
    cout<<" \nNhap mot mat hang can them: ";
    cout<<" \nNhap vi tri can chen n =:"; cin>>n;
    cout<<" \nMa hang: "; gets( mh.Mahang);
    cout<<" \nTen hang: "; gets (mh.Tenhang);
    cout<< " \nDon gia: "; cin>>mh.Dongia;
    cout<<" \nSo luong: "; cin>>mh.Soluong;
    cout<< "\nDon vi tinh"; gets(mh.Donvitinh);
    p=makenode(mh);
    Insert(p,n);
    fwrite(&sv,sizeof(sv),p,f);
    fflush(stdin);
    }
    fclose(f);
    }
    printf("Ban phim bat ky de tiep tuc");
    getch();

    void Doctepdanhsach(node *p)
    {
    FILE *f;
    node *q;;
    MATHANG mh;
    f=fopen("C:\\SINHVIEN.DAT","rb");
    if (f == NULL)
    printf("Khong mo duoc FILE");
    else
    {
    q = p;
    while (!feof(f))
    {
    if (fread(&sv,sizeof(SinhVien),q->next,f)==q->next)
    {
    cout<<"\nMat hang thu:"<<q->next;
    cout<<"\nMa hang :"; puts(mh.Mahang);
    cout << "\nTen hang:"; puts(mh.Tenhang);
    cout<< "\nDon gia: "<<mh.Dongia;
    cout<<" \nSo luong: "<<mh.Soluong;
    puts(mh.Donvitinh);
    cout<<" \nThanh tien: "<<(mh.Soluong*mh.Dongia);
    }
    }
    fclose(f);
    }
    printf("\nBan phim bat ky de tiep tuc");
    getch();
    }

    main()
    {
    int chon;
    int n; int count=0;
    int Mahang;
    MATHANG mh;
    node *p;
    while(1){
    cout<<"\nDANH SACH QUAN LY MAT HANG BANG LIEN KET DON\n";
    cout<<"\n 1. Tao tep tin chua cac thong tin ve mat hang bang danh sach lien ket don.\n";
    cout<<"\n 2. Nhap mot mat hang moi ghi vao tep.\n";
    cout<<"\n 3. Hien thi thong tin cac mat hang hien co.\n";
    cout<<"\n 4. Tim kiem mot mat hang.\n";
    cout<<"\n 5. Dua ra danh sach mat hang.\n";
    cout<<"\n 6. Thoat.\n";
    chon=getch();
    chon=toupper(chon);
    if ( chon =='6') break;
    switch(chon){
    case '1': Taotepmoi(p,n);
    break;
    case '2': Themmathang(p);
    break;
    case '3': traver();
    break;
    case '4': cout<<"Nhap ma hang:";
    gets(a);
    Timkiem(p,Mahang);
    break;
    case '5': Doctepdanhsach(p);
    break;
    }
    }
    getch();
    }

    ----------------------------------------
    đề bài là:

    Bài toán Quản lí hàng
    Một mặt hàng gồm các thông tin sau đây:
    - Mã hàng
    - Tên hàng
    - Đơn giá
    - Số lượng
    - Đơn vị tính
    Viết chương trình trong đó có ít nhất các chức năng sau
    1. Tạo một tệp QLHANG.DAT mới để chuẩn bị chứa thông tin các mặt hàng
    2. Nhập một mặt hàng mới để ghi vào tệp QLHANG.DAT
    3. Hiển thị thông tin các mặt hàng hiện có
    4. Tìm kiếm một mặt hàng theo mã hàng và đưa ra các thông tin (nếu tìm thấy)
    5. Đưa ra danh sách gồm tên hàng, đơn giá, số lượng và thành tiền.
    Yêu cầu chương trình sử dụng danh sách liên kết để chứa thông tin các mặt hàng và đọc/ghi từ file văn bản trên đĩa.

Chia sẻ trang này