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

Đề tài: Help. Con trỏ và hàm.

  1. #1
    Ngày gia nhập
    05 2012
    Bài viết
    0

    Mặc định Help. Con trỏ và hàm.

    Mình sắp thi cuối kì mà mình vẫn không tài nào xử lí được chỗ này.
    Mình viết một bài về cây đỏ đen. Hàm thêm một phần tử của mình như sau.
    Code:
    void Insert(Element *R,Element *E){
        if (E==NULL) return;
        if (R==NULL)
        {
            R=E;
            Insert_Case1(E);//Dùng để sắp xếp thành cây đỏ đen
        }
        if ((R->Left==NULL)&&(E->Data<R->Data))
            {
                R->Left=E;
                E->Parent=R;
                Insert_Case1(E);
                return;
            }
        if ((R->Right==NULL)&&(E->Data>R->Data))
            {
                R->Right=E;
                E->Parent=R;
                Insert_Case1(E);
                return;
            }
        if (E->Data==R->Data) return;
        if (E->Data<R->Data) Insert(R->Left,E);
        if (E->Data>R->Data) Insert(R->Right,E);
    }
    Hàm main của mình như sau:
    Code:
    int main()
    {
        Element *R;
        R=NULL;
        int select=0;
        do
        {
            Insert(R,CreateNewElement());
            cout<<"0. Exit\n1.Continue\nSelect: "<<endl;
            cin>>select;
        }while (select==1);
        if (R==NULL) cout<<"R vẫn không thay đổi giá trị";
    }
    Trong đó hàm CreateNewElement() mình viết như sau:
    Code:
    Element* CreateNewElement()
    {
        Element *E;
        E=new Element;
        if (E==NULL) return NULL;
        cout<<"Nhap gia tri : ";
        cin>>E->Data;
        E->Color=Red;
        E->Left=E->Right=E->Parent=NULL;
        return E;
    }
    Sau khi chạy chương trình thì con trỏ R của mình luôn giữ giá trị NULL khi thoát khỏi hàm Insert().
    Làm sao để giá trị của con trỏ R trong hàm main cũng thay đổi theo hàm con.

  2. #2
    Ngày gia nhập
    02 2012
    Nơi ở
    Xanhpetecbua-Nga
    Bài viết
    34

    dùng con trỏ cấp 2 void Insert(Element **R,Element *E)

  3. #3
    Ngày gia nhập
    05 2012
    Bài viết
    0

    Sau đây là toàn bộ code của cây đỏ đen mình viết.
    (Chỉ cần để ý cái chỗ màu đỏ).

    Code:
    //Red black tree
    #include <iostream>
    #define Black 0
    #define Red 1
    using namespace std;
    struct Element{
        int Data;
        int Color;
        Element *Parent,*Left,*Right;
    };
    Element *CreateNewElement();
    Element *GrandParent(Element *E);
    Element *Uncle(Element *E);
    void Insert(Element* &R,Element *E);
    void Insert_Case1(Element *E);
    void Insert_Case2(Element *E);
    void Insert_Case3(Element *E);
    void Insert_Case4(Element *E);
    void Insert_Case5(Element *E);
    void Rotate_right(Element *E);
    void Rotate_left(Element *E);
    void LNR(Element *R);
    int main(){
        Element *R=NULL;
        int select=0;
        do
        {
            Insert(R,CreateNewElement());
            cout<<"0. Exit\n1.Continue\nSelect: "<<endl;
            cin>>select;
        }while (select==1);
        LNR(R);
    }
    Element* CreateNewElement(){
        Element *E;
        E=new Element;
        if (E==NULL) return NULL;
        cout<<"Nhap gia tri : ";
        cin>>E->Data;
        E->Color=Red;
        E->Left=E->Right=E->Parent=NULL;
        return E;
    }
    //Grandparent Node
    Element *GrandParent(Element *E){
        if ((E)&&(E->Parent))
         return E->Parent->Parent;
        return NULL;
    }
    //Uncle Node
    Element *Uncle(Element *E){
        if (GrandParent(E)==NULL) return NULL;
        if (GrandParent(E)->Left==E->Parent) return GrandParent(E)->Right;
        return GrandParent(E)->Left;
    }
    //Insertion
    void Insert(Element* &R,Element *E){
        if (E==NULL) return;
        if (R==NULL)
        {
            R=E;
            Insert_Case1(R);
        }
        if ((R->Left==NULL)&&(E->Data<R->Data))
            {
                R->Left=E;
                E->Parent=R;
                Insert_Case1(E);
                return;
            }
        if ((R->Right==NULL)&&(E->Data>R->Data))
            {
                R->Right=E;
                E->Parent=R;
                Insert_Case1(E);
                return;
            }
        if (E->Data==R->Data) return;
        if (E->Data<R->Data) Insert(R->Left,E);
        if (E->Data>R->Data) Insert(R->Right,E);
    }
        //Case 1: The current node E is at the root of the tree
    void Insert_Case1(Element *E){
        if (E->Parent==NULL)
            {
                E->Color=Black;
            }
    
            else Insert_Case2(E);
    }
        //Case 2: The current node's parent P is black
    void Insert_Case2(Element *E){
        if (E->Parent->Color==Black)
            return;
        Insert_Case3(E);
    }
        //Case 3: Both the parent P and the uncle U are red
    void Insert_Case3(Element *E){
        if ((Uncle(E))&&(Uncle(E)->Color==Red))
        {
            E->Parent->Color=Black;
            Uncle(E)->Color=Black;
            GrandParent(E)->Color=Red;
            Insert_Case1(E);
        }
        else Insert_Case4(E);
    }
        //Case 4: The parent P is red but the uncle U is black
    void Insert_Case4(Element *E){
        if ((E==E->Parent->Right)&&(E->Parent==GrandParent(E)->Left)){
            if (GrandParent(E)) cout<<"----------------KHAC NULL---------------";
            Rotate_left(E->Parent);
        }
        else if ((E==E->Parent->Left)&&(E->Parent==GrandParent(E)->Right)){
            Rotate_right(E->Parent);
        }
        Insert_Case5(E);
    }
        /*Case 5: The current node's parent P is red but the uncle U is black.  the current node N is the left child of P, and P is the left child of its parent G or the current node N is the right child of P, and P is the right child of its parent G*/
    void Insert_Case5(Element *E){
        E->Parent->Color=Black;
        GrandParent(E)->Color=Red;
        if (E==E->Parent->Left) Rotate_right(GrandParent(E));
        else Rotate_left(GrandParent(E));
    }
    //Rotation
    void Rotate_right(Element *E){
        E->Parent->Left=E->Right;
        E->Right->Parent=E->Parent;
        E->Right=E->Parent;
        E->Right->Parent=E;
        if (GrandParent(E)==NULL) return;
        if (E->Parent==GrandParent(E)->Left)
            GrandParent(E)->Left=E;
            else GrandParent(E)->Right=E;
    }
    void Rotate_left(Element *E){
        if(E->Parent==NULL) cout<<"--------------NULL----------------";
        E->Parent->Right=E->Left;
        E->Left->Parent=E->Parent;
        E->Left=E->Parent;
        E->Left->Parent=E;
        if (GrandParent(E)==NULL) return;
        if (E->Parent==GrandParent(E)->Left)
            GrandParent(E)->Left=E;
            else GrandParent(E)->Right=E;
    }
    //Traverse Tree
    void LNR(Element *R){
        if (R)
        {
            LNR(R->Left);
            cout<<"   "<<R->Data;
            LNR(R->Right);
        }
    }
    Mình không hiểu tại sao ở ngoài thì nó Khác NULL mà trong hàm nó lại bằng NULL được :(

  4. #4
    Ngày gia nhập
    09 2012
    Bài viết
    1

    bài này ai có hàm delete cho mình xin với!

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