Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Xóa một phần tử trong danh sách liên kết kép (DoublyLinkedList)

  1. #1
    Ngày gia nhập
    04 2008
    Nơi ở
    Số 22 Ngõ 125 Thanh Xuân Hà Nội
    Bài viết
    10

    Unhappy Xóa một phần tử trong danh sách liên kết kép (DoublyLinkedList)

    Mình làm một danh sách liên kết kép gồm các phương thức sau đây:
    +> Thêm một phần tử vào cuối danh sách
    +> Xóa một phần tử trong danh sách
    +> Duyệt danh sách
    Thắc mắc:
    Giờ mình chèn một danh sách 3; 4; 5; 7 và xóa đi phần tử 4. Kết quả là sau khi duyệt danh sách còn lại là 5; 7
    Và đây là code mong các bạn chỉ giúp mình. Mình cảm ơn ạ!
    file DoublyLinkedList.h
    C++ Code:
    1. #ifndef DoublyLinkedList_H
    2. #define DoublyLinkedList_H
    3. #include <iostream>
    4. using namespace std;
    5. template <class T>
    6. struct Node{
    7.     T info;
    8.     Node *next;
    9.     Node *prev;
    10. };
    11. template <class T>
    12. class DLL
    13. {
    14. private:
    15.     Node<T> *head;
    16.     Node<T> *tail;
    17. public:
    18.     DLL();
    19.     DLL(const DLL<T> &);//cau tu sao chep
    20.     void ChenMotPhanTu(T _val);
    21.     void DuyetDanhSach();
    22.     void XoaPhanTu(T );
    23. };
    24. template <class T>
    25. DLL<T>::DLL()
    26. {
    27.     head = NULL;
    28.     tail = NULL;
    29. }
    30. //
    31. template <class T>
    32. void DLL<T>::ChenMotPhanTu(T _val)
    33. {
    34.     Node<T> *tmp = new Node<T>;
    35.     tmp->info = _val;
    36.     Node<T> *p = head;
    37.     //neu danh sach rong
    38.     if(head == NULL)
    39.     {
    40.         head = tail = tmp;
    41.         tmp->next = NULL;
    42.         tmp->prev = NULL;
    43.     }
    44.     else
    45.     {
    46.         /*while(p!=NULL)
    47.         {
    48.             p = p->next;
    49.         }
    50.         p->next = tmp;
    51.         tmp->prev = tail;
    52.         tail = tmp;*/
    53.         tail->next = tmp;
    54.         tmp->next = NULL;//dieu nay hok can thiet
    55.         tail = tmp;
    56.     }
    57. }
    58. //Duyet danh sach
    59. template <class T>
    60. void DLL<T>::DuyetDanhSach()
    61. {
    62.     Node<T> *tmp = head;
    63.     while(tmp)
    64.     {
    65.         cout<<tmp->info<<";";
    66.         tmp = tmp->next;
    67.     }
    68. }
    69. //xoa mot phan tu trong danh sach
    70. template <class T>
    71. void DLL<T>::XoaPhanTu(T _val)
    72. {
    73.     //duyet tu dau danh sach cho den
    74.     Node<T> *tmp = head;
    75.     while(tmp && tmp->info!= _val)
    76.     {
    77.         tmp = tmp->next;
    78.     }
    79.     //lay Node hien tai ra va xu ly
    80.  
    81.     if(tmp)
    82.     {
    83.         //neu dang o dau
    84.         if(tmp->next)
    85.         {
    86.             tmp->next->prev = tmp->prev;
    87.             head = tmp->next;
    88.         }
    89.         //cuoi danh sach
    90.         else if(tmp->prev)
    91.         {
    92.             tmp->prev->next = tmp->next;
    93.             tail = tmp->prev;
    94.         }
    95.         else if(tmp->next && tmp->prev)
    96.         {
    97.             tmp->prev->next = tmp->next;
    98.             tmp->next->prev = tmp->prev;
    99.         }
    100.         delete tmp;
    101.     }
    102. }
    103. #endif
    file main.cpp
    C++ Code:
    1. #include "DoublyLinkedList.h"
    2. #include <iostream>
    3. using namespace std;
    4. int main()
    5. {
    6.     DLL<int> a;
    7.     a.ChenMotPhanTu(3);
    8.     a.ChenMotPhanTu(4);
    9.     a.ChenMotPhanTu(5);
    10.     a.ChenMotPhanTu(7);
    11.     //
    12.     a.XoaPhanTu(4);
    13.  
    14.     a.DuyetDanhSach();
    15.     return 0;
    16. }

  2. #2
    Ngày gia nhập
    06 2012
    Bài viết
    37

    Sửa sai trong hàm insert + hàm delete rồi nhá

    PHP Code:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    template <class T>
    struct Node{
        
    T info;
        
    Node *next;
        
    Node *prev;
    };
    template <class T>
    class 
    DLL
    {
    private:
        
    Node<T> *head;
        
    Node<T> *tail;
    public:
        
    DLL();
        
    DLL(const DLL<T> &);//cau tu sao chep
        
    void ChenMotPhanTu(T _val);
        
    void DuyetDanhSach();
        
    void XoaPhanTu();
    };
    template <class T>
    DLL<T>::DLL()
    {
        
    head NULL;
        
    tail NULL;
    }
    //
    template <class T>
    void DLL<T>::ChenMotPhanTu(T _val)
    {
        
    Node<T> *tmp = new Node<T>;
        
    tmp->info _val;
        
    Node<T> *head;
        
    //neu danh sach rong
        
    if(head == NULL)
        {
            
    head tail tmp;
            
    tmp->next NULL;
            
    tmp->prev NULL;
        }
        else
        {
            
    /*while(p!=NULL)
            {
                p = p->next;
            }
            p->next = tmp;
            tmp->prev = tail;
            tail = tmp;*/
            
    tail->next tmp;
            
    tmp->next NULL;
        
    tmp->prev tail;   // Cần cập nhật lại node trước của node hiện tại
            
    tail tmp;
        }
    }
    //Duyet danh sach
    template <class T>
    void DLL<T>::DuyetDanhSach()
    {
        
    Node<T> *tmp head;
        while(
    tmp)
        {
            
    cout<<tmp->info<<";";
            
    tmp tmp->next;
        }
    }
    //xoa mot phan tu trong danh sach
    template <class T>
    void DLL<T>::XoaPhanTu(T _val)
    {
        
    //duyet tu dau danh sach cho den
        
    Node<T> *tmp head;
        while(
    tmp && tmp->info!= _val)
        {
            
    tmp tmp->next;
        }
        
    //lay Node hien tai ra va xu ly

        
    if(tmp)
        {
            
    //nếu là node đầu
            
    if(tmp == head)
            {
                
    tmp->next->prev NULL// cập nhật lại node sau nó có prev là NULL (nó là tmp)
                
    head tmp->next// cập nhật lại head là node sau nó
            
    }
            
    // nếu là node cuối
            
    else 

                if(
    tmp == tail)
                {
                    
    tmp->prev->next NULL;   // cập nhật lại node trước nó có next là null
                    
    tail tmp->prev// cập nhật lại tail là node trước nó
                
    }
            
    //nếu k fải node cuối
                
    else
                {
                    
    tmp->next->prev tmp->prev;  // node trước nó có next trỏ đến node sau nó
                    
    tmp->prev->next tmp->next// node sau nó có prev trỏ đến node trước nó
                
    }
            
    delete tmp;
        }
    }

    int main()
    {
        
    DLL<inta;
        
    a.ChenMotPhanTu(3);
        
    a.ChenMotPhanTu(4);
        
    a.ChenMotPhanTu(5);
        
    a.ChenMotPhanTu(7);
        
    //
        //a.DuyetDanhSach();
        
    a.XoaPhanTu(4);

        
    a.DuyetDanhSach();
        
    getch();
        return 
    0;


  3. #3
    Ngày gia nhập
    04 2008
    Nơi ở
    Số 22 Ngõ 125 Thanh Xuân Hà Nội
    Bài viết
    10

    Xin cảm ơn bạn. Mình mới học CTDL nếu không sự giúp đỡ của bạn chắc phải mất vài ngày. Chúc bạn khỏe và sớm thành công trên con đường lập trình. Thanks so much !

  4. #4
    Ngày gia nhập
    03 2011
    Bài viết
    2

    Bạn quản lý vùng nhớ chưa tốt. mình sửa lại 1 chút trong hàm xóa.
    C++ Code:
    1. template <class T>
    2. void DLL<T>::XoaPhanTu(T _val)
    3. {
    4.     Node<T> *tmp = head;
    5.     while(tmp && tmp->info!= _val)
    6.     {
    7.         tmp = tmp->next;
    8.     }
    9.     if(tmp)
    10.     {
    11.         //if tmp is first
    12.         if(tmp == head)
    13.         {
    14.             head = head->next;
    15.             head->prev = NULL;
    16.             delete tmp;
    17.         }
    18.         else
    19.             if(tmp == tail)
    20.             {
    21.                 tail = tail->prev;
    22.                 tail->next = NULL;
    23.                 delete tmp;
    24.             }
    25.             else
    26.             {
    27.                 tmp->next->prev = tmp->prev;  
    28.                 tmp->prev->next = tmp->next;
    29.                 delete tmp;
    30.             }
    31.         delete tmp;
    32.     }
    33. }

Các đề tài tương tự

  1. xóa 1 phần tử có giá trị x trong danh sách liên kết
    Gửi bởi stingblue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 13-07-2011, 12:54 PM
  2. Sử dụng danh sách liên kết để thêm, xóa phần tử trong mảng
    Gửi bởi pnst_1811 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 18-04-2011, 08:18 PM
  3. Cách viết hàm xóa các phần tử được chỉ định trong danh sách liên kết
    Gửi bởi xmale trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 14
    Bài viết cuối: 29-12-2010, 03:05 PM
  4. Bài tập C Xóa một phần tử trong danh sách liên kết
    Gửi bởi without_you trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 26-04-2010, 10:48 PM
  5. xóa 1 phần tử có khóa k trong danh sách liên kết đơn
    Gửi bởi longhcmus trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 23-04-2010, 09:39 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn